6

我有 Gurobi 许可证,并且我追求一种好的 MILP/LP 建模语言,应该是

  1. 免费/开源

  2. 直观的,即看起来像的东西(取自 MiniZinc)

    变量int:x;约束 x >= 0.5;解决最小化x;

  3. 快速:构建模型并将其发送到 Gurobi 的时间应该与最佳模型(AMPL GAMS 等)的顺序相似

  4. 灵活/强大(能够处理 3D+ 数组,轻松激活/停用约束,为求解器提供初始解决方案等)

当然,如果我错了,请纠正我,AMPL GAMS 在 1) 处失败,Python 和 R 在 2) 处失败(也许在 3 处)?)。

GLPK、Minizinc、ZIMPL 等怎么样?它们满足 1) 和 2) 但 3) 和 4) 呢?他们在这方面和 AMPL 一样好吗?如果没有,是否有满足 1-4 的建模语言?

4

4 回答 4

4

我已经将 AMPL 与 Gurobi 一起用于中型 MIP(约 100k-1m 变量?)和 MiniZinc,主要与 Gecode 一起用于较小的组合问题。我见过一些使用 R 和 Python 完成的 Gurobi 工作,但我自己并没有那样使用它。

我对其他选项不太熟悉。我的理解是 GAMS 与 AMPL 非常相似,我要说的关于 AMPL 的大部分内容可能也适用于 GAMS,但我不能保证。

当然,如果我错了,请纠正我,AMPL GAMS 在 1) 处失败,

是的,一般来说。有一个例外可能对您的特定要求没有帮助,但可能对其他人有用:您可以通过使用NEOS Web 服务免费使用 AMPL、Gurobi 和许多其他优化产品。这仅限于学术非商业目的,您必须就您发送给 NEOS 的问题授予 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 相关的一些优点和缺点(“免费”是一大优点!)但它填补了类似的利基市场。

于 2018-04-07T15:16:07.003 回答
4

恕我直言,如果您认为SCIPGurobi的 Python 接口/建模环境过于复杂,则没有这样的系统:

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

于 2018-04-08T20:07:12.930 回答
4

我已经使用了很多提到的选项,还有一些还没有提到

  • 游戏管理系统
  • GAMS 的 Python API
  • GAMS 的 MATLAB API
  • AMPL
  • FICO Xpress 摩泽尔
  • FICO Xpress 模型的 Python API
  • IBM ILOG OPL
  • Gurobi 的 Python API
  • 纸浆(Python)
  • 皮莫 (Python)
  • Python-MIP
  • 跳跃(朱莉娅)
  • MATLAB 优化工具箱
  • 谷歌或工具

根据您的要求,我建议尝试Python-MIPPuLPJuMP。它们是免费的,语法简单,对数组维度没有限制。

于 2018-07-18T17:19:14.150 回答
0

看看谷歌或工具。我不确定是否可以在其所有接口中获得求解器的初始解决方案,但如果您在 python 中使用它,它可能应该满足所有 1-4。

于 2018-04-07T04:27:32.387 回答