Как пользоваться оператором If в 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 ответ
Кажется, что решатель, который применяется к этой проблеме, затруднен масштабом 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
, Но я предполагаю, что вы сейчас находитесь в фазе экспериментов...