Mein Minizinc-Modell funktioniert gut, aber ich muss es in Java-Code konvertieren, also habe ich Choco, um es zu tun. Das Problem, mit dem ich gerade konfrontiert bin, ist der Mechanismus, mit dem Minizinc verschiedene Formen von Choco herstellt. Ich schrieb die Einschränkungen, die ich in Minizinc verwendet habe, genau in Choco, aber es hat nicht funktioniert.Converting MiniZinc-Modell zu Choco-Code
Angenommen:
minizinc Modell ist:
array[sub_set] of var cl_set: cl_id;
constraint alldifferent(cl_id);
constraint forall(i in sub_set) (sub_cap[i] <= cl_cap[cl_id[i]]);
choco Code ist:
cl_id = VF.boundedArray("", sub_sz, 0, cl_sz - 1, solver);
solver.post(ICF.alldifferent(cl_id));
for (int i = 0; i < sub_sz; i++) {
Constraint a = ICF.arithm(VF.fixed(cl_cap[cl_id[i].getValue()], solver), ">=", sub_cap[i]);
solver.post(a);
}
- Die cl_cap ist ein Array von Int.
cl_id[i].getValue()
ist immer 0, weil es die unter der Domäne gebunden wird und die Einschränkung gilt nicht
cl_id Was soll ich tun, um die choco Einschränkung als minizinc die gleiche Art und Weise funktioniert?
Es ist nicht klar, was das MiniZinc-Modell tut, da die Definition von cl_cap nicht gezeigt wird. Aber das Problem scheint zu sein, dass Sie .getValue in einer Einschränkung verwenden, die einen Wert auswählen (hier scheinbar 0). Möglicherweise müssen Sie die Elementeinschränkung (http://choco-solver.org/user_guide/5_elements.html#element) verwenden, um den Wert von cl_cap in der Position cl_id [i] (die eine Entscheidungsvariable ist) zu extrahieren. Diese Art von Einschränkungen sind in MiniZinc einfacher zu definieren. – hakank
Solver Solver = neuer Solver(); int [] a = neuer int [] {30,70,50}; int [] b = neuer int [] {50,30,80}; IntVar [] idx = VF.boundedArray ("", 3, 0, 2, Solver); solver.post (ICF.alldifferent (idx)); für (int i = 0; i <3; i ++) { IntVar x = VF.fixed (b [idx [i] .getValue()], Solver); solver.post (ICF.arithm (x, ">", a [i])); } solver.findSolution(); für (int i = 0; i <3; i ++) { System.out.println (idx [i] .getValue()); } b [idx [i] .getValue()] immer 0, weil noch nicht initialisiert Wie schreibe ich Code, um dies zu tun. –
Nun, die Entscheidungsvariablen werden nicht vor dem Suchteil des Modells initialisiert (oder zugewiesen). Wie bereits erwähnt, sollten Sie die Einschränkung "element" verwenden, um den Wert von idx [i] zu "extrahieren", um den Index in "b" zu erhalten. (MiniZinc hat eine viel bessere Syntax für die Elementeinschränkung, daher könnte es schwierig sein, diesen Schritt in anderen CP-Systemen anzugeben.) Bitte sehen Sie sich das Beispiel auf der Seite an, mit der ich vorher verlinkt habe. – hakank