2017-02-14 6 views
0

コールバックを使ってリニアリラクゼーションの解を回復しようとするMIPがありますが、できません。私はMIPのリニアリラクゼーションの直後に変数Zを抽出するために以下のコードを使用します。Python Gurobi:MIPの線形アルゴリズムの解を取得します

# Definition de la fonction callback 
def mycallback(model, where): 
    if where == GRB.Callback.MIPNODE: 
     if model.cbGet(GRB.Callback.MIPNODE_STATUS) == GRB.Status.OPTIMAL: 
      sol_Z=model.cbGetNodeRel(model.getAttr('x', vZ)) 
      FTe=range(1,FT+1) 
      for cb in FCBloc: 
       for e in FOpEq: 
        for t in FTe: 
         Bl_ZDonnees.update({(cb,e,t):sol_Z[cb[0],cb[1],t,e]}) 
      NomFichier="M_1_Relax.csv" 
      fichier = open(NomFichier, 'w') 
      cw = csv.writer(fichier, delimiter=';') 
      for bl1 in Bl_ZDonnees: 
       cw.writerow([bl1,Blst_Donnees[bl1]]) 
      fichier.close() 
      model.terminate() 
+0

いくつかのコードや独自の試みを表示するか、この質問が終了する危険性があります。 – sascha

+0

これは妥当な質問です。 Gurobiは、コールバック関数のための多くのドキュメントを提供していません。 –

答えて

0

機能Model.cbGetNodeRel()takes a Var object or a list of Var objects。だから、sol_Z=model.cbGetNodeRel(vZ)のようなものを書く必要があります。

+0

M.Greg Glocknerありがとう、私はあなたの提案を適用します。しかし、別の方法を試しました(下記参照)。 – Issouf

0

このメソッドをテストしても問題ありません。

#********************************************************************** 
# Optimise relaxation, then recover the values that are near to 1 
    def M_Relax(model,FF,Fb0,Fb1,FBlocs,FBlocsR,FBlocs_FOP,FCBloc,FT,FOp_,FOpEq,FVarOrdProd): 
     FTe=range(1,FT+1) 
     Fbif=[Fb0,Fb1] 
     N=len(FBlocs) 
     mr=model.copy() 
     mr.setParam('OutputFlag',0) 
     # Create variables déplacements des équipements 
     vZ={} 
     for Cb in FCBloc: 
      for t in FTe: 
       for e in FOpEq: 
        vZ[Cb[0],Cb[1],t,e]= model.getVarByName(name="vZ_{}_{}_{}_{}".format(Cb[0],Cb[1],t,e)) 
     EntVars=[] 
     for var in mr.getVars(): 
      if var.vType !=GRB.CONTINUOUS: 
       EntVars+=[var] 
       var.vType=GRB.CONTINUOUS 

     mr.optimize() 
     Blst_Donnees={} 
     status = mr.status 
     if mr.SolCount>0 or status == GRB.Status.OPTIMAL: 
      sol_Z=mr.getAttr('x', vZ) 
      for bl in FBlocsR: 
       for e in [e1 for e1 in FOpEq if e1[0]==op]:        
        for cb in [cb1 for cb1 in FCBloc if cb1[1]==bl]: 
          if len([t for t in FTe if sol_Z[cb[0],bl,t,e]>0.8])>=1: 
           t1=min([t for t in FTe if sol_Z[cb[0],bl,t,e]>0.8])            
            Blst_Donnees.update({('Z',cb[0],cb[1],e):t1}) 
      NomFichier="M_Relaxation.csv" 
      fichier = open(NomFichier, 'w') 
      cw = csv.writer(fichier, delimiter=';') 
      for bl1 in Blst_Donnees: 
       cw.writerow([bl1,Blst_Donnees[bl1]]) 
      fichier.close() 
      return Blst_Donnees 
     elif status == GRB.Status.INFEASIBLE: 
      return [0,0] 
関連する問題