Ограничение AllDifferent в Pyomo - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь запустить задачу MINLP на Pyomo. Я сформулировал целевую функцию, и одно из моих ограничений таково:

model.c2 = Constraint(expr = sum(model.x[i] for i in blocks) <= 4560)

Я хочу что-то вроде этого:

x + y + z <= 3, где x не равно y not равно z. </p>

Как мне написать ограничение для этого?

1 Ответ

1 голос
/ 27 мая 2020

Ответ немного зависит от деталей (это целые числа переменных, все значения в рассматриваемой области). Вот ссылка, которая может представлять интерес:

Уильямс, Х. Пол и Ян, Хонг (2001), Представления предиката 'all_different' удовлетворения ограничений в целочисленном программировании, Informs Journal on Computing , 13 (2). 96-103.

Определим проблему точнее. Скажем, у нас есть n целые числа, x[i], которые принимают уникальные значения от 1,...,n. Мы можем реализовать это как:

Мы можем ввести двоичные переменные

 y[i,k] = 1 if x[i]=k
          0 otherwise

С этим мы можем написать:

 x[i] = sum(k, k*y[i,k])   (1)
 sum(k, y[i,k]) = 1   ∀i   (2)
 sum(i, y[i,k]) = 1   ∀k   (3)
 y[i,k] ∈ {0,1}  

где i ∈ {1,..,n} и k ∈ {1,..,n} .

Если у вас меньше переменных, чем n, скажем i ∈ {1,..,m} на m < n, тогда нам нужно заменить (3) на:

 sum(i, y[i,k]) ≤ 1   ∀k   (3a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...