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等于,2b必须等于2,否则1)。

我也试过

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顺便说一句,您在第一个约束中要求它,而在第二个约束中测试条件,这有点奇怪a == 2。但我假设你现在处于实验阶段......

于 2012-06-24T17:51:30.137 回答