// // Toolkit constraint encoding // import java.io.*; 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.kernel.solver.variables.integer.IntDomainVar; import choco.kernel.solver.ContradictionException; import choco.cp.solver.search.integer.varselector.StaticVarOrder; public class SR { int n; int[][] rank; // rank[i][j] = k <-> agent_i ranks agent_j as k^th choice (see NOTE 1) int[][] pref; // pref[i][k] = j <-> agent_i has agent_j as k^th choice int[] length; // length of agent's preference list Model model; Solver solver; IntegerVariable[] agent; // domain of ranks, last is unmatched long totalTime, modelTime, solveTime, readTime, modelSize; boolean search; int solutions; // number of matchings int size; // size of matching (pairs) double[][] lambda; // the looseness of constraint between pairs of agents boolean [][] acceptable; // acceptable[i][j] if agents find each other acceptable double pSol; // log of probability that a state is a solution, i.e. all constraints satisfied double N; // log of number of possible states double E; // expected number of solution states double kappa; // constrainedness 1 - log/N double geoMeanP; // geometric mean of probabilities, only counting actual constraints/edges // // NOTE 1: rank[i][j] = k means that agent j is in the kth position of preference list of agent[i] // rank[i][i] = length[i], i.e. the length of the preference list // if (!acceptable[i][j]) then rank[i][j] = 0 // SR(String fname) throws IOException { search = true; totalTime = System.currentTimeMillis(); readTime = System.currentTimeMillis(); read(fname); readTime = System.currentTimeMillis() - readTime; solutions = size = 0; } SR(SMSRInstance inst) { search = true; totalTime = System.currentTimeMillis(); readTime = System.currentTimeMillis(); read(inst); readTime = System.currentTimeMillis() - readTime; solutions = size = 0; } void read(String fname) throws IOException { BufferedReader fin = new BufferedReader(new FileReader(fname)); n = Integer.parseInt(fin.readLine()); pref = new int[n][n]; rank = new int[n][n]; length = new int[n]; lambda = new double[n][n]; acceptable = new boolean[n][n]; for (int i=0;i)inst.pref[i]){ rank[i][j] = k; pref[i][k] = j; k = k + 1; acceptable[i][j] = true; } length[i] = k; rank[i][i] = k; pref[i][k] = i; } calculateKappa(); } void calculateKappa(){ int edges = 0; for (int i=0;i rank[i][j] && rank[j][y] > rank[j][i]; // unstable } // // constraint looseness between agents i and j // // agent[i] AAAAAAAAAAAAAXBBBBBBBBBBZ // agent[j] CCCCCCCYDDDDDDDDDDDDZ // looseness = (A.C + A.D + C.B + 1)/((1+length[i]).(1+length[j])) // where X and Y are marriage and Z is unmatched // double getLambda(int i,int j){ if (!acceptable[i][j]) return 1.0; int A = rank[i][j]; int B = length[i] - rank[i][j]; int C = rank[j][i]; int D = length[j] - rank[j][i]; double lambda = (double)(A*C + A*D + C*B + 1)/(double)((1 + length[i]) * (1 + length[j])); //System.out.println("lambda("+ i +","+ j +") A: "+ A +" B: "+ B +" C: "+ C +" D: "+ D +" lambda: "+ lambda); return lambda; } void displayMatching(){ for (int i=0;i 1) sr.solve(args[1]); else sr.solve("first"); if (args.length > 1 && args[1].equals("count")) sr.shortStats(); else sr.stats(); } }