GAMS 求解器:使用哪一个

计算科学 线性规划 非线性规划
2021-11-30 19:38:34

前几天我和一个朋友讨论了 GAMS 求解器,我们想知道求解器之间的数学差异是什么。哪一个用于哪种问题?如何知道要使用哪些求解器以及如果选择了“错误”求解器会发生什么?

2个回答

在 GAMS 文件的某处,在您声明了几乎所有模型之后,您必须编写一个形式为 的求解语句solve <your_problem> using <formulation> {minimizing|maximizing} <your_objective_function_variable>;,其中:

  • <your_problem>应替换为您的问题的名称
  • <formulation>是 GAMS 公式类型之一(lpmipnlp等)
  • {minimizing|maximizing}表示您正在解决最小化问题或最大化问题,因此请选择两者之一
  • <your_objective_function_variable>是您用来编码目标函数的任何 gams 变量

给定一个公式类型,GAMS 提供了一个求解器列表,您可以使用这些求解器来求解该类型的公式因此,如果您使用了错误的公式和求解器组合,GAMS 将返回错误。

您可能希望选择满足您在 GAMS 文件中声明的公式的最严格的公式类型。也就是说,您可以写出 LP,然后写入 GAMS 文件solve MyProblem using nlp minimizing z;,但 LP 求解器通常会利用额外的结构来加快求解速度。

对于通用求解器建议,您可以查看Hans Mittelmann 的基准数据以获得通用建议。

我的经验如下,需要注意的是求解器的性能显然取决于问题实例和输入参数,您应该尝试多个求解器和参数调整以获得最佳性能,并且您绝对应该自己参考 Mittelmann 的基准:

LP/QCP/MIP/MIQCP 求解器:如果可能,使用 CPLEX 或 Gurobi。这两个求解器是同类中最好的,并且比其他任何求解器快 10 倍左右。SCIP 也很不错,CBC 是最好的免费选项之一。

NLP 求解器(凸):CONOPT 和 DICOPT 适用于中小型问题;对于中等规模的问题,SNOPT 也很有效;对于大规模问题,我会先使用IPOPT。

MINLP/NLP(非凸):BARON 被认为是一段时间的黄金标准。ANTIGONE 比较新,值得一试。COUENNE 和 BONMIN 也是不错的选择。

对于 MILP,最好的求解器是 GAMS、LINGO 和 Gurobi 在 Python 中提供的 CPLEX。您应该拥有这些求解器的完整版本。在这三个求解器中,没有一个求解器优于。