跳转到内容

GLPK/Add-Ons

来自维基教科书,自由的教科书,面向开放的世界

此页面描述 GLPK 的“附加组件”——包括 GLPK 代码库的非官方扩展,以提供一些特殊功能。因此,这些扩展需要合适的编译环境。


BAK:分支定界分析工具包

[编辑 | 编辑源代码]
使用 BAK 生成的分支定界树,并使用 gnuplot 渲染

BAK 是用于分析 GLPK 和其他求解器的分支定界行为的工具。 [1] [2] BAK 随 GPL 2.0 许可证和 CPL 1.0 许可证一起分发——用户可以选择使用哪种许可证。

将 BAK 添加到 GLPK

[编辑 | 编辑源代码]

可以使用以下方法下载最新的 BAK 版本

svn checkout https://projects.coin-or.org/svn/CoinBazaar/projects/BAK

可以在 https://projects.coin-or.org/CoinBazaar/browser/projects/BAK/ 查看源代码。

BAK 在以下目录中提供了一些针对 GLPK 的修补源文件bak/interfaces/GLPK. 首先将这些文件复制到正常的 GLPK 源代码目录,然后重新构建 GLPK(参见章节 编译 GLPK)。

修改后的独立求解器 GLPSOL 会写入一个包含分支信息的文件。此文件的名称使用命令行选项指定--bakfile, 例如

glpsol --bakfile tsp.bak -m tsp.mod

该文件包含有关创建的节点、分支过程、遇到的整数不可行性和运行时进度的信息。该文件格式在 [1] 中有说明。例如,该文件可能以以下几行开头。

#SOLVER: GLPK
#PROBLEM: (null)
0.002000 branched 1 0 M 6030.000000 6.466667 32
0.002000 candidate 2 1 L
0.002000 candidate 3 1 R
0.004000 branched 2 1 L 6030.000000 6.466667 30
0.004000 candidate 4 2 L
0.004000 candidate 5 2 R
0.006000 branched 4 2 L 6069.000000 7.533333 32
0.006000 candidate 6 4 L
0.006000 candidate 7 4 R
0.008000 branched 7 4 R 6069.000000 7.266667 30
0.008000 candidate 8 7 L
0.008000 candidate 9 7 R
0.009000 infeasible 9 7 R
...

可以使用 python 脚本创建中间文件,以便使用 gnuplot 可视化这些信息

python bak/BAK_visual.py --all tsp.bak

可以使用 PNG 文件查看器(例如 evince)查看生成的文件

evince tree_alt.004.png

丹齐格-沃尔夫分解

[编辑 | 编辑源代码]

丹齐格-沃尔夫分解 是一种将结构适当的 LP 问题分解为子问题的方法——然后分别解决这些子问题,通常是并行解决。基础约束矩阵需要某种形式的块结构。该技术最初是在 1960 年提出的,鉴于廉价的多核个人计算机的出现,它引起了人们的重新兴趣。

丹齐格-沃尔夫求解器项目 现在托管在 SourceForge 上,提供了使用 GLPK 的丹齐格-沃尔夫的通用并行实现。该代码由 Joey Rios 编写。第一个公开发布版本 1.0 于 2010 年 10 月 15 日上传。

该实现使用 Pthreads 线程管理库。GLPK 需要进行少量修改才能允许其并发运行。因此,GLPK 的全部内容都包含在丹齐格-沃尔夫求解器项目的代码库中。除了 Pthreads 之外,不需要其他专业库。

该代码已成功构建在 Mac OS X 10.5 和 10.6、Red Hat Enterprise Linux 以及通过 cygwin 的 Windows XP 上。

作者希望这个工具能为丹齐格-沃尔夫分解的进一步研究提供一个起点。事实上,虽然跨多个领域的许多论文都利用了 DW,但这可能是唯一提供 DW 源代码供开放测试和开发的项目。

该软件有一些限制。截至 2010 年 10 月,只能使用 LP 公式,子问题必须是有界的。也可能存在错误。

建模者为主问题和每个子问题提供 CPLEX LP 输入文件。还需要一个简单的引导文件,该文件告诉命令行工具所有内容在哪里。该代码库包含从教科书和网站上获取的或由作者开发的几个 DW 示例。

有关一般情况下和并行计算下丹齐格-沃尔夫分解的评估,请参见 Tebboth (2001)。[3] 有关空中交通管制应用程序,请参见 Rios 和 Ross (2010)。[4]

参考文献

[编辑 | 编辑源代码]
  1. Hunsaker, Brady. "分支定界分析工具包(BAK)". {{cite journal}}: Cite journal requires |journal= (help)
  2. Ozaltin, Osman Y.; Hunsaker, Brady; Ralphs, Ted K. (2007). "可视化分支定界算法" (PDF). {{cite journal}}: Cite journal requires |journal= (help)
  3. Tebboth, James Richard (2001). 丹齐格-沃尔夫分解的计算研究 (PDF) (博士论文). 英格兰白金汉大学.
  4. Rios, Joseph; Ross, Kevin (2010). "应用于流量调度的大规模并行丹齐格-沃尔夫分解" (PDF). 航空航天计算、信息与通信杂志. 7 (1): 32–45.
华夏公益教科书