5 分钟跑通蚁群算法:scikit-opt TSP 实战
2026/9/23 19:57:30 网站建设 项目流程

5 分钟跑通蚁群算法:scikit-opt TSP 实战

【免费下载链接】scikit-optGenetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Optimization Algorithm,Immune Algorithm, Artificial Fish Swarm Algorithm, Differential Evolution and TSP(Traveling salesman)项目地址: https://gitcode.com/GitHub_Trending/sci/scikit-opt

这篇文章带你在 scikit-opt 库里用蚁群算法(ACA_TSP)解决旅行商问题:从安装到调参,跑通一个 25 城市的 TSP 求解实例,再讲收敛判断和常见坑。

🐜 先跑起来:安装与最小可运行示例

scikit-opt 安装就一条命令:

pip install scikit-opt

然后直接跑这段最小示例(6 个城市),先看结果再说:

import numpy as np from scipy import spatial from sko.ACA import ACA_TSP n = 6 # 城市数 coords = np.random.rand(n, 2) # 随机落点 dist = spatial.distance.cdist(coords, coords, metric='euclidean') def total_len(route): # 绕一圈的总路程 return sum(dist[route[i], route[(i + 1) % n]] for i in range(n)) ant = ACA_TSP(func=total_len, n_dim=n, size_pop=20, max_iter=50, distance_matrix=dist) best_route, best_len = ant.run() print("最短路径长度:", round(best_len, 4))
最短路径长度: 2.3174

跑通了,有结果了。下面拆开讲它是怎么来的。

💡 蚁群算法到底在干什么?(30 秒理解版)

一句话类比:一群快递员同时出门跑单,谁走通的路线被贴上越多便签,后来者就越优先抄这条路;便签会随时间褪色,所以队伍不会永远困在旧路线上,总有新的捷径被试出来。

对应到代码里,每轮迭代就做四件事:

  • 信息素初始化:所有路段的"热度"先设成相同的起始值
  • 路径选择:每只蚂蚁站在当前城市,按"热度 × 距离倒数"加权随机挑下一站
  • 信息素更新:一圈跑完后,总路程越短的蚂蚁,在走过的路段上刷越多热度
  • 自然挥发:每轮先按比例清掉一部分热度,再叠加新刷上去的

这套逻辑全部封装在ACA_TSP类里,源码见 sko/ACA.py,你实际只需要关心run()这一个入口。

📋 ACA_TSP 参数速查表

ACA_TSP的参数不多,一张表讲清楚 ACA_TSP 参数怎么配:

参数名含义推荐起步值调大的影响调小的影响
size_pop蚂蚁数量(群体规模)城市数的 2 倍路线多样性更高,不易卡局部,但每轮更慢速度快,探索不足,解质量下降
max_iter最大迭代次数200搜索更充分,总耗时线性增加可能没收敛就提前停了
alpha信息素权重因子1更信热度(偏利用),容易反复走同一条路选择更随机,探索增强
beta启发式信息权重2更信距离(偏探索),行为趋近贪心挑近路更依赖信息素,随机性变大
rho信息素挥发系数0.1热度退得快,不易早熟,但收敛变慢热度残留久,容易过早收敛

新手阶段先盯size_poprho就够了:一个决定队伍规模,一个决定"遗忘速度"。其余参数保持默认,等结果不理想再回头调。

🗺️ 完整实战:25 城市 TSP 求解

上正题:25 个随机城市,求一圈的最短访问顺序。完整代码如下:

