2015-05-04 6 views
6

Я совершенно новичок в Choco и CP, но я делаю небольшую модель для решения проблемы дерева Штейнера, а Choco продолжает заставлять первый узел быть истинным независимо от того, какой график (и это не правильно, я проверил).Choco заставляет переменную к истине, когда она не должна

У меня есть массив es IntVar, который == 1, если ребро находится в решении, или == 0 в противном случае. То же самое для массива vs, который устанавливает вершины. Я использую массив activeEdgeW, чтобы иметь скалярное ограничение, где коэффициенты являются переменными. Тогда у меня есть ограничения на канал, ограничение дерева и ограничение суммы == w. И свести к минимуму w. Довольно просто, но почему-то vs[0] == true всегда, для любого графика.

Моя модель честно довольно просто, я действительно не знаю, где это происходит от:

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); 

Это моя модель, остальная часть программы только данные графа.

Есть ли какие-либо сведения о том, где это происходит? Я попытался поместить узлы в разные порядки в UB, но всегда первый узел настаивает на том, что он находится. Я попытался удалить ограничение канала, и он показал мне, что узел не всегда прав, но край, достигающий его, должен быть, так что это становится правдой. Тем не менее, как вы можете легко видеть, у меня нет ограничений на массив es, который заставил бы край быть истинным.

Спасибо за помощь!

ответ

0

У версии Choco3, которую я использовал, была ошибка. Это было решено в 3.3.0. Используйте этот вариант, если у вас есть такая же проблема :)

0

«Я совершенно новой для Чоко и СР»

В прошлом я был пойман инструментами, которые либо делали или не начиная отсчет с нуля, и я предположил, противоположный случай (количество начинается с одного). Поведение, которое вы описываете, относится к этой категории ошибок, поэтому вы можете проверить, что все это начинается с массивов с нулевым значением.