2017-08-02 34 views
0
のコールバックでインデックスVARとの誤差が

は、誰かがこのエラーで私を助けてもらえ:Gurobiパイソン:怠惰な制約

Exception TypeError: 'Var' object does not support indexing in 'gurobipy.callbackstub' ignored

私は怠惰な制約を追加のためのコールバックを使用

が、私はこの次のメッセージを受け取りました。

エラーは「選択済み」を含む行から発生します。私は成功していないコールバックの2つのバージョンをテストしようとします。私はalosがGurobi上でTSPの例を実行しようとしているが、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) 

答えて

0

をおかげで、私は解決策を見つけた:

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"を評価します