本文所涉及所有资源均在传知代码平台可获取

一、背景介绍

旅行商问题(Traveling Salesman Problem,TSP)是组合优化领域中的经典难题,在物流配送、路径规划、电路布线等众多实际场景中具有广泛应用。其目标是找到旅行商遍历所有城市且不重复、最终回到起点的最短路径,然而随着城市数量的增加,问题的复杂性呈指数级增长,传统的精确算法在处理大规模TSP问题时面临巨大挑战,往往需要耗费大量时间和计算资源。

匈牙利算法是求解分配问题的经典算法,通过将TSP问题转换为分配问题的形式,并引入破环机制,提出了破环匈牙利算法,为TSP问题的求解提供了一种新的思路。本复现旨在深入理解和验证基于改进匈牙利算法在解决TSP问题上的有效性和性能表现,为相关领域的路径优化问题提供参考和借鉴。
原文链接

二、算法原理

(一)问题转换

  1. TSP问题到分配问题的转换
    • 转换方法
      • 拆分节点:将原问题的(N)个节点拆分为(2N)个节点,每个节点拆分为两个,如节点(A)拆分为(A_1)和(A_2)。
      • 重排点:将编号下标为(1)的点写为一列放在左边,下标为(2)的点写为一列放在右边。
      • 增加实际路径:将原TSP问题中的路径转换为新描述方法中的路径,标注在相应位置且不改变权重。
      • 增加辅助路径:为每行点对增加从右侧点指向左侧点的辅助路径,权重为(0)。
    • 等价性证明
      • 控制变量一一对应:新问题决策变量与原问题二元变量一一对应,且新问题求解取决于原问题对应边的取舍。
      • 可行解与不可行解一一对应:原问题可行解在新问题中可行且路径长度相等,反之亦然。不可行解情况如未经过所有点或某个点经过多次在两个问题中也相互对应。
      • 最优解一一对应:由于可行解对应且目标函数值相等,所以最优解也一一对应。

(二)新TSP问题与分配问题的关系

  1. 必要条件:对应分配问题的可行解是新TSP可行解的必要条件。若新TSP问题可行解,则其必为对应分配问题的可行解,因为两者在点的经过和边的选择要求上具有一致性。
  2. 充分条件:对应分配问题的可行解与辅助边结合后仅包含一个环路是新TSP可行解的充分必要条件。若解为新TSP问题可行解,则与辅助边结合后必仅含一个环路;反之,若结合后仅有一个环路,则为TSP问题可行解,否则不是。

(三)破环机制

  1. 破环判断:当匈牙利算法给出分配问题的最优解后,判断其是否包含多个环路。若包含多个环路,则需要进行破环操作。
  2. 破环操作:将所有(x_{ij}=1)的下标写为二元组并串联成回路,若环路边数不等于节点个数(N),则分别将环上一条边的距离设为(\infty),生成多个新的系数矩阵作为后续测算分支。

(四)剪枝策略

  1. 舍弃情况:为提高算法速度,通过估算目标函数值上下界舍弃不必要计算。具体包括匈牙利算法无法求解的系数矩阵,以及其最优解目标函数值大于当前已计算出最优解总长度的情况。
  2. 初始解选择:算法开始时使用贪婪法的解作为当前最优解,以便进行有效的剪枝操作。

(五)搜索策略

  1. 深度优先搜索:可以更快速地找到可行解,但不一定能保证找到最优解。
  2. 宽度优先搜索:更有可能先找到最优解,但计算资源消耗可能较大。两者的优劣取决于具体问题。

三、代码实现

(一)数据准备

  1. 距离矩阵生成
    • create_symmetric_distance_matrix函数创建一个(n)个城市的对称距离矩阵,元素随机取值在(1)到(100)之间,对角线元素设为(0),模拟城市间的距离。

(二)关键函数实现

  1. 辅助边添加函数
    • add_auxiliary_edges函数创建扩展的距离矩阵,将原始距离矩阵复制并添加辅助边,辅助边权重为(0),用于将TSP问题转换为适合匈牙利算法处理的形式。
  2. 解决方案恢复函数
    • recover_solution函数根据匈牙利算法的分配结果,将索引转换为原始城市索引,恢复为TSP问题的解决方案格式。
  3. 匈牙利算法求解TSP函数
    • hungarian_algorithm_for_tsp函数是核心函数,执行以下操作:
      • 调用add_auxiliary_edges添加辅助边,得到扩展距离矩阵。
      • 使用linear_sum_assignment函数(来自scipy.optimize库)求解分配问题,得到行索引和列索引。
      • 将索引转换为原始城市索引并恢复解决方案。
      • 检查解决方案是否为合法TSP路径,若不是则尝试调整,确保路径经过所有城市且不重复。
      • 计算总距离,遍历路径中相邻城市并累加距离。
  4. 寻找最优TSP解决方案函数
    • find_best_tsp_solution函数通过多次调用hungarian_algorithm_for_tsp函数,寻找最优路径。记录每次尝试的路径和距离,返回最短路径和距离。

(三)示例运行

  1. 参数设置与调用
    • 设置城市数量(n = 10),调用create_symmetric_distance_matrix生成距离矩阵,然后调用find_best_tsp_solution函数求解最优路径和距离。
  2. 结果输出
    • 打印输出最优解决方案(城市访问顺序)和总路径长度,展示算法在示例问题上的求解结果。

四、实验结果

(一)实验设置

  1. 参数调整
    • find_best_tsp_solution函数中,num_trials参数控制尝试次数,可根据问题规模和需求调整,以平衡计算时间和找到最优解的概率。

(二)结果展示

  1. 最优路径和长度
    • 运行代码后,得到最优解决方案(Best Solution)和总路径长度(Best Total path length)。通过多次运行代码或调整参数,可以进一步分析算法在不同条件下的性能表现,如最优解的稳定性、计算时间等。与其他算法对比,可以验证改进匈牙利算法在求解TSP问题上的有效性和优势。
    • 在这里插入图片描述

部署方式

  • python 3.8以上

资源获取

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件地址获取。

附件地址:基于改进匈牙利算法复现

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