Java 当变量不应为';T
我对Choco和CP完全陌生,但我正在制作一个小模型来解决Steiner树问题,Choco不断地强制第一个节点为真,不管图是什么(我检查了它是否正确) 我有一个IntVar的数组Java 当变量不应为';T,java,constraint-programming,choco,Java,Constraint Programming,Choco,我对Choco和CP完全陌生,但我正在制作一个小模型来解决Steiner树问题,Choco不断地强制第一个节点为真,不管图是什么(我检查了它是否正确) 我有一个IntVar的数组es,如果边在解决方案中,则为==1,否则为==0。设置顶点的数组vs也是如此。 我使用数组activeEdgeW能够在系数可变的情况下具有标量约束。 然后我有通道约束,树约束和sum==w约束。并最小化w。非常简单,但出于某种原因,对于任何图形,都是vs[0]==true 老实说,我的模型非常简单,我真的不知道这是从哪
es
,如果边在解决方案中,则为==1,否则为==0。设置顶点的数组vs
也是如此。
我使用数组activeEdgeW
能够在系数可变的情况下具有标量约束。
然后我有通道约束,树约束和sum==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);
s=新解算器(“解算器”);
vs=VF.boolArray(“vs”,nbV,s);
es=VF.boolArray(“es”,nbE,s);
w=VF.整数(“w”,0,maxW,s);
IntVar[]activeEdgeW=新的IntVar[nbE];
对于(int i=0;ioutput());
s、 findOptimalSolution(ResolutionPolicy.MINIMIZE,w);
这是我的模型,程序的其余部分只是图形数据
有人知道这是怎么回事吗?我试着将节点按不同的顺序放入UB
,但第一个节点始终坚持在。
我试图移除通道约束,它告诉我节点并不总是真的,但到达它的边必须是真的,所以它变成了真的。然而,正如您很容易看到的,我对数组es
没有任何约束,这将强制边缘为真
谢谢你的帮助
“我对Choco和CP完全陌生”
在过去,我被一些工具抓住,它们要么开始计数,要么不开始计数,我假设相反的情况(计数从一开始)。您描述的行为属于这类错误,因此您可以验证所有这些都是从零基数组开始的。我使用的Choco3版本有一个错误。它是在3.3.0中解决的。如果您有相同的问题,请使用该问题:)