我正在使用 CPLEX 来解决巨大的优化模型(超过 10 万个变量)现在我想看看我是否可以找到一个开源替代方案,我解决了混合整数问题 (MILP) 并且 CPLEX 效果很好,但是如果我们想要扩展,所以我真的需要找到替代方案或开始编写我们自己的临时优化库(这会很痛苦)
任何建议/见解将不胜感激
我正在使用 CPLEX 来解决巨大的优化模型(超过 10 万个变量)现在我想看看我是否可以找到一个开源替代方案,我解决了混合整数问题 (MILP) 并且 CPLEX 效果很好,但是如果我们想要扩展,所以我真的需要找到替代方案或开始编写我们自己的临时优化库(这会很痛苦)
任何建议/见解将不胜感激
我个人发现GLPK比 LP_SOLVE 更好(即更快)。它支持各种文件格式,另一个优势是它的库接口,可以与您的应用程序顺利集成。
COIN-OR 的另一个背书。我们发现线性优化器组件 (Clp) 非常强大,并且混合整数组件 (Cbc) 可以通过一些分析很好地调整。我们与 LP-Solve 和 GLPK 进行了比较。
对于真正棘手的问题,商业解决方案是必经之路。
试试 SCIP 求解器。我已将它用于具有超过 300K 变量且性能良好的 MILP 问题。它的 MILP 性能比 GLPK 好得多。Gurobi 在 MILP 问题上也有出色的表现(通常比 SCIP(2011 年 5 月)更好),但如果您不是学术用户,它可能会很昂贵。Gurobi 将使用多核来加速求解器。
如果我是你,我会尝试使用多求解器接口,例如 Osi (C++) 或 PuLP (python),这样你就可以编写一次代码,并使用多个求解器对其进行测试。
如果您要求解的整数程序很大,我会推荐使用 Python 而不是 C++,因为您的代码看起来会更简洁,并且 99% 的时间都花在求解器上。
相反,如果问题很小,那么将问题从 python 内存复制到求解器(来回)的时间就不再被忽视:在这种情况下,您可以使用编译语言尝试一些显着的性能改进.
但是如果问题非常巨大,那么编译语言将再次获胜,因为内存占用将大致除以 2(python 中没有问题的副本)。
你试过lp_solve
吗?对于 Java,以下问题中还有一些其他建议:
我建议查看 COIN 项目。 硬币或
这里有许多优秀的求解器,包括用于非线性问题的 ipOPT 和几个混合整数求解器。
scip还不错!
尽管这可能不是您想听到的,但一方面商业求解器 CPLEX 和 Gurobi 与开源求解器之间存在光年。
尽管如此,你还是很幸运的,你的模型可以很好地与 GLPK、Coin 等类似,但总的来说,开源解决方案远远落后于商业求解器。如果不同,没有人愿意为 Gurobi 许可证支付 12.000 美元,甚至为 CPLEX 许可证支付更多。
在过去的几年里,我看到了许多对开源求解器来说非常困难的模型。相信我...
这不是大小的问题,而是数字难度的问题。
我很惊讶没有人提到 MIPCL ( http://www.mipcl-cpp.appspot.com/index.html )。该求解器声称在 LGPL 许可下是开源的(来源: http: //www.mipcl-cpp.appspot.com/licence.html),因此它也适用于非开源应用程序。但是真正开源所缺少的是求解器本身的源代码。
Hans Mittelmann 最近(2017 年 9 月 10 日)做了混合整数线性规划基准测试: http: //plato.asu.edu/ftp/milpc.html(您可能也有兴趣查看概览页面http://plato.asu .edu/bench.html或他的演讲幻灯片:http: //plato.asu.edu/talks/informs2017.pdf)。
在具有 12 个线程和 2 小时时间限制的混合整数线性规划基准测试中,MIPCL 设法解决了 79 个实例。只有商业求解器 CPLEX、Gurobi 和 XPRESS 能够在给定的约束(分别为 86 或 87 个实例)下解决更多问题。
同样在选择的性能指标(再次使用 12 个线程)方面,MIPCL 比基准 SCIP 衍生产品(FSCIPC、FSCIPS)和开源求解器 CBC 更快。同样,只有商业求解器 CPLEX、Gurobi 和 XPRESS 在性能方面明显胜过 MIPCL。
100k 个变量是个大问题。许多开源库不能很好地处理这么多变量。从我读过的内容来看, lp_solve 仅针对大约 30k 变量进行了测试。使用商业系统可能是您唯一的选择。
我使用 DICOPT 使用 NEOS 服务器(http://www.neos-server.org/neos/solvers/minco:DICOPT/GAMS.html)来解决大型(大约 1k 个变量和 1k 个约束)混合整数非线性程序并发现它很棒。
对于我的问题,DICOPT 比 Neos 服务器 BARON/KNITRO/LINDO/SBB 等上列出的其他 MINLP 求解器做得更好。
向 NEOS 提交作业有一定的限制,而且有点麻烦,但是免费访问强大的商业求解器足以弥补它。
我将在已经很好的答案中添加以下内容。
虽然正如其他人所指出的那样,商业求解器比免费替代方案更快、更有能力,重要的是要考虑你可以接受多少最优性差距。对于具有许多整数变量的大型问题,如果您可以接受 1% 甚至更大的最优性差距(默认值往往在 0.01% 左右或更小),您可能会获得更快的求解时间。
当然,如果您正在解决一个 1% 转化为数百万美元的问题,这是不可接受的 - 因此市场需要一流的解决方案。(这里Gurobi 与免费求解器的一些比较)
我同意其他人的观点,即使用生成独立于求解器的问题文件(例如 *.mps、*.lp 文件)的平台是值得的,因为您可以尝试其他求解器。我正在使用PuLP并且正在找到它,以及免费的 COIN_CBC 求解器,非常好。虽然仅限于许多整数变量的问题。
不是开源的,但如果您拥有 Microsoft Academic Alliance 许可证,则包括Microsoft Solver Foundation (MSF) 企业版。Gurobi对于学术目的也是免费的,我在我的论文研究中使用了它。