【问题标题】:How can I retrieve the current best solution from the Gurobi solver when using PulP?使用 PulP 时,如何从 Gurobi 求解器中检索当前的最佳解决方案?
【发布时间】:2019-11-30 19:12:25
【问题描述】:

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

【问题讨论】:

  • prob.objective 有效吗?我认为您应该删除status = 部分并尝试单独解决,然后通过prob.objective得到答案
  • 欢迎来到 SO!如果您查看pulp.solvers - pythonhosted.org/PuLP/solvers.html 的文档,您可以设置时间限制或允许的最优差距。要停止在第一个可行的解决方案上,请设置一个非常大的最优差距。
  • @kabdulla 但是,例如,我可以每隔 t 时间打印当前的最佳解决方案,然后继续解决以获得更好的解决方案(重复此操作直到我得到最好的解决方案)?如果我设置了时间限制或最优差距,然后再次调用 .solve(),它会从头开始,是吗?

标签: python gurobi pulp


【解决方案1】:

您可以使用pulp.GUROBIpulp.GUROBI_CDM
主要区别在于 pulp.GUROBIgurobipy(Gurobi Python 接口)的包装器,而 pulp.GUROBI_CDM 使用命令行(即,它将 LP/ILP 写入文件,然后调用解算器)。

让我们区分这两种情况:

  • 案例1pulp.GUROBI

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

    import pulp
    
    ...
    
    status = prob.solve(pulp.GUROBI(timeLimit=1))
    
    print(pulp.LpStatus[status]) # status
    
    print(prob.solverModel.ObjBound) # best objective found
    
  • 案例2pulp.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],因此即使解决方案不是,您也可以阅读 Optimal,因为 Gurobi 解决方案文件没有提供有关状态的信息。 p>

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2021-12-21
    • 2018-03-05
    相关资源
    最近更新 更多