使用Gurobi和AMPL代替使用Gurobi直接API(java,C#,C ++等)解决大型MIP问题有什么优势?使用Gurobi的API代替AMPL是否有性能优势?

最佳答案

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


创建mps文件
使用低级C interface(在cplex中称为callable library
使用特定领域的语言,例如AMPL或GAMS


当时,对于非同寻常的复杂性的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)可以在求解器之间移植。

07-26 00:41