📜  证明旅行商问题是 NP Hard(1)

📅  最后修改于: 2023-12-03 15:12:09.100000             🧑  作者: Mango

证明旅行商问题是 NP Hard

旅行商问题(TSP,Traveling Salesman Problem)是指给定一个地图和一个旅行者,求出该旅行者从其目前所在位置出发,经过地图上所有的点恰好一次后回到原始位置的最短路线。

NP Hard 是指一个问题属于不确定多项式时间(Non-deterministic Polynomial-time)的复杂度类,即如果能够在多项式时间内验证该问题的解是否正确,就可认为该问题属于 NP Hard。

证明

我们通过归约另一个 NP Hard 问题来证明旅行商问题也是 NP Hard。这个问题就是集合覆盖问题(Set Cover Problem)。

集合覆盖问题是指给定一个集合 U,以及 U 的子集的列表 S1,S2,……,Sm,问是否存在 S 的一个子集 Sj 的并集恰好为 U。

我们将集合覆盖问题归约到旅行商问题。具体来说,我们将集合 U 中的每个元素都看作城市,U 的每个子集作为一条路径,并将其路径长度定义为该子集的大小。

为了形式化这个问题,假设 U 中有 n 个元素,S 中的元素是 U 的子集。我们要制作一个旅行商问题图,其中每个城市对应于 U 中的一个元素,每条路径对应于一个 S 中的元素。每次访问路径中的所有城市,就相当于将该路径中对应的子集 Sj 添加到集合 X 中,并且 X 的大小会随之增加。最终,当 X 中包含所有 n 个元素时,旅行商就完成了旅行。

由定义可知,必须通过每条路径恰好一次,并且回到出发城市,因此这实际上是一个旅行商问题。

我们需要证明以下两个内容:

  1. 证明归约的正确性:即如果集合覆盖问题是可解的,则旅行商问题也是可解的。
  2. 证明旅行商问题是 NP Hard。
证明归约的正确性

如果集合覆盖问题是可解的,那么就意味着我们可以找到一个子集合 Sj,其中 Sj 的并集恰好为 U。

如果我们采用将集合 U 中每个元素看作城市,并将每个子集看作路径的方法构建旅行商问题图,则必须经过 Sj 中的每个城市,才能实现对子集 Sj 的覆盖。因此,旅行商问题图中 Sj 对应的路径必须在旅行商的旅行路径上。

根据集合覆盖问题的定义,我们知道子集 Sj 中包含的任何城市至少出现在任何一个其他路径中。这意味着,无论采用哪个包含子集 Sj 的路径作为路径的其余部分,旅行商旅行完成后都必须覆盖子集 Sj。

将子集 Sj 中的城市添加到 X 中后,我们可以继续在旅行商问题图中旅行来寻找子集 Sj 中未加入集合 X 的城市。由于 X 中不包含子集 Sj 以外的城市,因此我们需要寻找另一个包含剩余城市的路径。我们可以通过一次旅行来完成这个过程,并确保每个路径只覆盖一次。

最终按照覆盖集合 U 的顺序依次访问集合中的城市,就可以找到一条旅行商问题的最短路径。这证明了归约的正确性。

证明旅行商问题是 NP Hard

为了证明旅行商问题是 NP Hard,我们需要将旅行商问题归约到一个已知的 NP Hard 问题。这里我们选择将旅行商问题归约到 Hamiltonian Circuit Problem。

Hamiltonian Circuit Problem 是指给定一个无向图,求是否存在一个哈密顿回路,即一条经过图中每个顶点一次且仅一次的回路。

我们将 Hamiltonian Circuit Problem 归约到旅行商问题。具体来说,我们将图中每个顶点看作城市,将每条边看作连接城市的路径,并将其路径长度定义为该边的权重。我们将权重定义为 1,因为旅行商需要访问每个城市恰好一次。

为了形式化问题,我们假设有一个具有 n 个节点的无向图 G 和其对应的旅行商问题图 T.

对于无向图 G 中的每一条没有覆盖的边 (i, j),我们可以构建一个包含 n 条路径的 T 的子图,其中包含三个路径:

  • 从 i 到 J 的直接路径,长度为 1;
  • 从 i 到 j 再从 j 到 i 的回路,长度为 3;
  • 从 j 到 i 的直接路径,长度为 n - 2.

这些路径可以合并为两条路径,即从 i 到 j 再从 j 到 i 的回路,长度为 2n-2,和从 i 到 j 的直接路径,长度为 1。这给出了一个旅行商问题的实例,其中每个城市都是无向图 G 中的节点,路径的权重为 1. 由于每个城市恰好只有两条路径与之相连,因此该问题的解必须形成 Hamiltonian 回路。

这证明了旅行商问题与 Hamiltonian Circuit Problem 的可归约性,即旅行商问题是 NP Hard。

结论

我们就此证明了旅行商问题是一个 NP Hard 问题。这意味着我们即使在理论上也不能保证可以在多项式时间内找到旅行商问题的最优解。因此,在实际应用中常常需要寻求近似解或者采用剪枝等方法来降低计算时间和空间的开销。