Как написать это утверждение IF в линейном программировании с Big-M - PullRequest
0 голосов
/ 15 февраля 2020

Я должен определить переменную на основе переменной решения (Var[i]). Это то, что я хочу express:

if var[i] >= 0, b[i] = 1.08; else b[i] = 0.91

Я написал следующее:

var=LpVariable.dicts("Var", df.index, lowBound=-2, upBound=2, cat="Continuous")

b={}
for i in df.index:
    if var[i] >= 0.0:
       b[i] = 1.08
    else:
       b[i] = 0.91

Однако оказалось, что все b[i] были 1.08...; Я искал проблемы и обнаружил, что их следует заменить методом «Big M». Но я до сих пор не могу понять, как это получить.

1 Ответ

1 голос
/ 15 февраля 2020

Есть много способов реализовать это.

Вот способ использования двоичных переменных δ. Для простоты я опускаю здесь индекс i для всех переменных. Сначала предположим, что у нас есть хорошие оценки на x, например, L ≤ x ≤ U (с L <0). Тогда мы можем указать: </p>

 x ≤ -ε + δ M1
 x ≥ -(1-δ) M2
 b = 1.08 δ + 0.91(1-δ)
 δ ∈ {0,1}
 x ∈ [L,U] (with L<0)

, где ε≥0 - маленькая константа (например, ε = 0,0001). На практике я просто использую ε = 0 в этих случаях. (По сути, это позволяет решающему решить, что происходит при x = 0; это означает, что он выберет наиболее выгодный выбор). Константы big-M M1 и M2 могут быть установлены на:

 M1 = ε+U
 M2 = -L 

Более продвинутые системы допускают переменные SOS1. При подходе SOS1 нам больше не нужны большие M-константы или хорошие границы. Прочтите руководство по вашему LP / MIP-солверу или инструменту моделирования, чтобы узнать, поддерживается ли это.

...