0

[Choco 3.3.3 を使用しています]

IntVar a と int b があります。差を IntVar[] 配列に保存したい d. コードの別のポイントでまったく同じ方法でこれを行ったところ、問題なく機能しましたが、ここでは機能しません。

d = VF.boundedArray("d", num_ts, -20, 20, solver);
for(int t=0; t < num_ts; t++){
    IntVar a = VF.bounded("a", 0, 10, solver);
    solver.post(ICF.sum(aa[t], a)); //values are [2,2,2,1,2,2]
    int b = bb[t][j]; //values are [2,3,2,2,2,2]
    IntVar c = VF.offset(a, -b);
    ...//see below
}

c (d[t] = c;) だけを使用すると、d の値を出力したときの結果は [0, -1, 0, -1, 0, 0] になりますが、その絶対値が必要なので、 [0,1,0,1,0,0]

これらは私が試したさまざまなこととdの結果です:

d[t] = VF.abs(c); //result [0,0,0,0,0,0]
solver.post(ICF.times(c, -1, d[t])); //result [-7,-6,-7,-7,-7,-7]
solver.post(ICF.sum(new IntVar[]{VF.minus(a), VF.fixed(b, solver)}, d[t])); //result [-7,-6,-7,-7,-7,-7]
solver.post(ICF.arithm(a, "+", d[t], "=", b)); //result [-7,-6,-7,-7,-7,-7]
solver.post(ICF.distance(VF.fixed(b, solver), a, "=", d[t])); //result [-20, -20, -20, -20, -20, -20]

誰が私が間違っているのか教えてもらえますか? [-7,-6,-7,-7,-7,-7] がどこから来ているのか特に困惑しています...

4

1 に答える 1

0

あなたが何をしたいのか、あなたが実際に何を試みたのかを理解できたかどうかはわかりませんが、モデルを「解決」しなかった(または少なくとも制約を伝播しなかった)と思います。javadoc に示されているように、 variable.getValue() は、変数がインスタンス化されていない場合に LOWER BOUND を返します (-ea を JVM 引数に渡すと例外がスローされます)。したがって、-ea を追加し、変数値を要求する前に必ず solver.findSolution() を呼び出して、それが機能するかどうかを確認してください。そうでない場合は、問題を再現できるように実行可能コードを送信してください。それはあなたの問題を解決しましたか?

ジャン・ギヨーム、https://www.cosling.com/

于 2016-03-04T19:34:33.263 に答える