使用PulP时,如何从Gurobi求解器中检索当前的最佳解决方案?

如果在gurobi求解器中使用交互式求解器,则可以执行以下操作:

gurobi> m = read('model.mp')
gurobi> m.optimize()
[...]
Found heuristic solution: objective 821425.00000

然后中止并通过获取当前解决方案

gurobi> m.printAttr('X')

我希望在纸浆中具有相同的行为。特别是在致电之后:

prob =  pulp.LpProblem(name="MIPProblem",sense=pulp.LpMaximize)
[...]
status = prob.solve(pulp.GUROBI_CMD(msg=True,keepFiles=1))

我想等到一定时间间隔后找到/中止第一个启发式解决方案,然后再获得Gurobi找到的当前最佳解决方案。我该怎么办?

yangguanbiao 回答:使用PulP时,如何从Gurobi求解器中检索当前的最佳解决方案?

您可以使用pulp.GUROBIpulp.GUROBI_CDM
主要区别在于pulp.GUROBI gurobipy (Gurobi Python界面)的包装,而pulp.GUROBI_CDM使用命令行(即,它在文件中写入LP / ILP)然后调用求解器)。

让我们区分这两种情况:

  • 案例1 pulp.GUROBI

    在这种情况下,您可以访问SolverModel对象。对于这些字段,您可以直接参考文档。但是,对于您的特定用例,您需要的是ObjBound
    一个小例子:

    import pulp
    
    ...
    
    status = prob.solve(pulp.GUROBI(timeLimit=1))
    
    print(pulp.LpStatus[status]) # status
    
    print(prob.solverModel.ObjBound) # best objective found
    
  • 案例2 pulp.GUROBI_CDM

    在这种情况下,可以通过命令行解决问题,并从结果文件(即here)中读取解决方案

    import pulp
    
    ...
    
    status = prob.solve(pulp.GUROBI_CMD(options=[('TimeLimit','1')]))
    
    print(pulp.LpStatus[status]) # status
    
    print(pulp.value(prob.objective)) # best objective found
    

    请注意, GUROBI_CMD确实提供了良好的解决方案状态 [see here],因此,即使没有提供解决方案,您也可以阅读“最佳”,因为Gurobi解决方案文件没有提供有关状态的信息。

本文链接:https://www.f2er.com/3001542.html

大家都在问