我有Gurobi许可证,我使用的是良好的MILP / LP建模语言,应该是
免费/开源
直观,即看起来像的东西(取自MiniZinc)
var int:x; 约束x> = 0.5; 解决最小化x;
快:构建模型并将其发送到Gurobi的时间应与最佳模型(AMPL GAMS等)相似。
灵活/强大(能够处理3D +数组,轻松激活/停用约束,为解算器提供初始解决方案等)
当然,如果我错了,请纠正我,AMPL GAMS在1)失败,Python和R在2)失败(也许在3)?)。
GLPK,Minizinc,ZIMPL等怎么样?它们满足1)和2)但是3)和4)呢?在这方面它们和AMPL一样好吗?如果没有,是否有一种满足1-4的建模语言?
答案 0 :(得分:2)
恕我直言,如果你认为Python接口/建模环境SCIP或Gurobi过于复杂,就没有这样的系统:
x = model.addVar()
y = model.addVar(vtype="INTEGER")
model.setObjective(x + y)
model.addCons(2*x - y*y >= 0)
model.optimize()
对我而言,这看起来非常自然而且直截了当。使用实际编程语言而不是建模语言的巨大好处是你可以在那里做任何,而后者总会有边界。
如果您正在寻找建模GUI,则应该查看LITIC。它几乎可以完全用于拖放操作:https://litic.com/showcase.html
答案 1 :(得分:1)
我将AMPL与Gurobi一起用于中型MIP(~100k-1m变量?)和MiniZinc(主要是Gecode)用于较小的组合问题。我已经看过使用R和Python完成的一些Gurobi工作,但是我自己并没有这样使用它。
我对其他选项不熟悉。我的理解是GAMS与AMPL非常相似,我对AMPL的大部分内容也可能对GAMS有效,但我无法保证它。
当然,如果我错了,请纠正我,AMPL GAMS在1处失败,
是的,一般而言。有一个例外可能对您的特定要求没有帮助,但可能对其他人有用:您可以使用NEOS web service免费使用AMPL,Gurobi和许多其他优化产品。这仅限于academic non-commercial purposes,您必须授予NEOS与您发送的问题相关的某些权利;在使用之前一定要阅读这些服务条款。它还需要等待可用的服务器,因此如果速度是高优先级,这可能不是您的解决方案。
Python和R在2)失败(也许在3)?)。
在我有限的经历中,是(2)。 AMPL,GAMS和MiniZinc专门用于定义优化问题,因此毫不奇怪它们的语法比Python和R等语言更加用户友好。
另一方面,如果你想做任何事情其他而不是用这些语言来定义优化问题,那就是Python / R / etc。为此目的可能会更好。
关于速度:对于我经常使用的问题,AMPL可能需要几秒钟的时间来构建和预测MIP模型,这需要Gurobi几分钟才能解决。显然,这会随着硬件和问题的细节而有所不同,但总的来说,我认为与所讨论的任何解决方案的解决时间相比,构建时间较短。即使有像Gurobi这样的优秀求解器,大型MIP也很难。我见过的许多认真的优化程序员都使用Python,所以我认为性能方面已经足够好了。
但是,这并不意味着语言/平台的选择与速度无关。 AMPL(以及GAMS)的一个很好的功能是presolve,它试图在将问题发送给求解器之前减小问题的大小。我的标准问题有冗余变量和约束的批次; AMPL识别并消除了其中的许多问题,将问题大小减少了大约80%,并使求解器时间得到显着改善(与我关闭presolve的运行相比,我有时会出于调试相关的原因)。如果您期望大量冗余,这可能是一个考虑因素。
灵活/强大(能够处理3D +数组,轻松激活/停用约束,为解算器提供初始解决方案等)。
MiniZinc可处理多达6D阵列,根据您的应用程序,这可能是也可能不够。
在某些领域它比AMPL更灵活,而在其他领域则更少。 AMPL有许多基于集合的功能,我发现它很有用(例如,我可以定义一个变量,其索引集类似于“不相同的城市对,相隔不超过500公里”),MiniZinc没有这个功能。 OTOH,MiniZinc似乎比AMPL更适合求解器,例如如果我用类似“alldifferent”的组合约束编写一个MZ模型但是然后尝试在不能识别这种约束的解算器上运行它,MZ会将它转换为求解器可以处理的东西。
我没有尝试在MZ中停用约束而不是通过注释它们,所以我无法帮助那里,同样提供初始解决方案。
总体而言,MiniZinc是一个不错的选择。关于AMPL的一些优点和缺点(“免费”是一个很大的优点!)但它填补了类似的利基。
答案 2 :(得分:1)
我使用了很多提到的选项,有些还没有提到
答案 3 :(得分:0)
查看Google或工具。我不确定是否在其所有接口中都可以获得解算器的初始解决方案,但是如果你在python中使用它,它应该可以满足所有1-4。