import static choco.Choco.*; import choco.cp.model.CPModel; import choco.cp.solver.CPSolver; import choco.kernel.model.Model; import choco.cp.solver.search.integer.varselector.*; import choco.cp.solver.search.integer.valselector.*; import choco.kernel.solver.Solver; import choco.kernel.model.variables.integer.IntegerVariable; import java.io.*; import java.util.*; public class KE5 { IntegerVariable value; // the value of the solution, maximise IntegerVariable A[][]; // adjacency matrix IntegerVariable next[]; // single successor IntegerVariable flatA[]; // A[][] flattened int w[][]; // weight int edge[][]; // inputted adjacency matrix (edges may have 0 weight) int deg[]; // degree of i int flatW[]; // w[][] flattened int flatE[]; // edge[][] flattened Model modl; Solver sol; int n,sumW,maxDonors; public KE5(int n,String fname) throws Exception { MyIo fin = new MyIo(fname); A = new IntegerVariable[n][n]; flatA = new IntegerVariable[n*n]; next = new IntegerVariable[n]; w = new int[n][n]; edge = new int[n][n]; deg = new int[n]; flatW = new int[n*n]; flatE = new int[n*n]; modl = new CPModel(); sol = new CPSolver(); this.n = n; maxDonors = 0; for (int i=0;i 0){ next[i] = makeIntVar("next[" + i + "]",0,n-1,"cp:enum"); for (int j=0;j 0) maxDonors++; for (int j=0;j 0) sol.setNodeLimit(nds);} public void stats(){ sol.printRuntimeSatistics(); System.out.println("nbSol: " + sol.getNbSolutions()); } public void showData(){ for (int i=0;i "+ (j+1) +" = "+ w[i][j] + "\n"; } } s = s +"\ndonations: "+ donations +" score: "+ score; s = s +"\n"+ sol.getVar(value).pretty(); return s; } public Boolean solve(){return sol.solve(false);} public Boolean maximize(){return sol.maximize(sol.getVar(value),false);} public void init(String costFunction){ edge(); cost(costFunction); modl.addConstraint(allDifferent(next)); sol.read(modl); sol.post(new LegalCycles(sol,sol.getVar(next))); //sol.setVarIntSelector(new StaticVarOrder(sol.getVar(next))); sol.setVarIntSelector(new MinDomain(sol,sol.getVar(next))); //sol.setVarIntSelector(new DomOverWDeg(sol,sol.getVar(next))); //sol.setVarIntSelector(new RandomIntVarSelector(sol,sol.getVar(next),(long)9821735)); //sol.setValIntSelector(new RandomIntValSelector()); } public static void main(String[] args) throws Exception { int n = Integer.parseInt(args[0]); // number of vertices KE5 ke = new KE5(n,args[1]); int nodeLimit = Integer.parseInt(args[2]); String costFunction = args[3]; ke.init(costFunction); ke.setNodeLimit(nodeLimit); ke.maximize(); //System.out.println(ke.solve()); System.out.println(ke); ke.stats(); } }