使用约减矩阵法解决旅行商问题 (TSP)


旅行商问题是人工智能和运筹学中的一个热门话题。自从它首次被提出以来,已经发表了大量的论文,提供了解决这个问题的各种方法。此外,相关的从业人员提出了一系列新的公式,试图拓宽基本TSP的应用。

旅行商问题:定义

旅行商问题 (TSP) 的正式定义如下:

给定一系列城市及其之间的距离,找到一条最短路径,这条路径恰好访问每个城市一次并返回到起始城市。

更多关于这个问题

TSP接收n个城市的集合,其中n是一个大于2的正整数。每个城市都有一个唯一的标识符,连接城市的物理距离以距离矩阵的形式提供,矩阵中的第i个元素表示从城市i到城市j的距离。

TSP生成城市的排列作为输出,指示访问每个城市的正确顺序。通过总结排列中每个连续城市对之间的长度,可以确定路径的长度。目标是找到使路线总距离缩短到最短可能的长度的排列。

为了本文的目的,我们将使用一个包含四个不同城市A、B、C和D的基本示例。该示例的距离矩阵如下:

A

B

C

D

A

0

4

8

7

B

4

0

2

3

C

8

2

0

6

D

7

3

6

0

在本例中,TSP需要找到一条最短路径,恰好访问每个城市一次,然后返回到起始位置。A到D到B到C到A是一条可能的路径,总长度为7 + 3 + 2 + 8 = 20。这意味着我们从城市A前往城市D,然后到城市B,接着是城市C,最后回到城市A。

约减矩阵

这种方法类似于所谓的分支限界法。在这种情况下,路径成本和边界的决策是使用矩阵约减法做出的。这些假设与约减矩阵有关:

  • 当且仅当代价邻接矩阵的行或列至少有一个零元素,而其所有其他元素都大于或等于零时,该矩阵才是约减的。

  • 只有当每一列和每一行都被约减时,矩阵才被约减。

  • “路径长度(旧) - 约减的总值 = 路径长度(新)”

  • 我们首先将初始代价邻接矩阵中的所有对角线元素从0替换为无穷大。

使用约减矩阵法求解TSP

解决这个问题的主要原理如下:

  • 约减矩阵的起始距离是解决“旅行商问题”的最小可行距离。

  • 接下来,在每个阶段,必须确定如果遵循该路径的最小距离。

  • 可以通过将第j列和第i行的距离替换为无穷大,然后约减矩阵,并将额外距离添加到之前确定的最小路径距离中来实现这一点。

  • 当找到至少一条最小路径距离时,它将被用作应用“分支限界”方法于剩余路径的距离的“上限”,并且每次出现具有更短距离的另一条路径时,都会更新上限。

示例

以下是以上方法在各种编程语言中的实现:

Open Compiler
#include<iostream> using namespace std; int tsp_g[10][10] = { {17, 30, 33, 10, 25}, {66, 22, 19, 15, 18}, {89, 13, 8, 25, 15}, {33, 25, 16, 30, 3}, {25, 33, 35, 24, 37} }; int visited[10], n = 5, cost = 0; void travellingsalesman(int c){ int adj_vertex = 999; int min_val = 999; visited[c] = 1; cout<<c + 1<<" "; for(int k = 0; k<n; k++){ if (tsp_g[c][k] != 0 and visited[k] == 0){ if (tsp_g[c][k] < min_val){ min_val = tsp_g[c][k]; } adj_vertex = k; } } if (min_val != 999){ cost += min_val; } if (adj_vertex == 999){ adj_vertex = 0; cout<<adj_vertex + 1; cost += tsp_g[c][adj_vertex]; return; } travellingsalesman(adj_vertex); } int main(){ cout<<"Shortest Path: "; travellingsalesman(0); cout<<"\nMinimum Cost: "; cout<<cost; }

输出

根据以上代码

Shortest Path: 1 5 4 3 2 1
Minimum Cost: 129
Open Compiler
tsp_g = [ [17, 30, 33, 10, 25], [66, 22, 19, 15, 18], [89, 13, 8, 25, 15], [33, 25, 16, 30, 3], [25, 33, 35, 24, 37] ] visited = [0] * 10 n = 5 cost = 0 def travellingsalesman(c): global cost adj_vertex = 999 min_val = 999 visited[c] = 1 print(c + 1, end = " ") for k in range(n): if (tsp_g[c][k] != 0 and visited[k] == 0): if (tsp_g[c][k] < min_val): min_val = tsp_g[c][k] adj_vertex = k if (min_val != 999): cost = cost + min_val if (adj_vertex == 999): adj_vertex = 0 print(adj_vertex + 1, end = " ") cost += tsp_g[c][adj_vertex] return travellingsalesman(adj_vertex) print("Shortest Path: ", end = " ") travellingsalesman(0) print("\nMinimum Cost: ", cost)

输出

Shortest Path:  1 4 5 2 3 1 
Minimum Cost:  154

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

旅行商问题:实际应用

TSP主要应用于以下方面:

  • 车辆路线规划 - TSP通常用于运输和配送路线优化。对于配送公司而言,这个问题很重要,因为它有助于降低燃油消耗、减少所需的车辆数量并确保产品及时送达。

  • 生物学 - TSP用于研究蛋白质折叠,以折叠成其最终的三维结构。

  • 电路设计 - 它有助于确定最短路径,从而最大限度地减少电路的总电阻和电容。

结论

旅行商问题是一个广为研究的优化问题,其描述为确定一条最短路径,该路径恰好访问一组城市一次,然后返回到起点。有几种算法可以解决TSP,每种算法都具有其自身的优缺点。这些案例都突出了TSP的适应性和其用于解决各种情况的能力。

更新于:2023年11月2日

1K+ 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告