net.sf.cpsolver.ifs.extension
Class ConflictStatistics<V extends Variable<V,T>,T extends Value<V,T>>

java.lang.Object
  extended by net.sf.cpsolver.ifs.extension.Extension<V,T>
      extended by net.sf.cpsolver.ifs.extension.ConflictStatistics<V,T>
All Implemented Interfaces:
ConstraintListener<T>, ModelListener<V,T>
Direct Known Subclasses:
StudentConflictStatistics

public class ConflictStatistics<V extends Variable<V,T>,T extends Value<V,T>>
extends Extension<V,T>
implements ConstraintListener<T>

Conflict-based statistics.

The idea behind it is to memorize conflicts and to avoid their potential repetition. When a value v0 is assigned to a variable V0, hard conflicts with previously assigned variables (e.g., V1 = v1, V2 = v2, ... Vm = vm) may occur. These variables V1,...,Vm have to be unassigned before the value v0 is assigned to the variable V0. These unassignments, together with the reason for their unassignment (i.e., the assignment V0 = v0), and a counter tracking how many times such an event occurred in the past, is stored in memory.

Later, if a variable is selected for assignment again, the stored information about repetition of past hard conflicts can be taken into account, e.g., in the value selection heuristics. Assume that the variable V0 is selected for an assignment again (e.g., because it became unassigned as a result of a later assignment), we can weight the number of hard conflicts created in the past for each possible value of this variable. In the above example, the existing assignment V1 = v1 can prohibit the selection of value v0 for variable V0 if there is again a conflict with the assignment V1 = v1.

Conflict-based statistics are a data structure which memorizes the number of hard conflicts that have occurred during the search (e.g., that assignment V0 = v0 resulted c1 times in an unassignment of V1 = v1, c2 times of V2 = v2, . . . and cm times of Vm = vm). More precisely, they form an array

stating that the assignment Va = va caused the unassignment of Vb = vb a total of cab times in the past. Note that in case of n-ary constraints (where n > 2), this does not imply that the assignments Va = va and Vb = vb cannot be used together. The proposed conflict-based statistics do not actually work with any constraint, they only memorize unassignments and the assignment that caused them. Let us consider a variable Va selected by the VariableSelection.selectVariable(Solution) function and a value va selected by ValueSelection.selectValue(Solution, Variable). Once the assignment Vb = vb is selected by Model.conflictValues(Value) to be unassigned, the array cell CBS[Va = va, Vb != vb] is incremented by one.

The data structure is implemented as a hash table, storing information for conflict-based statistics. A counter is maintained for the tuple A = a and B != b. This counter is increased when the value a is assigned to the variable A and b is unassigned from B. The example of this structure expresses that variable B lost its assignment b three times and its assignment c four times, variable C lost its assignment a two times, and D lost its assignment a 120 times, all because of later assignments of value a to variable A. This structure is being used in the value selection heuristics to evaluate existing conflicts with the assigned variables. For example, if there is a variable A selected and if the value a is in conflict with the assignment B = b, we know that a similar problem has already occurred 3x in the past, and hence the conflict A = a is weighted with the number 3.

Then, a min-conflict value selection criterion, which selects a value with the minimal number of conflicts with the existing assignments, can be easily adapted to a weighted min-conflict criterion. The value with the smallest sum of the number of conflicts multiplied by their frequencies is selected. Stated in another way, the weighted min-conflict approach helps the value selection heuristics to select a value that might cause more conflicts than another value, but these conflicts occurred less frequently, and therefore they have a lower weighted sum.

The conflict-based statistics has also implemented the following extensions: Furthermore, the presented conflict-based statistics can be used not only inside the solving mechanism. The constructed "implications" together with the information about frequency of their occurrences can be easily accessed by users or by some add-on deductive engine to identify inconsistencies1 and/or hard parts of the input problem. The user can then modify the input requirements in order to eliminate problems found and let the solver continue the search with this modified input problem.

Parameters:
Parameter Type Comment
ConflictStatistics.Ageing Double Ageing of the conflict-based statistics. Every memorized conflict is aged (multiplited) by this factor for every iteration which passed from the time it was memorized. For instance, if there was a conflict 10 iterations ago, its value is ageing^10 (default is 1.0 -- no ageing).
ConflictStatistics.AgeingHalfTime Integer Another way how to express ageing: number of iterations to decrease a conflict to 1/2 (default is 0 -- no ageing)

Version:
IFS 1.2 (Iterative Forward Search)
Copyright (C) 2006 - 2010 Tomas Muller
muller@unitime.org
http://muller.unitime.org

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not see http://www.gnu.org/licenses/.
See Also:
Solver, Model, ValueSelection, VariableSelection

