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

Другие вопросы по тегам