我正在使用Pulp和GLPK求解器并遵循约束条件:
-1000000*f1 + v1 + 1000000*f2 - v2 >= -10.999
求解:
problem.solve(GLPK(options=['--mipgap', '0.000001', '--cuts']))
但结果我得到了解决问题(状态'Optimal')的约束违规:
f1 = 0
v1 = 11
f2 = 1
v2 = 1000000
那么,在这种情况下我该怎么办?我能以某种方式提高准确度还是使用其他解决方案?
答案 0 :(得分:1)
我认为,你遇到数值准确性问题。你的系数是1.e7的顺序(你想要一个1.e-6的解决方案)。解决方案需要在1.e11中至少正确以保持约束,并且通过参数,您需要最大1.e-14相对误差。
对于纯数字解算器而言,这简直太过分了。 (期望最大1.e-6到1.e-7对LP-Solver运行可靠)有像QSopt这样的精确解算器,我也认为,soplex现在已经获得了这些功能。
以下是QSopt的链接 http://www.math.uwaterloo.ca/~bico/qsopt/downloads/downloads.htm
这是soplex东西的链接。 http://soplex.zib.de/doc/html/EXACT.php
QSopt仅以二进制形式提供(我认为),SoPlex可供研究免费(据我所知)。
此外,您可以将SCIP与SoPLex结合使用。拥有或拥有一些确切的IP项目。所以,如果你的许可证合适,我会在这种情况下选择SCIP。
也许,你可以对你的应用提供更多的洞察力,以便人们可以重新制定你的限制。