Gurobi python: ошибка с индексированием var в обратном вызове для ленивого ограничения

Может ли кто-нибудь помочь мне с этой ошибкой:

Когда я использую обратный вызов для добавления ленивых ограничений, я получил следующее сообщение:

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)

person Issouf    schedule 02.08.2017    source источник


Ответы (1)


Спасибо, я нашел решение:

selected = tuplelist((cte[0],cte[1]) for cte in model._vZ if cte[2]==e if  model.cbGetSolution(model._vZ[cte]) > 0.5 and cte[1]!=(Fb1,FT))

"model._vZ" получен из "model.getVars ()", который составляет этот список. Я меняю его на "model._vZ = varZ", который является словарем, а затем применяю оценку "selected"

person Issouf    schedule 03.08.2017