最好的开源混合整数优化求解器
我正在使用CPLEX来解决巨大的优化模型(超过10万个variables),现在我想看看是否可以find一个开源替代scheme,我解决混合整数问题(MILP)和CPLEX的工作很好,但是如果我们想要扩展,所以我真的需要find一个替代或开始写我们自己的特设优化库(这将是痛苦的)
任何build议/见解将不胜感激
我个人发现GLPK比LP_SOLVE更好(即更快)。 它支持各种文件格式,另一个优势是它的库接口,允许与你的应用程序顺利集成。
对COIN-OR的另一个认可。 我们发现线性优化器组件(Clp)非常强大,混合整数分量(Cbc)可以通过一些分析很好的调整。 我们比较了LP-Solve和GLPK。
对于非常棘手的问题,商业解决scheme是要走的路。
尝试SCIP求解器。 我已经用它来处理超过300Kvariables的MILP问题,并且性能很好。 它的MILP性能比GLPK好得多。 Gurobi在MILP问题方面也performance出色(通常比SCIP(2011年5月)要好),但如果你不是一个学术用户,这可能是高成本的。 Gurobi将使用multicores来加速解算器。
你尝试过lp_solve
吗? 对于Java,在下列问题中还有一些其他build议:
- 针对Java的math优化库 – 免费还是开源的build议?
- 用于Java的线性编程工具/库
我build议查看COIN项目。 硬币或
这里有很多很好的解决scheme,包括用于非线性问题的ipOPT和一对混合整数求解器。
Scip不错!
如果我是你,我会尝试使用一个多解算器接口,如Osi(C ++)或PuLP(python),这样你就可以编写一次代码,并用很多求解器进行testing。
如果你要解决的整数程序是巨大的,我会推荐python over C ++,因为你的代码看起来更干净,99%的时间将花在解算器上。
相反,如果问题很小,那么把问题从python的内存复制到求解器(来回)的时间不能再被忽略了:在这种情况下,你可以用一种编译语言来试验一些明显的性能改进。
但是,如果问题非常严重,那么编译语言将会再次获胜,因为内存占用大致将被除以2(python中没有问题的副本)。
虽然这可能不是你想听到的,但是商业解决者CPLEX和Gurobi与开源求解器之间还有一段光年。
尽pipe如此,你可能是幸运的,你的模型可以在GLPK,Coin或类似的环境下正常工作,但是总的来说,开源解决scheme是商业解决scheme的后盾。 如果情况不同,那么没有人会为Gurobi许可证支付12.000美元,而对于CPLEX许可证,则不会支付更多费用。
在过去的几年中,我看到许多模型对于开源求解者来说都是困难的。 相信我…
这不是一个大小的问题,而是数值难度的问题。
100kvariables是一个大问题。 许多开放源代码库不能很好地运行那么多的variables。 从我读过的lp_solve只能testing大约30k的variables。 使用商业系统可能是您唯一的select。
我已经使用DICOPT使用NEOS服务器( http://www.neos-server.org/neos/solvers/minco:DICOPT/GAMS.html )来解决大的(约1kvariables和1k约束)混合整数非线性程序并发现它很好。
对于我的问题,DICOPT比neo服务器BARON / KNITRO / LINDO / SBB上列出的其他MINLP求解器要好得多。
向NEOS提交工作有一定的限制,这样做有点麻烦,但是免费获得强有力的商业解决scheme并不足以弥补这一点。
不是开源的,但是如果您拥有Microsoft学院联盟许可证,则包含Microsoft Solver Foundation (MSF)企业版。 古罗比也是免费的学术目的,我用它在我的论文研究。
我会添加以下的已经很好的答案。
正如其他人所指出的那样,商业求解者比自由select更快,更有能力,所以考虑你能接受多less最优的缺口是很重要的。 对于许多整数variables的大问题,如果你能接受1%甚至更大的最优性缺口(默认值约为0.01%或更小),你可能会得到更快的求解时间。
当然,如果你正在解决一个问题,那就是1%转化为数百万美元,这是不可接受的,因此也是一stream解算器的市场。 ( 在这里比较古罗比和免费求解者的比较)
我同意其他人的看法,使用一个能生成与求解器无关的问题文件(如* .mps,* .lp文件)的平台是值得的,因为你可以尝试其他求解器。 我正在使用PuLP并find它,而免费的COIN_CBC求解器非常出色。 虽然限于许多整数variables的问题。
我很惊讶没有人提到MIPCL( http://www.mipcl-cpp.appspot.com/index.html )。 它是LGPL许可下的开放源代码(来源: http : //www.mipcl-cpp.appspot.com/licence.html ),因此也适用于非开源应用程序。
Hans Mittelmann最近(2017年9月10日)做了混合整数线性编程基准testing: http://plato.asu.edu/ftp/milpc.html (您可能也有兴趣查看概述页面http://plato.asu .edu / bench.html或他的演讲幻灯片: http : //plato.asu.edu/talks/informs2017.pdf )。
在具有12个线程的混合整数线性编程基准中,2个小时的时间限制,MIPCL设法解决了79个实例。 只有商业解决schemeCPLEX,Gurobi和XPRESS才能在给定的约束下(分别为86或87个实例)解决更多问题。
另外就所选性能指标而言(再次使用12个线程),MIPCL比基准SCIP派生(FSCIPC,FSCIPS)更快 – 回想一下,SCIP不是一个开源求解器 – 而且是开源求解器CBC。 再次,只有商业解决schemeCPLEX,Gurobi和XPRESS在性能方面明显超越MIPCL。