Я бы хотел, чтобы набор переменных имел разные значения, но не строго его соблюдал. То есть это просто сделать:
model.AddAllDifferent([var1, var2, var3])
Но как я могу использовать его только в оптимизации и не применять его строго? Способ, который обычно работает, заключается в применении ограничения на основе логической переменной, но тогда мне также понадобится отрицание ограничения:
model.AddAllDifferent([var1, var2, var3]).OnlyEnforceIf(satisfiable)
model.AddSomeSame([var1, var2, var3]).OnlyEnforceIf(satisfiable.Not())
model.Maximize(satisfiable)
(очевидно, я увеличил AddSomeSame
).
Я не знаю, что я мог бы использовать, чтобы отрицать AddAllDifferent
. Построение ограничения для «хотя бы двух переменных имеет одинаковое значение» вручную кажется немного утомительным.
Есть ли разумный подход к этой проблеме? В идеале тот, который можно использовать также для использования AddAllowedAssignments
в оптимизации (мне кажется, аналогичная проблема)?