什么是解决混合整数编程问题的最快软件(开源)


14

我有一个混合整数编程问题。我目前正在使用GLPK作为我的求解器。但是我发现GLPK可以很好地解决线性编程问题,但是对于混合整数编程,它需要更长的时间,因此不符合我们的要求。我正在寻找其他软件。还有其他好的开源工具可以快速解决混合整数编程问题吗?谢谢!


您是否看到了与SCIP的比较?
阿里

Answers:


14

如果您想要开放源代码,则可能要尝试使用COIN的CBC代码(它们还具有其他几个MILP解算器,例如分支价格框架或SYMPHONY)。

Gurobi和CPLEX的速度将大大提高,并且在2011或2012 INFORMS会议上,Gurobi的速度比CPLEX快(尽管性能指标当然取决于问题)。在我的论文中解决的MILP方面,Gurobi的速度大约是CBC的15-100倍,而CPLEX的速度几乎与Gurobi一样快,但速度却稍慢(例如快12-80倍)。

尽管最坏情况下的性能确实是指数级的,但是执行时间将在很大程度上取决于问题的结构。除非您利用特殊的结构(不可能是分解成许多小问题的随机程序),否则您不可能使用数百万个变量来解决MILP,但解决成千上万的非平凡的MILP则完全有可能不到一分钟的时间 (当然,这些问题也可能需要一个小时或更长时间才能解决。)

正如Brian Borchers指出的那样,CPLEX和Gurobi都为某些研究人员提供了免费许可证,这两个软件包之一确实是用作通用MILP求解器的最佳选择。


6

混合整数线性规划问题比线性规划问题更难解决。就计算复杂度而言,可以在多项式时间内求解LP,而求解MILP是NP-Hard问题。解决MILP的已知算法具有指数级的最坏情况复杂度。

您还可以查看其他用于混合整数线性编程的软件包,包括SCIP(免费供学术使用),CPLEX(商业性但具有学术许可选项)和GUROBI(也具有商业性许可选项的商业版)。一个或多个这些软件包在您的问题上可能比GLPK快得多,但不要指望它们中的任何一个在解决MILP方面都快于解决类似大小的LP时那么快。


4

如果您想尝试一堆不同的求解器,请尝试使用Julia的JuMP建模框架。它使您可以将模型编写为JuMP模型,然后用一行代码切换出求解器。例如,对于MILP问题,可以从Bonmin,Cbc,Couenne,CPLEX,GLPK,Gurobi和MOSEK解算器中选择。因此,如果您使用JuMP编写代码,则可以尝试Geoff提到的所有求解器,而无需编写大量代码即可查看有效的解决方案。最快的算法可以解决您的问题,您自己的个人测试将是最佳的知识来源。


JuMP框架会增加很多开销吗?
naught101 '16

1
不,JuMP是通过宏完成的,因此它在编译时。实际上,JuMP所做的事情是使用宏来重写代码并使用自动求差来计算梯度,雅可比和黑森州的有效函数,因此,如果您不提供梯度的解析形式,它将更快。雅各比/黑森。实际上,您可以检查via @code_llvm来检查生成的汇编代码,以查看粘合代码本质上是什么(这也是因为Julia天真地使用了函数指针和与C / Fortran相同的位数组)。
克里斯·拉卡卡斯

@ChrisRackauckas对于具有非线性约束的非线性问题,哪种求解器更有效?
skan

如果不应该在评论中提出这个问题,则是一个完全不同的问题,但是我倾向于将JuMP与NLopt或IPOPT结合使用,具体取决于所需的约束以及我是否需要全局或局部优化。
克里斯·拉考卡斯

3

遵循其他人的建议,我 在许多项目中使用了(商业) GAMS。这是很直接的。您所要做的就是对问题进行数学表述。它拾取变量,约束,目标函数和所有输入数据。然后,它为各种情况提供了一系列求解器(优化器)。根据您的情况,您可以添加更复杂的求解器。

当然,EASY 值得一看。开源框架。

“快速”一词非常含糊!你需要更加详细; 迭代次数快吗?多少次评价?经过的时间?这些结合吗?

但是,如果您不是要寻找软件,而只是想解决问题,我建议您使用全局优化器NSGA-II,它是具有很高声誉和性能的开源优化器。

如果您提供了更多信息,我将为您提供准确的指导。


1
您需要认真考虑[openMDAO] [1],它由NASA开发/支持,并且非常灵活!
T3rmInAt0r
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.