import sys
def nearest_neighbor_tsp(adj_matrix):
num_cities = len(adj_matrix)
visited = [False] * num_cities # 用于标记城市是否已经访问过的列表
tour = [0] # 起始城市为0,将其添加到路径中
tour_length = 0 # 记录路径的总长度
for _ in range(num_cities - 1):
current_city = tour[-1] # 获取当前城市,从路径中的最后一个城市开始
nearest_city = None # 用于存储距离当前城市最近的未访问城市
min_distance = sys.maxsize # 初始化最小距离为一个极大值
# 遍历所有城市,找到距离当前城市最近的未访问城市
for city in range(num_cities):
if not visited[city] and adj_matrix[current_city][city] < min_distance:
nearest_city = city
min_distance = adj_matrix[current_city][city]
tour.append(nearest_city) # 将最近的未访问城市添加到路径
tour_length += min_distance # 更新路径长度
visited[nearest_city] = True # 标记最近的未访问城市为已访问
# 回到起始城市,完成路径
tour.append(tour[0])
tour_length += adj_matrix[tour[-2]][tour[0]]
return tour, tour_length # 返回路径和路径长度
# 示例用法
if __name__ == "__main__":
# 示例邻接矩阵,表示城市之间的距离
adjacency_matrix = [
[0, 29, 20, 21],
[29, 0, 15, 17],
[20, 15, 0, 28],
[21, 17, 28, 0]
]
# 调用最近邻算法求解TSP问题
tour, tour_length = nearest_neighbor_tsp(adjacency_matrix)
# 打印结果
print("最近邻算法得到的近似最短路径:")
print("路径顺序:", tour)
print("路径长度:", tour_length)
最近邻算法(Nearest Neighbor Algorithm)是一种用于解决旅行商问题(Traveling Salesman Problem,TSP)的贪心算法。其基本思想是从起始城市开始,每次选择距离当前城市最近的未访问城市作为下一站,直到所有城市都被访问过一次,然后返回起始城市,形成一条路径。
以下是最近邻算法的基本思想和步骤:
1. **选择起始城市**:从城市集合中选择一个城市作为起始点,可以是任何城市。
2. **初始化路径和长度**:将起始城市添加到路径中,并将路径长度初始化为0。
3. **迭代过程**:重复以下步骤,直到所有城市都被访问过:
- 从当前城市出发,找到距离最近的未访问城市。
- 将最近的未访问城市添加到路径中,并将路径长度增加上从当前城市到最近城市的距离。
- 将最近的未访问城市标记为已访问。
4. **回到起始城市**:在所有城市都被访问后,将路径的最后一个城市设置为起始城市,形成一条回路。
5. **计算路径长度**:计算路径的总长度,即旅行商访问所有城市的总距离。
6. **返回结果**:返回构建的近似最短路径和路径长度。
最近邻算法的优点是简单且容易实现,适用于小规模问题。然而,它并不能保证找到最优解,因为它是一种贪心算法,每次只选择最近的城市,可能会陷入局部最小值。对于大规模问题,最近邻算法通常会得到次优解,但在解决TSP等组合优化问题时,它是一个有用的启发式算法,因为它能够在相对短的时间内找到合理的解决方案。