001 package ifs.dbt;
002
003 import ifs.extension.*;
004 import ifs.heuristics.*;
005 import ifs.model.*;
006 import ifs.solution.*;
007 import ifs.solver.*;
008 import ifs.util.*;
009 import java.util.*;
010
011 /**
012 * Selection of a variable for dynamic backtracking.
013 * <br><br>
014 * <li> Returns null if all variables are assigned.
015 * <li> Checks if there is a varaible with all values marked as nogood (and pick it if there is any).
016 * <li> Returns the first unassigned variable.
017 * <br><br>
018 * This IFS solver variable selection heuristics is to be used only in case of dynamic backtracking and it has no parameters.
019 *
020 *
021 * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
022 * @version 1.0
023 */
024 public class DbtVariableSelection implements VariableSelection {
025 private DbtPropagation iProp = null;
026
027 public DbtVariableSelection(DataProperties properties) {}
028
029 /**
030 * Heuristics initialization
031 *
032 * @see VariableSelection#init(Solver)
033 */
034 public void init(Solver solver) {
035 for (Enumeration i = solver.getExtensions().elements(); i.hasMoreElements();) {
036 Extension extension = (Extension) i.nextElement();
037
038 if (extension instanceof DbtPropagation) {
039 iProp = (DbtPropagation) extension;
040 }
041 }
042 }
043
044 /**
045 * Variable selection
046 *
047 * @see VariableSelection#selectVariable(Solution)
048 */
049 public Variable selectVariable(Solution solution) {
050 if (solution.getModel().unassignedVariables().isEmpty()) {
051 return null;
052 }
053 if (iProp != null) {
054 for (Enumeration i1 = solution.getModel().unassignedVariables().elements(); i1.hasMoreElements();) {
055 Variable variable = (Variable) i1.nextElement();
056
057 if (iProp.goodValues(variable).isEmpty()) {
058 return variable;
059 }
060 }
061 }
062 return (Variable) solution.getModel().unassignedVariables().firstElement();
063 }
064
065 }