CP-SAT: как использовать AddAllDifferent в оптимизации? - PullRequest
0 голосов
/ 14 февраля 2020

Я бы хотел, чтобы набор переменных имел разные значения, но не строго его соблюдал. То есть это просто сделать:

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 в оптимизации (мне кажется, аналогичная проблема)?

...