Может ли кто-нибудь помочь мне с этой ошибкой:
Когда я использую обратный вызов для добавления ленивых ограничений, я получил следующее сообщение:
Exception TypeError: 'Var' object does not support indexing in 'gurobipy.callbackstub' ignored
.
Ошибка исходит из строки, в которой написано «выбрано». Я безуспешно пытаюсь протестировать 2 версии обратного вызова. У меня есть все попытки запустить пример TSP на Gurobi, но model._vars.keys () не работает. Я использую Gurobi 6.5.2 и Python 2.7. Распечатать model._vZ дать:
[<gurobi.Var vZ_j((9, 6, 6), 3)_i((4, 7, 6), 3)_e(3, 'P2')>, <gurobi.Var vZ_j((9, 6, 6), 3)_i((4, 7, 6), 3)_e(3, 'P3')>, <gurobi.Var vZ_j((9, 6, 6), 3)_i((4, 7, 6), 3)_e(3, 'P4')>, <gurobi.Var vZ_j((9, 6, 6), 3)_i((4, 7, 6), 3)_e(3, 'P5')>, <gurobi.Var vZ_j((3, 8, 6), 2)_i((10, 7, 5), 3)_e(3, 'P1')>, <gurobi.Var vZ_j((3, 8, 6), 2)_i((10, 7, 5), 3)_e(3, 'P2')>, <gurobi.Var vZ_j((3, 8, 6), 2)_i((10, 7, 5), 3)_e(3, 'P3')>, <gurobi.Var vZ_j((3, 8, 6), 2)_i((10, 7, 5), 3)_e(3, 'P4')>, <gurobi.Var vZ_j((3, 8, 6), 2)_i((10, 7, 5), 3)_e(3, 'P5')>, <gurobi.Var vZ_j((10, 10, 6), 3)_i((4, 7, 6), 3)_e(3, 'P1')>, <gurobi.Var vZ_j((10, 10, 6), 3)_i((4, 7, 6), 3)_e(3, 'P2')>, <gurobi.Var vZ_j((10, 10, 6), 3)_i((4, 7, 6), 3)_e(3, 'P3')>, <gurobi.Var vZ_j((10, 10, 6), 3)_i((4, 7, 6), 3)_e(3, 'P4')>, <gurobi.Var vZ_j((10, 10, 6), 3)_i((4, 7, 6), 3)_e(3, 'P5')>]
[, , , , , , , , , , , , , ]
Спасибо
def subtourelim(model, where):
if where == GRB.Callback.MIPSOL:
vZs = model.cbGetSolution(model._vZ)
vXs = model.cbGetSolution(model._vX)
opeqp= model._OpEqP
nz=model._nz
for e in opeqp:
selected = [(model._vZ[i][0],model._vZ[i][1]) for i in range(nz) if model._vZ[i][2]==e and model._vZ[i][1]!=(b1,T)]
bti=b0
chaine_primo=[]
while True:
bti=[bt for bt in BlocsEPT if vZs[bti,bt,e]>0.5][0]
if bit!=(b1,T):
chaine_primo.append(bti)
else:
break
unvisit=[bt for bt in Blocs_EP if vXs[bt,e]>0.5 and bt not in chaine_primo]
if len(unvisit)>0:
tour = subtour(selected,unvisit,chaine_primo,Blocs_EP)
ArcsTour=[(bt0,bt1) for bt in tour for bt1 in tour if (bt0,bt1) in CBloc_T and vZs[bt0,bt1,e]>0.5]
model.cbLazy(quicksum(model._vZ[ct[0],ct[1],e] for ct in ArcsTour) <= len(tour)-1)