2

使用带有 AMPL 的 Gurobi 而不是使用 Gurobi 直接 API(java、C#、C++ 等)来解决大型 MIP 问题有什么优势?使用 Gurobi 的 API 而不是 AMPL 时有性能优势吗?

4

2 回答 2

4

直到 90 年代中期,使用 MIP 求解器解决大规模问题(因此不包括电子表格)的唯一实用选项是

当时,对于非常复杂的 MIP 模型,AMPL 模型会更加简洁、易读且更易于维护。即使在今天,AMPL 模型看起来也更像是一个数学公式。

AMPL 的一个优点是它的数据结构,但是今天 C#、Java 和 C++ 的标准库都具有很好的数据结构。AMPL 的另一个优点是它的语法看起来非常直观

subject to {j in J} sum {i in I} x[i,j] <= b[j]

但是新的 C++0x 和最新版本的 Java 的语法更接近地模仿了这一点。

AMPL 在求解器之间是可移植的,但是求解器之间的接口差别不大。虽然将应用程序从一个求解器移植到另一个求解器并非易事,但对我来说,这并不像尝试切换数据库(比如从 MySQL 到 Postgres)那么重要。

AMPL 有一些特定的缺点。对于大多数业务应用程序,将 AMPL 引入项目意味着添加另一种编程语言。花在学习 AMPL 上的时间只会对编写数学编程模型有用。与 Java、C# 甚至 C++ 相比,AMPL 的用户群很小,对底层技术的改进仅来自一家小公司(全是非常聪明的人,但仍然是一家小公司)。如果您想使用混合方法来解决优化问题(例如,使用启发式方法生成额外列的列生成策略),您将面临一些麻烦。如果你想做一些事情,比如运行你的求解器直到 1% 的最优性,但运行至少 10 秒,你不能用 AMPL 做到这一点,但可以使用 Gurobi API 之一的回调来做到这一点。

Python 可能提供两全其美的优势。它是一种通用编程语言,适用于各种应用领域。Gurobi 有自己的 Python API,但也有内部特定领域的语言,如PuLPPyomo,它们可以在求解器之间移植。

于 2014-11-12T04:36:07.243 回答
3

与 Gurobi API 相比,将 AMPL 与 Gurobi 结合使用有几个优点:

  1. 如果您将来需要它,可以轻松切换到其他求解器。
  2. 声明式 AMPL 模型通常比用于通过 API 构建问题的过程代码更易于阅读并且更高级。
  3. AMPL 隔离了求解器过程,这对大型问题可能是有益的。例如,如果求解器内存不足,则不会影响 AMPL。
  4. AMPL 提供了从数据库和电子表格导入和导出数据的内置功能。
  5. AMPL 拥有一个活跃的社区,可以说比包括 Gurobi 在内的任何个人求解器都要大。例如,AMPL Google Group拥有超过 1700 名成员,并且增长迅速。当然,AMPL 在用户基础上无法与 C++ 或 Java 等通用语言竞争,但只有一小部分 C++ 或 Java 用户进行数学优化。

直接使用 Gurobi API 可能会带来性能优势,至少是原生 C API。然而,与求解时间相比,AMPL 增加的开销通常很小,尤其是在 MIP 问题的情况下。

免责声明:我是 AMPL 的软件开发人员。

于 2014-11-11T23:08:28.163 回答