import static choco.Choco.*; import choco.cp.model.CPModel; import choco.cp.solver.CPSolver; import choco.kernel.model.Model; import choco.kernel.solver.Solver; import choco.kernel.solver.ContradictionException; import choco.kernel.solver.constraints.integer.AbstractLargeIntSConstraint; import choco.kernel.solver.variables.integer.IntDomainVar; import choco.kernel.memory.IStateInt; import choco.kernel.memory.IStateIntVector; import choco.kernel.memory.trailing.StoredInt; import choco.kernel.memory.trailing.StoredIntVector; import choco.kernel.model.variables.integer.IntegerExpressionVariable; import choco.kernel.model.variables.integer.IntegerVariable; import java.util.Stack; // // Clique Cost Constraint // see Fahle ESA2002 // This uses a maintenance technique based on ac4 // An initial colouring is maintained, by downdating // saturations when a vertex is selected and removed from the // candidate set. It is SLOOOOOOOOOOOOOOOOOOOOOOOOW // public class CliqueOptimize extends AbstractLargeIntSConstraint { private IStateInt[] deg; // number of vertices adjacent to v[i] in candidate set, reversible private IStateInt K; // size of current clique, reversible private ReversibleVector P; // set of candidates, reversible private int maxK; // size of largest clique found so far private int n; // number of vertices private int[] solution; // as it says ... private ReversibleVector[] adj; // adjacency list for each vertex private IStateInt[] candidate; // candidate[i] = 1 <-> i \in P private int[][] A; // adjacency matrix private int[] col; // 0 <= col[i] < n, the colour of vertex i private int[] saturation; // number of differently coloured vertices adjacent to vertex i private boolean[][] dom; // domain of colours, dom[i][j] true <-> vertex i can have jth colour private int model; // 1 -> simple, 2 -> Fahle, 3 -> Fahle + Brelaz private MonitorObject monitor; private IStateInt[][] revDom; // reversible domain of colours private IStateInt[] revSatur; // reversible saturation public CliqueOptimize(Solver s,IntDomainVar[] v,IStateInt[] deg,int[] saturation,int[] colour,ReversibleVector candidateSet, int[] solution,int[][] A,int model,MonitorObject monitor) { super(v); n = v.length; this.deg = deg; K = s.getEnvironment().makeInt(0); P = candidateSet; maxK = 0; this.solution = solution; this.adj = adj; this.A = A; this.model = model; this.monitor = monitor; candidate = new IStateInt[n]; adj = new ReversibleVector[n]; col = colour; //new int[n]; this.saturation = saturation; //new int[n]; dom = new boolean[n][n]; revDom = new IStateInt[n][n]; revSatur = new IStateInt[n]; for (int i=0;i 1) for (int i=0;i 0) calcSatur++; //if (calcSatur != revSatur[j].get()) System.out.println("blip4"); saturation[j] = revSatur[j].get(); } } private int getMaxSatur(){ int maxSatur = -1; for (int k=0;k maxSaturation || saturation[i] == maxSaturation && deg[i].get() > maxDegree){ maxSaturation = saturation[i]; maxDegree = deg[i].get(); selected = i; } } return selected; } // // Classic Brelaz // private int selectFirstUncolouredVertex(){ for (int k=0;k -1) maxCol = Math.max(maxCol,colourVertex(uncolouredVertex)); P.remove(uncolouredVertex); uncolouredVertices = uncolouredVertex > -1; } solver.getEnvironment().worldPop(); return maxCol + 1; // because 0 is a valid colour. } private void reject(int i) throws ContradictionException { // delete and reject vertex i //System.out.println("reject("+ i +") "+ vars[i] +" candidate = "+ candidate[i].get()); if (candidate[i].get() == 0) return; if (!vars[i].isInstantiated()) vars[i].setVal(0); deg[i].set(0); P.remove(i); candidate[i].set(0); for (int k=0;k