我可以告诉PuLP限制它运行时调用的MIP求解器的执行时间和/或允许的最优性差距。在调用CBC时,它看起来像:
status_C = prob.solve (PULP_CBC_CMD(maxSeconds=1, fracGap = 0.01))
或调用GLPK时,如:
status_G = prob.solve(solver=pulp.GLPK(options=['--tmlim 60', '--mipgap 0.001']))
我的问题是:如何获得有关提前终止性质的更多信息?
使用CBC,如果达到时间限制,则返回status_C
为0,最佳可行z(目标值)为value(prob.objective)
。但是假设时间限制没有被击中,而是以最优性终止(可能由fracgap
放松)。考虑报告的z值为2201.2 fracgap = 0.00
和2200.8 fracgap = 0.05
的情况。如果我只做了后者自己运行,我会得到2200.8的解决方案和z *比这个高5%的可能性。然而(由于无关紧要的原因),我相信它可能已经比LP停止时更紧密地收紧了LP。要知道我是否正确,我需要看看已经取得了什么样的LP。这些信息是否可以在提供给PuLP的信息中找到?
对于GLPK,同样的问题适用但增加了复杂性。无论终止是由于时间限制还是间隙容限,它都将status_G
返回为1,即声明最优解。所以现在,除了在终止时查找LP绑定的进度外,我还在寻找额外的信息来告诉我是时间限制还是触发终止的最优性容差。如果是时间限制,我当然希望查看优化进度信息(即边界),看看我可能有多接近最优性。
答案 0 :(得分:0)
很抱歉,但是默认情况下,纸浆不支持此功能,因为各种状态都是特定于解算器的。如果您确实想要这样做,也许您应该使用纸浆中的代码作为模板手动运行解算器。