import choco.kernel.solver.search.integer.AbstractIntVarSelector; import choco.kernel.solver.variables.integer.IntDomainVar; import choco.kernel.solver.variables.AbstractVar; import choco.kernel.memory.IStateInt; public class MagicHeuristic extends AbstractIntVarSelector { private IntDomainVar[] vars; // 0/1 decision variables private int n; // number of decision variables private IStateInt[] deg; // number of vertices adjacent to v[i] in candidate set, reversible private int[] saturation; // colouring of v[i] in candidate set private ReversibleSortedArray candidateSet; // the uninstantiated variables public MagicHeuristic(IntDomainVar[] vars,IStateInt[] deg,int[] saturation,ReversibleSortedArray candidateSet){ this.vars = vars; n = vars.length; this.saturation = saturation; this.deg = deg; this.candidateSet = candidateSet; } public IntDomainVar selectIntVar(){ int maxSaturation = Integer.MIN_VALUE; int minDeg = Integer.MAX_VALUE; IntDomainVar magicVar = null; int i = 0; for (int k=0;k maxSaturation ||saturation[i] == maxSaturation && deg[i].get() < minDeg){ magicVar = vars[i]; maxSaturation = saturation[i]; minDeg = deg[i].get(); } } return magicVar; } // // select the uninstantiated variable with maximum saturation and min degree // we expect this will behave as max colour // }