Построить ограничение MILP из операторов if-else - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно построить ограничение MILP (Смешанное целочисленное линейное программирование) из этого оператора if-else: с бета - это константа.

if (a > b) then c = beta else c = 0

Как я могу построить оператор с ограничением MILP. Существуют ли методы для решения этой проблемы. Спасибо.

1 Ответ

1 голос
/ 29 апреля 2019

Я предполагаю, что a, b и c являются здесь всеми переменными решения. Чтобы построить ваше ограничение, вам нужно добавить новую двоичную переменную - назовем ее x - которая будет равна 1, если a > b, и 0 в противном случае. Вам также нужна большая константа M. Затем добавьте следующие ограничения:

Mx >= a - b
M(1-x) >= b - a
x in {0,1}

Логика такова: если a > b, то x должно равняться 1 по первому ограничению (а x может равняться 1 по второму ограничению). Если b > a, то 1-x должно равняться 1 по второму ограничению, то есть x должно равняться 0 (а x может равняться 0 по первому ограничению).

Далее нам нужно ограничение, которое говорит, что если x = 1, то c = beta, иначе c = 0:

c = beta * x

Примечание : Приведенная выше логика позволяет c равняться либо 0, либо бете, если a = b; решатель решит. Вам нужно c равным 0, если a = b?

Еще одно примечание : В формулировках типа "big- M", подобных этой, всегда лучше сохранять M как можно меньшим, сохраняя при этом действительность ограничений. В этом случае это означает установку M на максимально возможную (или вероятную) разницу между a и b. Если ваша модель небольшая, это не будет иметь большого значения, но если у вас много этих переменных решения, то это может иметь большое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...