建模的最佳建模语言 LP/MILP? (不是解算器)
Best modelling language for modelling LP/MILP? (NOT solver)
我有 Gurobi 许可证,我正在寻找一种很好的 MILP/LP 建模语言,应该是
free/open 来源
直观,即看起来像(取自 MiniZinc)
var int: x;
约束 x >= 0.5;
求解最小化 x;
快速:构建模型并将其发送到 Gurobi 的时间应该与最好的时间(AMPL GAMS 等)类似)
flexible/powerful(能够处理3D+数组,activate/deactivate轻松约束,为求解器提供初始解等)
当然,如果我错了请纠正我,AMPL GAMS 在 1),Python 和 R 在 2)(也许在 3)失败?)。
GLPK、Minizinc、ZIMPL等怎么样?它们满足 1) 和 2) 但 3) 和 4) 呢?他们在这方面和 AMPL 一样好吗?如果没有,是否有满足1-4的建模语言?
看看Google or-tools。我不确定求解器的初始解是否在它的所有接口中都可用,但如果你在 python 中使用它,它应该可以满足所有 1-4.
我将 AMPL 与 Gurobi 一起用于 mid-sized MIP(~ 100k-1m 变量?)和 MiniZinc,主要与 Gecode 一起用于较小的组合问题。我看过一些使用 R 和 Python 完成的 Gurobi 工作,但我自己并没有那样使用它。
我对其他选项不太熟悉。我的理解是 GAMS 与 AMPL 非常相似,我所说的关于 AMPL 的很多内容可能也适用于 GAMS,但我不能保证。
Of course, and correct me if I'm wrong, AMPL GAMS fail at 1),
是的,一般来说。有一个例外可能对您的特定要求没有帮助,但可能对其他人有用:您可以免费使用 AMPL、Gurobi 和许多其他优化产品,通过使用 NEOS web service. This is restricted to academic non-commercial purposes 并且您必须授予NEOS 与您发送给他们的问题相关的某些权利;在使用之前一定要阅读这些服务条款。它还需要等待可用的服务器,所以如果速度是高优先级的,这可能不是您的解决方案。
Python and R fail at 2) (and perhaps at 3)?).
以我有限的经验,对 (2) 是的。 AMPL、GAMS 和 MiniZinc 是专门为定义优化问题而设计的,因此它们的语法比 Python 和 R 这样的语言更 user-friendly 也就不足为奇了。
flip-side 是,如果您想做任何 其他 而不是使用这些语言定义优化问题,Python/R/etc。可能会更好。
关于速度:对于我通常处理的问题,AMPL 可能需要几秒钟来构建和预求解 MIP 模型,而 Gurobi 需要几分钟才能解决。显然,这会随着硬件和问题的细节而有所不同,但总的来说,我希望构建时间与解决所讨论的任何解决方案的时间相比要短。即使使用像 Gurobi 这样的优秀求解器,大型 MIP 也很难。我遇到的许多认真的优化程序员确实使用 Python,所以我认为性能方面足够好。
然而,这并不意味着 language/platform 的选择与速度无关。 AMPL(以及 GAMS)的一个很好的特性是预求解,它试图在将问题发送给求解器之前减小问题的大小。我的标准问题有 lot 冗余变量和约束; AMPL 识别并消除了其中的许多问题,将问题大小减少了大约 80%,并显着缩短了求解时间(与我关闭预求解的 运行s 相比,我有时会为 debugging-related原因)。如果您希望有很多冗余,这可能是一个考虑因素。
flexible/powerful (ability to deal with 3D+ arrays, activate/deactivate constraints easily, provide initial solutions to the solver, etc.)
MiniZinc 最多可处理 6 维数组,这可能足够也可能不够,具体取决于您的应用程序。
它在某些领域比 AMPL 更灵活,而在其他领域则不如 AMPL。 AMPL 有很多我觉得有用的 set-based 功能(例如,我可以定义一个变量,其索引集类似于 "pairs of non-identical cities separated by no more than 500 km")而 MiniZinc 没有这个。 OTOH,MiniZinc 似乎比 solver-hopping 的 AMPL 更好,例如如果我编写了一个带有 "alldifferent" 组合约束的 MZ 模型,然后尝试在不识别此类约束的求解器上 运行 它,MZ 会将其转换为求解器可以处理的东西。
我没有尝试在 MZ 中停用约束,只是将它们注释掉,所以我无能为力,同样提供初始解决方案。
总的来说,MiniZinc 是一个不错的选择。相对于 AMPL 的一些优点和缺点("free" 是一个很大的优点!)但它填补了类似的利基市场。
恕我直言,如果您认为 Python interfaces/modeling 环境 SCIP or Gurobi 太复杂,则没有这样的系统:
x = model.addVar()
y = model.addVar(vtype="INTEGER")
model.setObjective(x + y)
model.addCons(2*x - y*y >= 0)
model.optimize()
对我来说,这看起来很自然和直接。使用实际的编程语言而不是建模语言的巨大好处是您可以在那里做 任何事情,而后者总是有界限的。
如果您正在寻找建模 GUI,您应该查看 LITIC. It can be used almost entirely with drag-and-drop operations: https://litic.com/showcase.html
我已经使用了很多提到的选项,还有一些还没有提到
- GAMS
- GAMS' Python API
- GAMS 的 MATLAB API
- AMPL
- FICO Xpress Mosel
- FICO随心模型的PythonAPI
- IBM ILOG OPL
- 古罗比的PythonAPI
- 纸浆 (Python)
- Pyomo (Python)
- Python-MIP
- JuMP(朱莉娅)
- MATLAB 优化工具箱
- Google OR-工具
根据您的要求,我建议尝试 Python-MIP, PuLP or JuMP。它们是免费的,语法简单,对数组维度没有限制。
我有 Gurobi 许可证,我正在寻找一种很好的 MILP/LP 建模语言,应该是
free/open 来源
直观,即看起来像(取自 MiniZinc)
var int: x; 约束 x >= 0.5; 求解最小化 x;
快速:构建模型并将其发送到 Gurobi 的时间应该与最好的时间(AMPL GAMS 等)类似)
flexible/powerful(能够处理3D+数组,activate/deactivate轻松约束,为求解器提供初始解等)
当然,如果我错了请纠正我,AMPL GAMS 在 1),Python 和 R 在 2)(也许在 3)失败?)。
GLPK、Minizinc、ZIMPL等怎么样?它们满足 1) 和 2) 但 3) 和 4) 呢?他们在这方面和 AMPL 一样好吗?如果没有,是否有满足1-4的建模语言?
看看Google or-tools。我不确定求解器的初始解是否在它的所有接口中都可用,但如果你在 python 中使用它,它应该可以满足所有 1-4.
我将 AMPL 与 Gurobi 一起用于 mid-sized MIP(~ 100k-1m 变量?)和 MiniZinc,主要与 Gecode 一起用于较小的组合问题。我看过一些使用 R 和 Python 完成的 Gurobi 工作,但我自己并没有那样使用它。
我对其他选项不太熟悉。我的理解是 GAMS 与 AMPL 非常相似,我所说的关于 AMPL 的很多内容可能也适用于 GAMS,但我不能保证。
Of course, and correct me if I'm wrong, AMPL GAMS fail at 1),
是的,一般来说。有一个例外可能对您的特定要求没有帮助,但可能对其他人有用:您可以免费使用 AMPL、Gurobi 和许多其他优化产品,通过使用 NEOS web service. This is restricted to academic non-commercial purposes 并且您必须授予NEOS 与您发送给他们的问题相关的某些权利;在使用之前一定要阅读这些服务条款。它还需要等待可用的服务器,所以如果速度是高优先级的,这可能不是您的解决方案。
Python and R fail at 2) (and perhaps at 3)?).
以我有限的经验,对 (2) 是的。 AMPL、GAMS 和 MiniZinc 是专门为定义优化问题而设计的,因此它们的语法比 Python 和 R 这样的语言更 user-friendly 也就不足为奇了。
flip-side 是,如果您想做任何 其他 而不是使用这些语言定义优化问题,Python/R/etc。可能会更好。
关于速度:对于我通常处理的问题,AMPL 可能需要几秒钟来构建和预求解 MIP 模型,而 Gurobi 需要几分钟才能解决。显然,这会随着硬件和问题的细节而有所不同,但总的来说,我希望构建时间与解决所讨论的任何解决方案的时间相比要短。即使使用像 Gurobi 这样的优秀求解器,大型 MIP 也很难。我遇到的许多认真的优化程序员确实使用 Python,所以我认为性能方面足够好。
然而,这并不意味着 language/platform 的选择与速度无关。 AMPL(以及 GAMS)的一个很好的特性是预求解,它试图在将问题发送给求解器之前减小问题的大小。我的标准问题有 lot 冗余变量和约束; AMPL 识别并消除了其中的许多问题,将问题大小减少了大约 80%,并显着缩短了求解时间(与我关闭预求解的 运行s 相比,我有时会为 debugging-related原因)。如果您希望有很多冗余,这可能是一个考虑因素。
flexible/powerful (ability to deal with 3D+ arrays, activate/deactivate constraints easily, provide initial solutions to the solver, etc.)
MiniZinc 最多可处理 6 维数组,这可能足够也可能不够,具体取决于您的应用程序。
它在某些领域比 AMPL 更灵活,而在其他领域则不如 AMPL。 AMPL 有很多我觉得有用的 set-based 功能(例如,我可以定义一个变量,其索引集类似于 "pairs of non-identical cities separated by no more than 500 km")而 MiniZinc 没有这个。 OTOH,MiniZinc 似乎比 solver-hopping 的 AMPL 更好,例如如果我编写了一个带有 "alldifferent" 组合约束的 MZ 模型,然后尝试在不识别此类约束的求解器上 运行 它,MZ 会将其转换为求解器可以处理的东西。
我没有尝试在 MZ 中停用约束,只是将它们注释掉,所以我无能为力,同样提供初始解决方案。
总的来说,MiniZinc 是一个不错的选择。相对于 AMPL 的一些优点和缺点("free" 是一个很大的优点!)但它填补了类似的利基市场。
恕我直言,如果您认为 Python interfaces/modeling 环境 SCIP or Gurobi 太复杂,则没有这样的系统:
x = model.addVar()
y = model.addVar(vtype="INTEGER")
model.setObjective(x + y)
model.addCons(2*x - y*y >= 0)
model.optimize()
对我来说,这看起来很自然和直接。使用实际的编程语言而不是建模语言的巨大好处是您可以在那里做 任何事情,而后者总是有界限的。
如果您正在寻找建模 GUI,您应该查看 LITIC. It can be used almost entirely with drag-and-drop operations: https://litic.com/showcase.html
我已经使用了很多提到的选项,还有一些还没有提到
- GAMS
- GAMS' Python API
- GAMS 的 MATLAB API
- AMPL
- FICO Xpress Mosel
- FICO随心模型的PythonAPI
- IBM ILOG OPL
- 古罗比的PythonAPI
- 纸浆 (Python)
- Pyomo (Python)
- Python-MIP
- JuMP(朱莉娅)
- MATLAB 优化工具箱
- Google OR-工具
根据您的要求,我建议尝试 Python-MIP, PuLP or JuMP。它们是免费的,语法简单,对数组维度没有限制。