使用纸浆时,如何从Gurobi解算器检索当前最佳解决方案?

2024-05-16 02:53:35 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我在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找到的当前最佳解决方案。我该怎么做?你知道吗


Tags: readmodelmp解决方案pulp算器optimizesolution
1条回答
网友
1楼 · 发布于 2024-05-16 02:53:35

您可以使用pulp.GUROBIpulp.GUROBI_CDM
主要区别在于pulp.GUROBIgurobipy(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\u CMD确实提供了良好的解决方案状态[see here],因此即使解决方案不是,您也可以读取Optimal,因为GUROBI解决方案文件没有提供有关状态的信息。

相关问题 更多 >