
在与我的 GSoC 导师讨论我们都认为 Asadpour 算法中最困难的部分——Held-Karp 松弛后,我们得出了一些结论。
- Asadpour 论文建议使用椭球法,以便他们的算法在多项式时间内运行。我们不需要多项式时间,只需要一个具有合理执行时间的算法。例如,椭球算法与单纯形算法。虽然单纯形算法是指数级的,但在实践中它几乎总是比椭球算法快。
- 我们对椭球算法的兴趣并非基于性能,而是基于椭球算法能够处理具有指数数量约束的线性规划的能力。这是通过分离预言机实现的,有关预言机的更多信息,请参阅我的文章此处。
- 实现一个健壮的椭球算法求解器(科学 Python 生态系统中缺少的显著内容)本身就是一个 GSoC 项目,并且超出了 NetworkX 此项目的范围。
因此,需要研究解决 Held-Karp 松弛的替代方法。为此,我们转向了 Held 和 Karp 在 1970 年的原始论文《旅行商问题和最小生成树》,以了解他们如何提出解决松弛的方法(请注意,这篇论文是在 1979 年将椭球算法应用于线性规划之前发表的)。Held 和 Karp 的论文讨论了三种解决松弛的方法
- **列生成:**一种较旧的解决非常大的线性规划的方法,其中只需要检查影响最优解的变量。
- **上升法:**一种基于最大化线性规划对偶的方法,其最佳描述是在类似于多元微积分中梯度概念的方式下寻找目标函数的上升方向。
- **分支定界:**这种方法具有最多的理论优势,并试图增强上升法以避免引入分数权重,分数权重是导致收敛速度慢的主要因素。
但在我们探索 Held 和 Karp 讨论的方法之前,我们需要确保这些方法仍然适用于在 Asadpour 论文的背景下解决 Held-Karp 松弛。我一直在本博客中使用的 Held-Karp 松弛的定义来自 Asadpour 论文的第 3 节,如下所示。
Held Karp 论文中与此程序最接近的匹配是他们的线性规划 3,它是整个旅行商问题的线性规划表示,而不仅仅是松弛版本。请注意,Held 和 Karp 正在处理对称 TSP(STSP),而 Asadpour 则处理不对称或有向 TSP(ATSP)。
第二个线性规划中的最后两个约束是正确约束的,并且符合原始问题的范围,而前两个约束在找到 TSP 巡回路方面做了大部分工作。此外,将最后两个约束更改为
Held 和 Karp 还指出
在本节中,我们证明最小化差距
等效于无需整数约束地求解此程序。
在第 1141 页,因此,似乎求解 Held 和 Karp 公式化的等效程序之一应该在这里起作用。
列生成技术#
列生成技术旨在求解 Held 和 Karp 论文中的线性规划 2,表示为
其中
此方法的其余部分使用单纯形算法来求解线性规划。我们只关注每个 1-树中的边,使每一列的形式为
以及进入解的列,该列位于
我已经熟悉单纯形方法,因此我不会在这里详细介绍它的实现。
列生成技术的性能#
这种技术收敛速度很慢。Held 和 Karp 在 IBM/360 上对其进行了编程,并且能够解决最多
他们还谈到了一个启发式过程,其中每当其相邻顶点的选择“明显”时,就会从程序中消除一个顶点。启发式的技术细节基本上不存在,但是
该程序在最多
的示例中显示出希望,但没有进行系统地探索。
上升法#
Held 和 Karp 的这篇论文是关于最小化
此方法使用一组 1-树的索引,这些 1-树相对于权重
如果
现在,对于足够小的
所以换句话说,
如果我们能找到
- 将
设置为零 向量。 - 找到一个 1-树
,使得 。 - 如果
停止。 对于- 转到 2。
为了使该过程在 Python 中可实现,必须对其进行两方面的改进。
- 我们如何在步骤 2 中找到提到的 1-树?
- 我们如何知道何时不存在上升方向?(即,我们如何知道何时达到
的最大值?)
Held 和 Karp 针对这两个问题都提供了指导。在关于拟阵的第 6 节中,我们被告知要使用 Dijkstra 在《关于图的两个问题的注记》中开发的一种方法,但在这种特殊情况下,该方法并不是最有帮助的。我找到了这份文档,但 NetworkX 中已经有一个名为 minimum_spanning_arborescence
的函数,我们可以用它来创建一个最小 1-树形图。该过程是在
最后,在
因此,当怀疑无法终止时,有必要检查是否存在上升方向;根据 Minkowski-Farkas 引理,这等价于存在非负系数
,使得
这可以通过线性规划来检查。
虽然他们给出了这个求和式,但线性规划的其余部分也很有用。整个线性规划可以写成如下形式
此线性规划不是标准形式,但将其转换并不困难。首先,通过最小化负值将最大化更改为最小化。
虽然约束直观上不是标准形式,但仔细观察就会发现它确实是。矩阵形式中的每一列都对应于
因为所有求和必须等于零,所以不需要松弛变量和剩余变量,因此该程序的约束矩阵为 linprog
函数求解。
作为实现说明,首先我可能会在每次迭代中检查终止条件,但最终我们可以找到它必须执行的迭代次数,然后才能开始检查终止条件以节省计算能力。
终止条件的一个可能困难是,我们需要使用来自每个最小 1-树或 1-树形图的数据运行线性规划,这意味着我们需要能够生成所有最小 1-树。目前,在 NetworkX 中似乎没有简单的方法可以做到这一点。查看此处 树算法,它们似乎只专注于找到所需类型的一个最小分支,而不是所有这些分支。
现在我们必须找到
令
为 的任何元素,其中 是 处的上升方向。则
第一步是确定
从该方程,我们可以推导出
因此,我们现在可以找到任何两对彼此替代的边的 find_cycle
。
下面是我草拟的利用定理 4 查找
# Input: An element k of K(pi, d), the vector pi and the vector d.
# Output: epsilon(pi, d) using Theorem 4 on page 1150.
for each edge e in the graph G
if e is in k:
continue
else:
add e to k
let v be the terminating end of e
c = find_cycle(k, v)
for each edge a in c not e:
if a[cost] = e[cost] and d[i] + d[j] = d[r] + d[s]:
continue
epsilon = (a[cost] - e[cost])/(d[i] + d[j] - d[r] - d[s])
min_epsilon = min(min_epsilon, epsilon)
remove e from k
return min_epsilon
上升方法的性能#
上升方法也很慢,但在现代计算机上会更好。当 Held 和 Karp 对其进行编程时,他们在一些最多 25 个顶点的小问题上对其进行了测试,虽然每次迭代的时间很短,但迭代次数却迅速增加。他们没有评论这种方法是否比列生成技术更好,但确实指出他们没有确定这种方法是否始终收敛到
分支定界方法#
在与我的 GSoC 导师交谈后,我们认为这是我们可以为 Held-Karp 松弛(Asadpour 算法所需)实现的最佳方法。上升方法嵌套在此方法中,因此需要深入探讨之前的方法才能实现此方法。此方法中的大多数符号都从上升方法中重复使用。
分支定界方法利用了顶点可能出现不平衡的概念。如果
则顶点
则顶点
如果我们知道某个顶点在任一方向上都是不平衡的,那么我们就知道上升方向,并且该方向是单位向量。令
第 1151 页上的推论 3 和 4 也表明,当顶点不平衡时,查找
推论 3. 假设顶点
为低不平衡,并令 为 的元素。则 ,使得 是 中 的替代,并且 。
推论 4. 假设顶点
为高不平衡。则 ,使得 是 中 的替代,并且 。
这些推论可以使用上面在上升方法部分查找
一旦不再存在不平衡顶点,上升方向就不是单位向量,并且会引入分数权重。这是上升方法收敛到最优解速度大幅下降的原因,因此应尽可能避免这种情况。
在我们讨论实现细节之前,仍有一些主要内容需要回顾。令
从这些函数中,出现了高不平衡和低不平衡的修订定义,允许顶点相对于
在分支定界方法完成过程中,分支在一个列表中跟踪,其中每个条目具有以下格式。
其中
在方法的每次迭代中,我们考虑具有最小界限的列表条目,并尝试查找不平衡顶点。如果我们找到一个,我们将使用简化的单位向量作为上升方向,应用一次上升方法迭代。在这里,如果存在整数权重,我们可以利用它们。也许 NetworkX 中 Asadpour 实现的文档应该说明整数边权重会表现更好,但该说法需要由我们的测试来支持。
如果不存在失衡顶点,我们仍然需要找到上升方向以确定是否处于
分支过程如下。从条目
在 Held 和 Karp 论文的第 1153 页到第 1156 页给出了分支定界方法的一个例子。
为了实现此方法,除了修改上升方法的一些细节外,我们还需要能够确定。
- 如果一个顶点相对于
和 在任一方向上都处于失衡状态。 - 在
中搜索一个巡回路线。
Held 和 Karp 论文指出,为了找到失衡顶点,我们只需要测试单位向量即可。如果对于
如果我们可以枚举该集合中的最小 1-树,那么在
我能够找到的关于此问题的最有希望的研究论文是 Sörensen 和 Janssens 在 2005 年发表的题为《An Algorithm to Generate all Spanning Trees of a Graph in Order of Increasing Cost》的论文 这里。从这里,我们生成生成树或树枝直到成本上升,此时我们已经找到了
分支定界方法的性能#
Held 和 Karp 没有编写此方法的程序。我们有一些理由相信此方法的性能将是最佳的,因为它是为了改进上升方法而设计的,而上升方法经过了(某种程度上的)测试,直到
参考文献#
A. Asadpour、M. X. Goemans、A. Mardry、S. O. Ghran 和 A. Saberi,《An o(log n / log log n)-approximation algorithm for the asymmetric traveling salesman problem》,运筹学,65(2017),第 1043-1061 页,https://homes.cs.washington.edu/~shayan/atsp.pdf。
Held, M., Karp, R.M. 《The traveling-salesman problem and minimum spanning trees》。运筹学,1970 年 11 月 1 日,第 18 卷(第 6 期),第 1138-1162 页。 https://www.jstor.org/stable/169411