В 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 )
>