Choco заставляет переменную принимать значение true, когда она не должна

Я совершенно новичок в Choco и CP, но я делаю небольшую модель для решения проблемы дерева Штейнера, и 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, которые заставили бы ребро быть истинным.

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


person excalibur1491    schedule 04.05.2015    source источник


Ответы (2)


"Я совершенно новичок в Choco и CP"

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

person Michael Blankenship    schedule 24.05.2015

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

person excalibur1491    schedule 26.07.2015