Умножить переменную решения на используемый в ней индекс

Я пишу модель оптимизации на питоне, которую буду решать с помощью Gurobi. Однако у меня есть одна проблема с одним ограничением. Я хочу умножить переменную решения на индекс j:
x[i,j] * j , с j в качестве index of j, используемого в x[i,j].
i и j моделируются как списки. Переменная решения x[i,j] является двоичной.

я пробовал с

for i in I:
  m.addConstr (x[i,j]*J.index(j))

Но это всегда будет последний элемент списка j. Как сделать так, чтобы ограничение принимало index of j, используемое в x[i,j]?


person Victoria    schedule 15.02.2018    source источник
comment
Непонятно, о чем вы спрашиваете, не могли бы вы привести пример?   -  person nbryans    schedule 15.02.2018
comment
ой извини конечно   -  person Victoria    schedule 15.02.2018
comment
поэтому все мое ограничение в теории формулируется как: x[i,j]*j ‹= M*p[i]+z[i]*u[i]. С этим мягким ограничением (x и z являются двоичными переменными решения) я хочу проверить, меньше ли x[i,j]*j, чем M *p[i], если это не так, z должен получить один. С x[i,j] *j я хочу иметь выражение, которое, например, x[A,B] =1 умножается на индекс B в списке j (например, 2), так что x[i,j] *j =1*2=2. Теперь стало яснее?   -  person Victoria    schedule 15.02.2018


Ответы (1)


если j является целым или непрерывным, вы можете напрямую сделать x[i,j]*j, если нет, ваш код кажется правильным. Я думаю, что вы хотите написать это:

for j in J:
   for i in I:
      m.addConstr(x[i,j]*J.index(j))

or

for i in I:
   m.addConstr(x[i,j]*J.index(j) for j in J)

Можете ли вы дать подробности?

Вы также можете использовать диапазон следующим образом:

for i in I :
   m.add(x[i,J[k]]*k for k in range(len(J))

or

for k in range(len(J)):
   for i in I:
       m.addConstr(x[i,J[k]]*k)
person Issouf    schedule 15.02.2018