# tsp_heuristic **Repository Path**: mathu-dxy/tsp_heuristic ## Basic Information - **Project Name**: tsp_heuristic - **Description**: 使用2opt局域搜索、模拟退火、遗传算法求解Tsp问题 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2020-12-01 - **Last Updated**: 2024-08-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Tsp问题的启发式方法 ## Tsp问题 Tsp问题是经典的组合优化问题。虽然问题形式简单,但已经被证明属于NP-Hard问题。精确求解算法很难在合理时间内求解完成,启发式方法有着易扩展、速度快、效果好的优势。本代码利用爬山法、模拟退火、遗传算法三种启发式方法对Tsp问题进行求解。 ## 爬山法 爬山法是局域搜索方法的最简单形式。在每一个步,算法贪婪选择当前邻域中最优状态,作为下一状态。如果邻域中所有状态都比当前状态差,则达到局部最优点,终止算法。 本代码利用数组表示一个解,数组的第 $i$ 位,表示第 $i$ 个访问的城市。采用2OPT作为邻域算子,即把部分解序列前后翻转。如果邻域中有多个状态对应相同的最优长度,则随机选择一个作为下一状态。 邻域搜索算法,通常步数很多,需要尽量减小每一步的计算花销。本代码主要采用两个方式加速计算。首先利用Python列表的seq[::-1]实现翻转,利用列表加法,实现部分解序列的组合。相比于利用循环,每个位置单独赋值计算更快。其次,下一状态的长度通过相邻两状态长度的改变量计算。 通过在berlin52和kroE100两个问题上测试,说明爬山法的特性。下文通过十次计算得到平均长度和平均求解时间。其他两个启发式方法也采用同样方式进行测试。berlin52最优解通过代入最优序列计算长度得到(TspLib给出最优值7542,代入最优解得到7544,很困惑)。kroE100,TspLib没有给最优解,通过[Best known solutions for symmetric TSPs](http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/STSP.html)处得到最优解值。 | | berlin52 | kroE100 | | ---------- | -------- | ------- | | 平均长度 | 8099 | 23523 | | 平均时间/s | 0.14 | 1.4 | | 最优解 | 7544 | 22068 | | gap | 7.4% | 6.6% | 测试表明爬山法计算速度快,能够在2s内得到计算结果。由于KroE问题规模更大,需要更多步数达到局部最优,因此求解时间更长。结果长度与最优值有较大gap,约7%。以上结果是因为爬山法每一步都贪婪地选择步骤,导致很快陷入局部最优。 结果展示如下图