С gurobi, как я могу ограничить домен переменной в наборе значений

Вот как я использую addVar для добавления переменной в модель:

my_set[j, t] = self.m.addVar(vtype=GRB.INTEGER, lb=min_value, ub=max_value, name='test')

И это может ограничивать значение только как целое число, находящееся между min_value и max_value, но на самом деле я хотел бы ограничить возможное значение определенным набором целых чисел. Как я могу это сделать?


person Jasonling    schedule 06.09.2015    source источник
comment
Не могли бы вы уточнить, какие наборы целых чисел вы рассматриваете? Тогда было бы проще описать эффективный подход? Откуда берутся эти наборы?   -  person J Fabian Meier    schedule 09.09.2015


Ответы (1)


Я не знаю, возможно ли это напрямую (это невозможно в стандартной ILP, поэтому, возможно, как расширение gurobi), но вы можете добавить некоторые ограничения в свою программу. Предположим, что переменная, которую вы хотите ограничить, равна y, а набор переменных равен Dy = {v1, v 2, ..., v|Dy|}, вы можете добавить следующие xi переменные и ограничения:

  • y = xi для i в 1 ... |Dy|
  • сумма (xi для i в 1 ... |Dy|) = 1
  • xi = 0 или 1
person Holt    schedule 06.09.2015
comment
Спасибо за решение. Но у меня слишком много переменных в моей модели, которые почти ломают память. Поэтому, возможно, я рассмотрю возможность добавления ограничения, чтобы заставить модель получать значение в моем наборе. - person Jasonling; 07.09.2015
comment
@Jasonling Проблема в том, что с такими ограничениями вы нарушаете некоторые правила ILP, поэтому оптимизатор не сможет выполнить оптимизацию, чтобы быстрее найти решение. Если у вас есть только одна переменная с дискретными значениями (и их немного), вы можете попытаться решить ILP для каждого из этих значений и сохранить лучшее решение. Если у вас много таких переменных, вы можете рассмотреть другие подходы, такие как CSP. - person Holt; 07.09.2015