我已将 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/等。为此目的可能会更好。
关于速度:对于我通常处理的问题,AMPL 可能需要几秒钟来构建和预求解 MIP 模型,而 Gurobi 需要几分钟来解决。显然,这会随着硬件和问题的细节而有所不同,但总的来说,与正在讨论的任何解决方案的解决时间相比,我希望构建时间会更短。即使有像 Gurobi 这样好的求解器,大型 MIP 也很难。我遇到的许多认真的优化程序员都使用 Python,所以我认为性能方面已经足够好了。
但是,这并不意味着语言/平台的选择与速度无关。 AMPL(以及 GAMS)的一个很好的特性是 presolve,它试图在将问题发送给求解器之前减小问题的大小。我的标准问题有很多冗余变量和约束; AMPL 识别并消除了其中的许多问题,将问题规模减少了大约 80%,并显着缩短了求解器时间(与我关闭预求解的运行相比,我有时出于调试相关原因这样做)。如果您期望有大量冗余,这可能是一个考虑因素。
灵活/强大(能够处理 3D+ 数组、轻松激活/停用约束、为求解器提供初始解决方案等)
MiniZinc 最多可以处理 6D 数组,这可能会或可能不会足够,具体取决于您的应用程序。
它在某些方面比 AMPL 更灵活,而在其他方面则不那么灵活。 AMPL 有很多我觉得有用的基于集合的功能(例如,我可以定义一个变量,其索引集类似于“相隔不超过 500 公里的不同城市对”),而 MiniZinc 没有这个。 OTOH,MiniZinc 在求解器跳跃方面似乎比 AMPL 更好,例如如果我编写了一个带有“alldifferent”之类的组合约束的 MZ 模型,然后尝试在无法识别此类约束的求解器上运行它,则 MZ 会将其转换为求解器可以处理的东西。
除了将它们注释掉之外,我没有尝试在 MZ 中取消激活约束,所以我无能为力,同样在提供初始解决方案方面也是如此。
总的来说,MiniZinc 是一个不错的选择。与 AMPL 相关的一些优点和缺点(“免费”是一大优点!)但它填补了类似的利基。