跳至内容

GLPK/GMPL 文件处理步骤

来自维基教科书,开放的书籍,开放的世界

本页面描述 GLPK 处理用 GMPL(也称为 MathProg)编写的模型时所采取的步骤。

处理步骤

[编辑 | 编辑源代码]

GLPK 通过一系列步骤求解模型。

模型部分翻译

[编辑 | 编辑源代码]

GMPL 文件的模型部分被解析,并创建描述不同对象(如变量、约束和表达式)的内部结构。此阶段由函数执行glp_mpl_read_model.

数据部分翻译

[编辑 | 编辑源代码]

模型文件的数据部分用于初始化参数和集合。如果数据部分包含在模型文件中,则此阶段由函数执行glp_mpl_read_model. 如果提供了数据文件(可选),则此阶段由函数执行glp_mpl_read_data.

模型生成

[编辑 | 编辑源代码]

在此阶段,模型中直至 GMPL solve 语句的语句和表达式都会被求值。此阶段由函数执行glp_mpl_generate. 模型生成可能在计算上很昂贵,用户应该预期生成大型或复杂模型的过程需要时间。

约束本身将根据以下规则进行标准化

原始形式 标准形式


对偶值使用约束的标准形式进行计算。这意味着,在以下示例中,c2的对偶值将相对于c1的对偶值取相反符号,用于否则等效的约束公式

s.t. c1 : 3 * z = 1;
s.t. c2 : 1 = 3 * z;

因此,在解释非标准约束的对偶值时需要谨慎。反之,良好的做法建议在实际情况下使用标准形式。

模型构建

[编辑 | 编辑源代码]

创建求解器的实例问题。此阶段由函数执行glp_mpl_build_prob. 如果没有在前面调用glp_mpl_generate.

通过调用适当的求解器来尝试求解:单纯形、内点或 MIP。

求解后处理

[编辑 | 编辑源代码]

求解器调用的结果被转移回 GMPL 变量和约束。模型文件中 solve 语句之后的语句都会被执行。此阶段由函数执行glp_mpl_postsolve.

进一步学习

[编辑 | 编辑源代码]

更多细节可以通过检查以下内容获得:

  • 函数glp_main在实现文件src/glpapi19.c(截至 GLPK 4.45)
  • 第 3.2 章 用于处理 MathProg 模型的例程 中的示例doc/glpk.pdf来自源代码分发。

预先设置

[编辑 | 编辑源代码]

使用 GLPSOL 时,无法指定可行(但可能是次优)的起始解 - 但此功能在使用 GLPK API 进行编程时受支持,使用 回调挂钩 的分支定界算法。

华夏公益教科书