首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Gurobi :检索MIP的线性算法的解

Python Gurobi :检索MIP的线性算法的解
EN

Stack Overflow用户
提问于 2017-02-15 04:35:33
回答 2查看 764关注 0票数 1

我有一个MIP,我试图通过回调恢复线性松弛的解,但我不能。我使用下面的代码来提取变量Z,就在我的MIP的线性松弛重新解锁之后。

代码语言:javascript
复制
# 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()
EN

回答 2

Stack Overflow用户

发布于 2017-02-16 12:08:45

函数Model.cbGetNodeRel() takes a Var object or a list of Var objects。所以你需要写一些像sol_Z=model.cbGetNodeRel(vZ)这样的东西。

票数 0
EN

Stack Overflow用户

发布于 2017-02-17 08:45:10

我测试了这个方法,它是好的。

代码语言:javascript
复制
    #**********************************************************************
# 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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42235705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档