Constructor Summary
ConflictStatistics(Solver<V,T> solver, DataProperties properties)
           
 
Method Summary
 void constraintAdded(Constraint<V,T> constraint)
          Called when a constraint is added to the model
 void constraintAfterAssigned(long iteration, Constraint<?,T> constraint, T assigned, Set<T> unassigned)
          Increments appropriate counters when there is a value unassigned
 void constraintBeforeAssigned(long iteration, Constraint<?,T> constraint, T assigned, Set<T> unassigned)
          Called by the constraint, before a value is assigned to its variable.
 void constraintRemoved(Constraint<V,T> constraint)
          Called when a constraint is removed from the model
 long countPotentialConflicts(long iteration, T value, int limit)
          Counts potential number of unassignments of if the given value is selected.
 double countRemovals(long iteration, Collection<T> conflictValues, T value)
          Counts number of unassignments of the given conflicting values caused by the assignment of the given value.
 double countRemovals(long iteration, T conflictValue, T value)
          Counts number of unassignments of the given conflicting value caused by the assignment of the given value.
 Map<Assignment<T>,List<Assignment<T>>> getNoGoods()
           
 void register(Model<V,T> model)
          Registration of a model.
 void reset()
           
 String toString()
           
 void unregister(Model<V,T> model)
          Unregistration of a model.
 void variableUnassigned(long iteration, T unassignedValue, T assignedValue)
           
 
Methods inherited from class net.sf.cpsolver.ifs.extension.Extension
afterAssigned, afterUnassigned, beforeAssigned, beforeUnassigned, getModel, getProperties, getSolver, init, isRegistered, useValueExtra, useVariableExtra, variableAdded, variableRemoved
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ConflictStatistics

public ConflictStatistics(Solver<V,T> solver,
                          DataProperties properties)
Method Detail

register

public void register(Model<V,T> model)
Description copied from class: Extension
Registration of a model. This is called by the solver before start.

Overrides:
register in class Extension<V extends Variable<V,T>,T extends Value<V,T>>

unregister

public void unregister(Model<V,T> model)
Description copied from class: Extension
Unregistration of a model. This is called by the solver when extension is removed.

Overrides:
unregister in class Extension<V extends Variable<V,T>,T extends Value<V,T>>

reset

public void reset()

getNoGoods

public Map<Assignment<T>,List<Assignment<T>>> getNoGoods()

variableUnassigned

public void variableUnassigned(long iteration,
                               T unassignedValue,
                               T assignedValue)

countRemovals

public double countRemovals(long iteration,
                            Collection<T> conflictValues,
                            T value)
Counts number of unassignments of the given conflicting values caused by the assignment of the given value.


countRemovals

public double countRemovals(long iteration,
                            T conflictValue,
                            T value)
Counts number of unassignments of the given conflicting value caused by the assignment of the given value.


countPotentialConflicts

public long countPotentialConflicts(long iteration,
                                    T value,
                                    int limit)
Counts potential number of unassignments of if the given value is selected.


toString

public String toString()
Overrides:
toString in class Object

constraintBeforeAssigned

public void constraintBeforeAssigned(long iteration,
                                     Constraint<?,T> constraint,
                                     T assigned,
                                     Set<T> unassigned)
Description copied from interface: ConstraintListener
Called by the constraint, before a value is assigned to its variable.

Specified by:
constraintBeforeAssigned in interface ConstraintListener<T extends Value<V,T>>
Parameters:
iteration - current iteration
constraint - source constraint
assigned - value which will be assigned to its variable ( Value.variable())
unassigned - set of conflicting values which will be unassigned by the constraint before it assigns the given value

constraintAfterAssigned

public void constraintAfterAssigned(long iteration,
                                    Constraint<?,T> constraint,
                                    T assigned,
                                    Set<T> unassigned)
Increments appropriate counters when there is a value unassigned

Specified by:
constraintAfterAssigned in interface ConstraintListener<T extends Value<V,T>>
Parameters:
iteration - current iteration
constraint - source constraint
assigned - value which was assigned to its variable ( Value.variable())
unassigned - set of conflicting values which were unassigned by the constraint before it assigned the given value

constraintAdded

public void constraintAdded(Constraint<V,T> constraint)
Description copied from class: Extension
Called when a constraint is added to the model

Specified by:
constraintAdded in interface ModelListener<V extends Variable<V,T>,T extends Value<V,T>>
Overrides:
constraintAdded in class Extension<V extends Variable<V,T>,T extends Value<V,T>>
Parameters:
constraint - added constraint

constraintRemoved

public void constraintRemoved(Constraint<V,T> constraint)
Description copied from class: Extension
Called when a constraint is removed from the model

Specified by:
constraintRemoved in interface ModelListener<V extends Variable<V,T>,T extends Value<V,T>>
Overrides:
constraintRemoved in class Extension<V extends Variable<V,T>,T extends Value<V,T>>
Parameters:
constraint - removed constraint


Copyright © 2014 UniTime LLC. All Rights Reserved.