Как написать ограничение максимизации с помощью gurobipy

Я использую gurobi на python, и я хотел бы решить проблему маршрута, но есть некоторые ограничения, которые я не знаю, как писать, как на картинке:

изображение

Я пробовал несколько способов,

1-я попытка: model.addConstr(a[j,k] == max_((b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M), 0) )

2-я попытка: использовать ограничение индикатора отдельно, как показано ниже

model.addConstr((c == 0) >> (b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M <= -eps) )
model.addConstr((c == 1) >> (b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M >= 0))

3-я попытка: model.addGenConstrMax( a[j,k], [0, b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M] ) запустить код, но не всегда срабатывала.

  • обратите внимание, что M представляет BigM, а eps я установил для 1e-6
  • a [] и b [] - непрерывные переменные, x [] - двоичная переменная, а T_ij [] - параметр

person Ei Shiba    schedule 09.11.2020    source источник
comment
@dejdej Спасибо за редактирование!   -  person Ei Shiba    schedule 09.11.2020
comment
Ответ на этот вопрос уже есть на официальных форумах Gurobi.   -  person mattmilten    schedule 09.11.2020


Ответы (1)


Для полноты скопируйте ответ с форума Гуроби:

Ваша первая попытка была почти успешной. Обратите внимание, что max_() принимает в качестве аргументов только отдельные переменные и константы, а термин (b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M) - это LinExpr. Таким образом, чтобы ваш первый подход работал, вы можете добавить вспомогательные переменные для каждого из терминов как

N = [1,2,3]
V = [4,5,6]

a = m.addVars(N,V,name="a")
b = m.addVars(N,V,name="b")
T_ij = m.addVars(N,N,name="T_")
x = m.addVars(N,N,V,name="x")
aux = m.addVars(N,N,V,name="aux")
M = 10000

for i in N:
  for j in N:
    for k in V:
      m.addConstr(aux[i,j,k] == (b[i,k] + T_ij[i,j] - ( 1-x[i,j,k] )*M))
      m.addConstr(a[j,k] == max_( aux[i,j,k], 0) )

То же самое относится и к вашему третьему подходу, потому что max_() - это просто ярлык для функции addGenConstrMax().

Ваш второй подход должен работать как есть, но я бы рекомендовал использовать одну из функций max.

person mattmilten    schedule 16.11.2020