近邻算法示例代码,用于解决旅行商问题(TSP)

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等组合优化问题时,它是一个有用的启发式算法,因为它能够在相对短的时间内找到合理的解决方案。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值