Choco заставляет переменную к истине, когда она не должна
Я совершенно новичок в Choco и CP, но я делаю небольшую модель для решения проблемы дерева Штейнера, и Choco продолжает заставлять первый узел быть истинным, каким бы он ни был (и я его проверил).
У меня есть массив es
из IntVar это ==1, если ребро находится в решении, или ==0 в противном случае. То же самое для массива vs
это устанавливает вершины. Я использую массив activeEdgeW
чтобы иметь возможность иметь скалярное ограничение, где коэффициенты являются переменными. Тогда у меня просто есть ограничения по каналированию, ограничение по дереву и ограничение по сумме == 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
это заставило бы край быть правдой вообще.
Спасибо за помощь!
2 ответа
В версии Choco3, которую я использовал, была ошибка. Это было решено в 3.3.0. Пожалуйста, используйте этот, если у вас есть такая же проблема:)
"Я совершенно новичок в Choco и CP"
В прошлом я был пойман инструментами, которые начинали или не начинали считать с нуля, и я предполагал противоположный случай (счет начинается с единицы). Поведение, которое вы описываете, относится к этой категории ошибок, поэтому вы можете убедиться, что все это начинается с массивов, начинающихся с нуля.