Как добавить ограничения индикатора в Pulp Python? - PullRequest
0 голосов
/ 27 февраля 2019

У меня проблема в том, что я не знаю, как добавить ограничения индикатора в pulp.Кто-нибудь может мне помочь?
Например: у меня есть переменная решения x[(i,j)], LpBinary и непрерывная переменная u[i] Когда x[(i,j)] равно 1, тогда u[i] + q[j] == u[j] (q - это просто требованиеклиенты) Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 06 марта 2019

Добро пожаловать в SO!

Моя интерпретация вашего вопроса заключается в том, что у вас есть двоичные переменные x[(i,j)] и непрерывные переменные u[i].Когда x[(i,j)]==1, вы хотите применить ограничение следующим образом u[i] + q[j] == u[j].Если x[(i,j)]==0, то такое ограничение не применяется.

Это можно сделать следующим образом:

for i in set_I:
    for j in set_J:
        u[j] >= u[i] + q[j] - (1 - x[(i,j)])*M
        u[j] <= u[i] + q[j] + (1 - x[(i,j)])*M

Где M - это значение, немного превышающее максимально возможный диапазонв u[i] значениях + максимально возможное значение q[j].Чтобы понять, почему это работает, рассмотрим два случая: во-первых, если x[(i,j)]==1, то эти ограничения становятся:

    u[j] >= u[i] + q[j]
    u[j] <= u[i] + q[j]

, которые могут быть сокращены как: u[j] == u[i] + q[j], ограничение, которое вы хотите в случае x[(i,j)]==1.

В случае x[(i,j)]==0 эти ограничения становятся следующими:

    u[j] >= u[i] + q[j] - M
    u[j] <= u[i] + q[j] + M

Напомним, что M - это большое число, мы говорим u[j] >= some_value - large_number, что при условии, что вы выбрали M, такчто его достаточно большой не будет иметь никакого эффекта вообще (как требуется).Аналогично, ограничение u[j] <= some_value + large_number не действует, если M достаточно велико.

...