跳转到内容

GLPK/终端输出

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

默认情况下,GLPK 库会定期打印到控制台以指示**朝解决方案前进的进度**。输出的确切形式取决于基础问题是 LP 还是 MIP,在某些情况下,还取决于调用了哪个求解器方法。

相同的终端输出来自 GLPSOL 实用程序和直接使用 GLPK API。因此,本页的信息对使用 MathProg 的建模者和使用 GLPK 可调用库的程序员同样具有重要意义。


控制终端输出

[编辑 | 编辑源代码]

GLPK 为建模者和程序员提供了对终端输出的更多控制。

GLPSOL 的终端输出可以使用命令行参数复制到文本文件--log. 例如

glpsol --model examples/tsp.mod --log tsp.log

使用 GLPK API 的程序员可以通过调用glp_term_out. 来启用和禁用终端输出。钩子函数glp_term_hook可用于拦截终端输出。还提供了更细粒度的输出控制,但此处不作介绍 - 请参阅 GLPK API 手册。

输出缩放

[编辑 | 编辑源代码]

缩放是将线性变换应用于问题约束矩阵以改善其数值特性的过程。有关技术细节,请参阅 GLPK 缩放 页面。

GLPK 可能会在尝试求解之前缩放问题,除非建模者明确禁用了缩放。相反,建模者可以指示必须进行缩放,并且可以选择指定要应用的哪种方法或方法。不幸的是,官方文档中没有介绍缩放的终端输出语法。

例如,调用glp_scale_prob在小型 MIP 问题上没有显式方法标志,则会给出以下终端输出

Scaling...
 A: min|aij| =  1.000e+00  max|aij| =  8.000e+05  ratio =  8.000e+05
GM: min|aij| =  5.494e-01  max|aij| =  1.820e+00  ratio =  3.312e+00
EQ: min|aij| =  3.096e-01  max|aij| =  1.000e+00  ratio =  3.230e+00

其中,通常

  • A 表示原始约束矩阵的条件,A = (aij)
  • GM 表示发生了几何平均缩放
  • EQ 表示发生了均衡缩放
  • 2N 表示发生了将比例因子舍入到最接近的二的幂

请注意,问题首先被“取消缩放” - 意味着任何先前的缩放都被移除 - 然后报告原始约束矩阵的指标。之后是应用的任何缩放方法的结果,按照应用顺序排列。

如果不需要缩放,您应该收到以下消息

Scaling...
Problem data seem to be well scaled

在第一个示例中,GMEQ缩放已应用。该min|aij|max|aij|表示 A 的非零元素的最小和最大绝对值,以及它们的比率通过简单的除法给出。

在 GLPSOL 中,缩放默认启用,但可以使用命令行选项--noscale明确禁用。

单纯形法输出

[编辑 | 编辑源代码]

单纯形法输出语法在glp_simplex调用文档的“终端输出”小节中进行了完整解释doc/glpk.pdf(对于 GLPK 4.55,这是第 2.8.1 节)。

例如,以下行

* 1200: obj = 7.860174791e-03 infeas = 2.810e-29 (1)

表示由于星号 (*),求解器目前正在使用原始单纯形法寻找最优解,已经完成了 1200 次迭代,当前目标值为 0.00786,当前原始或对偶不可行性的总和为 2.81×10−29(接近零),当前固定基本变量的数量为 1。

星号 (*) 也可以是空格 ( ),表示求解器正在使用原始单纯形法寻找原始可行解,或者使用对偶单纯形法寻找对偶可行解。或者是一个管道 (|),表示求解器正在使用对偶单纯形法寻找最优解。

内点法输出

[编辑 | 编辑源代码]

内点法输出语法在glp_interior调用文档的“终端输出”小节中进行了完整解释doc/glpk.pdf的“终端输出”小节中进行了完整解释

例如,以下行

19: obj = 5.522746942e+03; rpi = 2.2e-06; rdi = 4.0e-08; gap = 6.7e-03

(对于 GLPK 4.55,这是第 2.9.1 节)。

表示已经完成了 19 次迭代,当前目标值大约为 5523(在最大化的情况下,符号错误),当前相对原始不可行性为 0.0000022,当前相对对偶不可行性为 0.00000004,当前原始对偶间隙为 0.0067。

MIP 分支定界输出

[编辑 | 编辑源代码]MIP 分支定界输出语法在调用文档的“终端输出”小节中进行了完整解释doc/glpk.pdfglp_intopt

例如,以下行

+ 73068: mip = -5.000000000e-001 <= -2.500000000e-001  50.0% (107; 10024)

(对于 GLPK 4.55,这是第 2.10.5 节)。表示分支定界树中的 10024 个节点已被拒绝,还有 107 个未探索的节点可能导致 MIP 解的改进。迄今为止最好的解是 −0.50。没有比 −0.25(导致 50% 的间隙)更好的解(LP 松弛),对于较大的值,该间隙不会打印。例程ios_relative_gap

将相对 mip 间隙计算为

迄今为止的单纯形法迭代次数为 73068。加号 (+) 目前没有任何意义。

对于相同的单纯形法迭代,可能会出现额外的信息行。此信息目前没有记录。

数值不稳定警告

[编辑 | 编辑源代码]

Warning: numerical instability (primal simplex, phase I)
Warning: numerical instability (primal simplex, phase II)
Warning: numerical instability (dual simplex, phase I)
Warning: numerical instability (dual simplex, phase II)

如果基本解在容差范围内不是原始/对偶可行的,则会显示以下警告消息之一容差通过结构glp_smcp作为字段tol_bndtol_dj

传递给单纯形法求解器,这两个字段的默认值为 1.0e-07。用户可以修改这些容差,但只有在完全理解其含义的情况下才能这样做。

这些警告不是致命的 - 它们只是表明求解器即将改变其求解策略,并且在许多情况下,可以返回令人满意的解。有关更多技术细节,请参阅有关 故障排除 的资料。

这种不稳定性可能是由缩放不良的模型造成的,例如,在使用大 M 方法时使用过大的 M 值。或者当自动模型生成过程中的舍入错误产生 接近零 的系数时。强烈建议查明缩放不良的根本原因并进行修复。

内存管理

[编辑 | 编辑源代码]

Error: x memory block(s) were lost

独立求解器 GLPSOL 会检查在删除环境之前是否已释放所有内存块。如果仍然存在未释放的内存块,则会发出以下错误消息这可能表明 GLPK 库内部存在错误。或者它可能是由客户端程序调用非 API 函数glp_main

造成的 - 严格禁止使用该函数。
华夏公益教科书