Добро пожаловать в 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
достаточно велико.