// // Mike's model with the tree rooted at v_30 // This permits simpler code for symmetry breaking between clusters // import java.util.*; 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.model.variables.integer.IntegerVariable; import choco.cp.solver.search.integer.varselector.StaticVarOrder; import choco.cp.solver.search.integer.valiterator.DecreasingDomain; import choco.kernel.solver.variables.integer.IntDomainVar; import choco.kernel.solver.ContradictionException; public class Extremal31a { int n; // number of vertices int e; // number of edges IntegerVariable [][] A; // A[i][j] = 1 <-> adjacent(i,j); IntegerVariable [] flatA; // A[][] flattened IntegerVariable [] instOrd; // instantiation order IntegerVariable [] degree; // the degree of a vertex CPModel model; CPSolver solver; Extremal31a(int e,int d, int D){ System.out.println(d +" "+ D); this.n = 31; this.e = e; A = new IntegerVariable[n][n]; // A[i][j] == 1 <-> adjacent(i,j); flatA = new IntegerVariable[n*(n-1)/2]; instOrd = new IntegerVariable[n*(n-1)/2]; degree = makeIntVarArray("deg",n,d,D); for (int i=0;ii;j--,k++) instOrd[k] = A[i][j]; model = new CPModel(); solver = new CPSolver(); } void edge(int i,int j){A[i][j] = A[j][i] = constant(1);} void noEdge(int i,int j){A[i][j] = A[j][i] = constant(0);} void makeStar_6_4(){ for (int j=24;j<=29;j++) edge(30,j); for (int j=0;j<4;j++){ edge(24,j+0); edge(25,j+4); edge(26,j+8); edge(27,j+12); edge(28,j+16); edge(29,j+20); } } void edgeSum(){model.addConstraint(geq(sum(flatA),e));} void degreeConstraints(){ for (int i=0;i