Gurobi: Использование addConstrs (), но выражение неверно - PullRequest
0 голосов
/ 10 октября 2019

Я новичок в Gurobi и Python. Я пытаюсь решить простую смешанную двоичную проблему, но есть некоторые ошибки.

Я определил проблему следующим образом:

Я хочу переменную u [1,1], u [2,1], u [3,1] и u [1,2],u [2,2], u [3,2], сходство с переменной p. Я хочу добавить вышеуказанные ограничения, но есть некоторые ошибки, говорящие о том, что мои выражения неверны.

u=m.addVars([1, 2, 3], [1, 2], vtype=GRB.BINARY)
p=m.addVars(3,2,lb=0.0)

m.addConstrs(p[i,j]<= 30*u[i,j]
            for i in range(3)
            for j in range(2))
m.addConstrs(p[(i,j)]>=5*u[(i,j)]
            for i in range(3)
            for j in range(2))

Ошибка такая:

line 14, in <module>
    for i in range(3)
  File "model.pxi", line 3062, in gurobipy.Model.addConstrs
  File "/Users/Documents/pyexercise/HW4Q1.py", line 15, in <genexpr>
    for j in range(2))
KeyError: (0, 0)

Может кто-нибудь помочь мне с этим? Спасибо!

1 Ответ

1 голос
/ 10 октября 2019

В Python использование range(n) возвращает список n чисел от 0 до n-1. Таким образом, ваши addConstrs() функции перебирают ключи (0,0), (0,1), (1,0), (1,1), (2,0) и (2,1).

Однако переменные uиндексируется (1,1), (1,2), (2,1), (2,2), (3,1) и (3,2):

gurobi> u = m.addVars([1, 2, 3], [1, 2], vtype=GRB.BINARY)
gurobi> u.keys()
<gurobi.tuplelist (6 tuples, 2 values each):
 ( 1 , 1 )
 ( 1 , 2 )
 ( 2 , 1 )
 ( 2 , 2 )
 ( 3 , 1 )
 ( 3 , 2 )
>

Вы получаете KeyError, поскольку индексы ограничений несоответствовать индексам переменных. Чтобы это исправить, вы можете изменить конструкцию переменных u, чтобы она соответствовала конструкции переменных p:

gurobi> u = m.addVars(3, 2, vtype=GRB.BINARY)
gurobi> u.keys()
<gurobi.tuplelist (6 tuples, 2 values each):
 ( 0 , 0 )
 ( 0 , 1 )
 ( 1 , 0 )
 ( 1 , 1 )
 ( 2 , 0 )
 ( 2 , 1 )
>
...