Java 当变量不应为';T

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 老实说,我的模型非常简单,我真的不知道这是从哪

我对Choco和CP完全陌生,但我正在制作一个小模型来解决Steiner树问题,Choco不断地强制第一个节点为真,不管图是什么(我检查了它是否正确)

我有一个IntVar的数组
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中解决的。如果您有相同的问题,请使用该问题:)