Перевернутое ограничение индикатора в гуробипы - PullRequest
0 голосов
/ 16 мая 2018

Я новичок в гуробипе.Я хотел бы добавить инвертированное ограничение индикатора.

Ограничение индикатора - это не что иное, как зависимость от двоичной переменной, которую ограничение содержит или не держит.В gurobipy это записывается как

model.addConstr((x == 1) >> (y + z <= 5))

, где x - двоичная переменная, y и z - целочисленные переменные.Это утверждение говорит о том, что если x истинно, то выполняется ограничение y + z <= 5. </p>

Но я бы хотел иметь такое инвертированное ограничение.Если y + z <= 5, то x == 1. Но gurobi не позволяет lhs-части утверждения быть неравенством.Это может быть только двоичная переменная, равная константе (0 или 1). </p>

Таким образом, инвертированное выражение выдает ошибку.

model.addConstr((y + z <= 5) >> (x == 1))

Любые идеи, как переписать такое условное ограничение вgurobipy?! * * 1013

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Синтаксис индикатора:

binary expression >> linear constraint

Таким образом, ваше ограничение недопустимо.Вам нужна другая модель, которая вынуждает x к 1, когда y + z ≤ 5. Предполагая, что y, z - неотрицательные целые числа, попробуйте 6x + y + z ≥ 6.

0 голосов
/ 14 августа 2019

Я думаю, что лучший способ пойти с этим - использовать подход Big-M Давайте пересмотрим проблему, которую вы пытаетесь смоделировать

If y+z <= 5 then x == 1

Это эквивалентно if y+z-5 <= 0 then x==1 Отсюда нам нужна логика, которая будет включать и выключать переменную x в зависимости от условия на y+z-5

y + z - 5 <= M(1-x)

сделает свое дело. Обратите внимание, что x должен быть равен 1, чтобы отношение сохранялось, если y+z-5 <= 0, что мы и хотим. Аналогично, x будет отключен (установлен в 0), если y+z-5 >= 0

Надеюсь, это поможет

0 голосов
/ 16 мая 2018

Значение

y+z ≤ 5  ⇒  x = 1

может быть переписано как:

x = 0  ⇒  y+z ≥ 6

Это может быть непосредственно реализовано как ограничение индикатора.


Это основанона логику высказываний.Это называется транспонированием:

A ⇒ B
⇔
not B ⇒ not A 

Так что в теории мы имеем

y+z ≤ 5  ⇒  x = 1
⇔
x = 0  ⇒  y+z > 5

Если x и y являются целыми числами, мы можем сказать x = 0 ⇒ y+z ≥ 6 Если они являются непрерывными переменными, вы могли бы сделать: x = 0 ⇒ y+z ≥ 5.0001 (на практике я бы сделал: x = 0 ⇒ y+z ≥ 5 и держал бы вещи двусмысленными на y+z = 5).

Это своего рода стандартный прием при использовании ограничений индикатора.Кажется, не все знают или ценят это.

...