2017-02-14 6 views
0

콜백을 통해 선형 완화 솔루션을 복구하려고 시도하는 MIP가 있습니다. 그러나 그렇게 할 수 없습니다. 아래의 코드를 사용하여 변수 M을 선형 완화 한 후 변수 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]