Ich bin völlig neu in Choco und CP, aber ich mache ein kleines Modell, um das Steiner-Baum-Problem zu lösen, und Choco zwingt den ersten Knoten, unabhängig vom Graphen wahr zu sein ist (und es ist nicht korrekt, habe ich überprüft).Choco erzwingt eine Variable auf True, wenn es nicht sollte
Ich habe ein Array es
von IntVar, dass == 1 wenn die Kante in der Lösung ist, oder == 0 andernfalls. Gleiches für das Array vs
, das Vertices setzt. Ich verwende das Array activeEdgeW
, um eine skalare Abhängigkeit zu haben, bei der die Koeffizienten variabel sind. Dann habe ich nur die Channeling-Constraints, die Tree-Constraint und die Summe == w Constraint. Und minimieren Sie w. Ziemlich einfach, aber aus irgendeinem Grund vs[0] == true
immer, für jedes Diagramm.
Mein Modell ist ehrlich ziemlich einfach, ich weiß wirklich nicht, woher das kommt:
s = new Solver("Solver");
vs = VF.boolArray("vs", nbV, s);
es = VF.boolArray("es", nbE, s);
w = VF.integer("w", 0, maxW, s);
IntVar[] activeEdgeW = new IntVar[nbE];
for(int i = 0; i < nbE; i++) {
activeEdgeW[i] = VF.enumerated("activeEdgeW["+i+"]", new int[]{0,ws[i]}, s); //Weight is either 0 or ws[i]
ICF.arithm(activeEdgeW[i], "=", ws[i]).reifyWith(es[i]); //weight of edge is ws[i] if edge is in, 0 otherwise
}
UndirectedGraph UB = new UndirectedGraph(s, nbV, SetType.BITSET, false);
UndirectedGraph LB = new UndirectedGraph(s, nbV, SetType.BITSET, false);
//Building upper bound graph: has all nodes and edges
for (int i = 0; i < nbV; i++){
UB.addNode(i);
}
for (int i = 0; i < nbE; i++){
UB.addEdge(endnodes[i][0], endnodes[i][1]);
}
//Building lower bound graph. Must contain Steiner nodes
for (int i = 0; i < nbT; i++) {
LB.addNode(terminals[i]);
}
g = GraphVarFactory.undirected_graph_var("Solution", LB, UB, s);
s.post(GCF.tree(g));
s.post(ICF.sum(activeEdgeW, w));
s.post(GCF.nodes_channeling(g, vs));
for (int i = 0; i < nbE; i++) {
s.post(GCF.edge_channeling(g, es[i], endnodes[i][0], endnodes[i][1]));
}
s.plugMonitor((IMonitorSolution)() -> output());
s.findOptimalSolution(ResolutionPolicy.MINIMIZE, w);
Das ist mein Modell ist, ist der Rest des Programms nur die Diagrammdaten.
Hat jemand eine Ahnung, wo das hinkommt? Ich habe versucht, die Knoten in verschiedenen Ordnungen in UB
setzen, aber immer der erste Knoten besteht darauf, in. Ich habe versucht, die Channeling-Einschränkung zu entfernen, und es zeigte mir, dass der Knoten nicht immer wahr ist, aber eine Kante erreicht es muss sein, so wird es wahr. Wie Sie jedoch leicht sehen können, habe ich keine Einschränkungen für das Array es
, das eine Kante zwingen würde, wahr zu sein.
Danke für die Hilfe!