Data Structures Algorithms 简明教程

Travelling Salesman Problem (Greedy Approach)

旅行商问题是图论中的一个计算问题,其中旅行商需要访问列表中的所有城市(表示为图中节点),并且已知所有城市之间的距离(表示为图中各边)。此问题需要找到一条最短路径,路径中旅行商访问了所有城市并返回至出发城市。

请看下方的图,假设旅行商从顶点“a”出发,他们需要访问剩余的顶点 b、c、d、e、f,并回到“a”,同时确保花费最小。

salesman graph

有各种方法可以找到旅行商问题的解决方案:朴素方法、贪婪方法、动态规划方法等。在本教程中,我们将学习如何使用贪婪方法解决旅行商问题。

Travelling Salesperson Algorithm

如贪婪方法所定义,我们需要找到局部最优解决方案,以找出全局最优解决方案。算法采用的输入是图 G {V, E},其中 V 是顶点集,E 是边集。图 G 从一个顶点出发再回到同一顶点的最短路径作为输出。

Algorithm

  1. 旅行商问题以图 G {V, E} 作为输入,并将另一个图声明为输出(比如 G'),它将记录旅行商从一个节点前往另一个节点的路径。

  2. 算法首先将图 G 中的所有边从最小距离到最大距离进行排序。

  3. 选择的第一个边是最小距离的边,两个顶点(比如 A 和 B)中的一个是出发节点(比如 A)。

  4. 然后在该节点(B)除出发节点外的相邻边中,找到最小成本的边,并将其添加到输出图中。

  5. 继续处理其他节点,确保输出图中没有环,并且路径返回到始发节点 A。

  6. 但是,如果在给定问题中提到了开始节点,则解决方案必须始终仅从该节点开始。让我们看一些示例问题以更好地理解这一点。

Examples

考虑以下具有六个城市及城市之间距离的图形 -

graph six cities

从给定的图中,由于已经提到了起始点,所以解决方案必须始终从该节点开始。在从 A 出发的边中,A → B 具有最短距离。

graph a to b

然后,B → C 具有它们之间最短且唯一的边,因此它被包含在输出图中。

graph b to c

在 C → D 之间只有一个边,因此它被添加到输出图中。

graph c to d

D 有两条向外边。即使 D → B 比 D → E 距离更短,B 也已被访问过一次,如果将其添加到输出图中,它将形成一个环。因此,D → E 被添加到输出图中。

graph d to e

从 e 只有一个边,即 E → F。因此,它被添加到输出图中。

graph e to f

同样,即使 F → C 比 F → A 距离更短,F → A 也被添加到输出图中,以避免形成环,并且 C 已被访问过一次。

graph f to a

从 A 开始并结束于 A 的最短路径是 A → B → C → D → E → F → A

路径的成本是:16 + 21 + 12 + 15 + 16 + 34 = 114。

即使如果路径从其他节点开始,路径的成本可能会降低,但问题并未就此提出。

Example

下面给出了使用贪心算法实现旅行商问题的完整代码 -