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
在第一个示例中,GM和EQ缩放已应用。该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