Python解决旅行商问题:深度优先搜索算法详解

旅行商问题(Traveling Salesperson Problem,TSP)是一个经典的组合优化问题,目标是找到遍历所有城市并返回起点最短路径。本文将介绍使用深度优先搜索(Depth-First Search,DFS)算法解决旅行商问题的Python代码,并提供详细的代码解释和示例。

def tsp(current, visited, path, distance):
    '''
    使用深度优先搜索算法解决旅行商问题

    参数:
        current (int): 当前所在城市的编号
        visited (set): 已经访问过的城市编号集合
        path (list): 当前路径
        distance (int): 当前路径的总距离

    返回值:
        tuple: 最短路径和最短距离
    '''
    if len(visited) == n:  # 已经访问了所有城市
        path.append(current)  # 将最后一个城市添加到路径中
        distance += d[current][0]  # 加上回到起点的距离
        return path, distance  # 返回路径和总距离

    min_distance = float('inf')  # 初始化最小距离为无穷大
    min_path = None  # 初始化最短路径为空

    for i in range(1, n):  # 遍历未访问的城市
        if i not in visited:
            visited.add(i)  # 将当前城市添加到已访问集合中
            new_path, new_distance = tsp(i, visited, path + [current], distance + d[current][i])  # 递归调用
            visited.remove(i)  # 将当前城市从已访问集合中移除

            if new_distance < min_distance:  # 更新最小距离和最短路径
                min_distance = new_distance
                min_path = new_path

    return min_path, min_distance


if __name__ == '__main__':
    d = [[0, 300, 360, 210, 530, 475, 500, 690],  # 邻接矩阵,表示城市之间的距离
         [300, 0, 380, 270, 230, 285, 200, 390],
         [360, 380, 0, 510, 230, 665, 490, 680],
         [210, 270, 510, 0, 470, 265, 450, 640],
         [530, 230, 230, 470, 0, 515, 260, 450],
         [475, 285, 665, 265, 515, 0, 460, 650],
         [500, 200, 490, 450, 260, 460, 0, 190],
         [690, 390, 680, 640, 450, 650, 190, 0]]
    n = len(d)  # 城市的数量

    visited = set([0])  # 起点已经被访问
    path, distance = tsp(0, visited, [], 0)  # 调用tsp函数

    print('最短路径为:', path)
    print('最短距离为:', distance)

代码解释:

  1. tsp(current, visited, path, distance) 函数:

    • 功能: 使用递归的方式实现深度优先搜索,寻找最短路径。
    • 参数:
      • current: 当前所在城市的编号。
      • visited: 已经访问过的城市编号集合,使用 set 存储可以提高效率。
      • path: 当前路径,存储已经访问过的城市编号列表。
      • distance: 当前路径的总距离。
    • 返回值: 返回一个元组,包含最短路径和最短距离。
  2. 主函数:

    • 定义了城市间距离的邻接矩阵 d
    • 初始化城市数量 n,已访问城市集合 visited,并将起点城市添加到 visited 中。
    • 调用 tsp 函数,传入初始参数,得到最短路径和最短距离。
    • 打印结果。

总结:

本文介绍了使用深度优先搜索算法解决旅行商问题的 Python 代码,并提供了详细的代码解释。该算法简单易懂,但时间复杂度较高,对于大规模问题效率较低。在实际应用中,可以考虑使用其他更高效的算法,例如动态规划、分支限界法等。

Python解决旅行商问题:深度优先搜索算法详解

原文地址: https://www.cveoy.top/t/topic/fPOi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录