У меня есть список переменных и список возможных назначений для каждой переменной, которые добавляются как обычные AddAllowedAssignments (переменные, tuples_list). Это упрощено из моего приложения, у меня есть более жесткие ограничения на это, но это не влияет на мой вопрос здесь.
Пример:
var1, possible values = [1,2,3,4,5]
var2, possible values = [1,3,4,5,6,7]
var3, possible values = [1,2,5,6,7,8,9]
Мне определенно нужны AddAllDifferent (переменные), которые я могу сделать на уровне модели следующим образом:
model.AddAllDifferent([var1,var2,var3])
Но тогда мне также нужны некоторые ограничения, основанные на значениях, исключающих друг друга. Пример:
value [1] excludes values [3,5,6] (1)
value [2] excludes values [5,7,9] (2)
Итак, я продолжаю и создаю AddForbiddenAssignment (переменные, tuples_list) на уровне переменных для каждой пары переменных (я написал ограничения в двух строках, чтобы их было легче понять, но я знаю, что могу добавить их в один оператор):
AddForbiddenAssignment([var1, var2], [(1,3), (1,5), (1,6)]) (1)
AddForbiddenAssignment([var1, var2], [(2,5), (2,7)]) (2)
AddForbiddenAssignment([var1, var3], [(1,5), (1,6)]) (1)
AddForbiddenAssignment([var1, var3], [(2,5), (2,7), (2,9)]) (2)
AddForbiddenAssignment([var2, var3], [(1,5), (1,6)]) (1)
AddForbiddenAssignment([var2, var3], [(2,5), (2,7)]) (2)
Это прекрасно работает.
В настоящее время я не уверен, нужны ли они мне и в другом направлении, но я думаю, что да:
AddForbiddenAssignment([var2, var1], [(1,3), (1,5)]) (1)
AddForbiddenAssignment([var3, var1], [(1,3), (1,5)]) (1)
AddForbiddenAssignment([var3, var1], [(2,5)]) (2)
AddForbiddenAssignment([var3, var2], [(1,3), (1,5), (1,6)]) (1)
AddForbiddenAssignment([var3, var2], [(2,5), (2,7)]) (2)
Как видите, это создает множество ограничений, особенно когда количество переменных увеличивается. Создание всех этих ограничений в настоящее время является довольно плохо выполняемой задачей.
Вопрос: Есть ли способ добавить запрещенные назначения на уровне модели, например AddAllDifferent ()? Я хотел бы использовать что-то вроде AddForbiddenAssignment (hibited_tuples_list), для которого не нужны переменные. Пример:
AddForbiddenAssignment([(1,3), (1,5), (1,6)]) (1)
AddForbiddenAssignment([(2,5), (2,7), (2,9)]) (1)
Другой вариант - иметь AddForbiddenAssignment (значение, список запрещенных_значений)
AddForbiddenAssignment(1, [3, 5, 6]) (1)
AddForbiddenAssignment(2, [5, 7, 9]) (1)
Надеюсь, мой вопрос имеет смысл. Заранее спасибо за помощь.