【问题标题】:Best modelling language for modelling LP/MILP? (NOT solver)建模 LP/MILP 的最佳建模语言? (不是求解器)
【发布时间】:2018-09-16 02:00:32
【问题描述】:

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

  1. 免费/开源

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

    var 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的建模语言?

【问题讨论】:

    标签: modeling mixed-integer-programming


    【解决方案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/等。为此目的可能会更好。

    关于速度:对于我通常处理的问题,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 相关的一些优点和缺点(“免费”是一大优点!)但它填补了类似的利基。

    【讨论】:

    • 感谢您非常详细的回答。
    【解决方案2】:

    恕我直言,如果您认为 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

    【讨论】:

    • 谢谢,这看起来确实很自然。我想这就是我所追求的!
    【解决方案3】:

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

    • 游戏
    • GAMS 的 Python API
    • GAMS 的 MATLAB API
    • AMPL
    • FICO Xpress 摩泽尔
    • FICO Xpress 模型的 Python API
    • IBM ILOG OPL
    • Gurobi 的 Python API
    • 纸浆(Python)
    • Pyomo (Python)
    • Python-MIP
    • JuMP(朱莉娅)
    • MATLAB 优化工具箱
    • Google OR-工具

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-04-17
        • 2015-08-30
        • 1970-01-01
        • 2020-02-29
        • 2018-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        相关资源
        最近更新 更多