1

このコードの何が問題になっていますか?:

SolverContext sc = SolverContext.GetContext();
Model m = sc.CreateModel();

m.AddDecision(new Decision(Domain.IntegerNonnegative, "a"));
m.AddDecision(new Decision(Domain.IntegerNonnegative, "b"));

m.AddConstraint(null, "a < 2");
m.AddConstraint(null, "b == If[a == 2, 2, 1]");

var sol = sc.Solve();
Console.WriteLine(sol.GetReport());

ソルバーがフリーズし、結果が得られません。オペレーターがどのように機能するかを試してIfいますが、期待どおりの動作をしていないようです。私がそれを正しい方法で使用しているかどうかはわかりません(私は、等しい場合は等しくなければならない、そうでない場合はそう言いたいと思ってaいます)。2b21

私も試しました

m.AddConstraint(null, "If[a == 2, b == 2, b == 1]");

同じ結果で。

4

1 に答える 1

2

この問題に適用されるソルバーは、Decisionドメインの範囲によって妨げられているようです。たとえば、ドメインを整数範囲 [0, 10] に制限する場合:

m.AddDecision(new Decision(Domain.IntegerRange(0, 10), "a"));
m.AddDecision(new Decision(Domain.IntegerRange(0, 10), "b"));

問題に対する実行可能な解決策がかなり迅速に生成されます。つまり、制約b == If[a == 2, 2, 1]は完全に有効です。

ところで、最初の制約でそれが必要でa < 2あり、2番目の制約で条件をテストするのは少し奇妙ですa == 2。しかし、あなたは今実験段階にいると思います...

于 2012-06-24T17:51:30.137 に答える