如何在MS Solver Foundation中使用If运算符?

时间:2012-06-22 20:50:29

标签: c# ms-solver-foundation

这段代码出了什么问题?:

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

我也试过

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

具有相同的结果。

1 个答案:

答案 0 :(得分: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中,这有点奇怪。但我认为你现在处于试验阶段......