2016-04-20 15 views
1

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?

+1

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

+0

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. –

+1

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

Antwort

2

Wie Hakank sagte, benötigen Sie die Element-Constraint von Choco Solver. Die Syntax ist: element(IntVar VALUE, int[] TABLE, IntVar INDEX), was bedeutet, VALUE = TABLE[INDEX]

So gibt es so etwas wie:

for (int i = 0; i < sub_sz; i++) { 

    solver.post(ICF.element(VF.bounded(sub_cap[i], cl_sz - 1, solver), cl_cap, cl_id[i])); 
} 

Sie nicht getValue(), weil zu diesem Zeitpunkt verwenden können, ist das Problem noch nicht gelöst (getValue() löst eine Ausnahme aus, wenn -ea wird an die JVM-Argumente übergeben oder gibt die aktuelle Variable LOWER BOUND zurück, weshalb Sie eine 0 erhalten.