2015-05-04 11 views
6

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!

Antwort

0

Die Version von Choco3, die ich benutzte, hatte einen Fehler. Es wurde in 3.3.0 gelöst. Bitte benutzen Sie diese, wenn Sie das gleiche Problem haben :)

0

„Ich bin völlig neu für Choco und CP“

In der Vergangenheit habe ich von Tools gefangen habe, die entweder hat oder beginnen nicht bei Null an zu zählen und ich nahm an den entgegengesetzten Fall (count beginnt um eins). Das Verhalten, das Sie beschreiben, fällt in diese Fehlerkategorie, sodass Sie überprüfen können, ob dies alles mit nullbasierten Arrays beginnt.