import numpy as np from scipy import spatial from sko.ACA import ACA_TSP # 1. 随机生成 25 个城市坐标 n_city = 25 city_coords = np.random.rand(n_city, 2) # 2. 城市两两间的欧氏距离,构成距离矩阵 dist_matrix = spatial.distance.cdist(city_coords, city_coords, metric='euclidean') # 3. 目标函数:输入访问顺序,返回绕一圈的总距离 def route_length(order): return sum(dist_matrix[order[i], order[(i + 1) % n_city]] for i in range(n_city)) # 4. 配置蚁群参数并运行 ant = ACA_TSP(func=route_length, n_dim=n_city, size_pop=50, # 城市数的 2 倍 max_iter=200, distance_matrix=dist_matrix) best_order, best_length = ant.run() # 5. 输出结果 print("最短路径长度:", round(best_length, 4)) print("最优访问顺序:", best_order.tolist())
最短路径长度: 3.2841 最优访问顺序: [3, 21, 4, 17, 9, 24, 0, 12, 19, 6, 2, 22, 15, 8, 23, 11, 5, 1, 14, 18, 10, 16, 13, 7, 20]

第一段是数据准备:坐标随机生成,距离矩阵用scipycdist一次算好。注意算法本身只依赖这个矩阵,坐标仅在计算距离时用了一次。

第二段定义目标函数。ACA_TSP对你的问题一无所知,它只是拿你给的func给每条路线打分,所以"距离怎么算"完全由你决定。

第三段是核心:把目标函数、城市数、群体规模、距离矩阵交给ACA_TSPrun()返回最优顺序best_order和对应长度best_length。官方示例在 examples/demo_aca_tsp.py,里面还带了画图代码。

📈 看收敛曲线:你的解够不够好?

跑完后ant.y_best_history里存着每一轮的最优长度,画出来只要几行:

import pandas as pd import matplotlib.pyplot as plt pd.DataFrame(ant.y_best_history).cummin().plot() plt.xlabel("迭代次数"); plt.ylabel("历史最优路径长度"); plt.show()

曲线前半段快速下坠、后段贴着底部走平,说明基本收敛了;如果到最后一轮还在明显下滑,就加大max_iter再跑一轮。

🔧 调参 & 避坑指南

常见误区正确做法
只跑一次就下结论随机性强,建议跑 5 次取最优,或固定随机种子做对比
size_pop设太小经验值是城市数的 1.5~2 倍,太小路线多样性不足
rho设为 0(不挥发)热度只增不减,队伍很快锁死在一条路上,建议 0.1~0.5
漏传distance_matrix转移概率要用它算倒数启发值,属于必传参数
期望得到精确最优解蚁群找的是近似解;把max_iter翻倍后长度不再变化,就可以接受当前结果

alphabeta是最常被问到的信息素参数调优方向:alpha调大,蚂蚁更信信息素,偏利用;beta调大,蚂蚁更信距离,偏探索。如果你发现结果总停在差不多的位置,先调大rho,再考虑动alpha

🌐 蚁群算法还能干嘛?

TSP 只是最顺手的练手题,同一套"排序即解"的思路还能迁到这些场景:

  • VRP 车辆路径:给多条路线加容量约束,解决配送车队怎么派车
  • 网络路由:节点当路由器、边权当延迟,给数据包挑低延迟路径
  • 任务调度:把任务排成一个执行顺序,最小化总完成时间
  • 资源分配:把分配方案映射成排列顺序,按总代价打分

scikit-opt 里各算法的接口风格一致(目标函数 +run()),只要你能把问题改写成"给一个排列打分",换算法基本只是换 import 的事。

📚 延伸阅读

这份蚁群算法 Python 实现只是 scikit-opt 的一个模块,其他算法可以对照着学:

  • 粒子群优化:sko/PSO.py
  • 遗传算法:sko/GA.py
  • 模拟退火:sko/SA.py
  • 差分进化:sko/DE.py

图文教程入口在 docs/,中英文文档都有。

写在最后

参数表里的数字都只是起点,曲线和结果才是答案。把上面那段完整实战代码跑起来,改两个参数再看一眼收敛曲线,你就已经入门蚁群算法了。

【免费下载链接】scikit-optGenetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Optimization Algorithm,Immune Algorithm, Artificial Fish Swarm Algorithm, Differential Evolution and TSP(Traveling salesman)项目地址: https://gitcode.com/GitHub_Trending/sci/scikit-opt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询