Lazy loaded image
TSP问题的处理方法(1)——ACO
Words 2934Read Time≈ 8 min
Feb 4, 2020
Sep 25, 2026
由于疫情严重,出门反正无望了,但美国大学生数学建模比赛(COMAP)的时间是越来越近了。这几天呆在家中打算把把之前一直想看的部分补了。
TSP问题
旅行商问题(最短路径问题)(英语:travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解假设一个旅行者访问每一座城市一次,并回到起始城市的最短回路。它在运筹学和理论计算机科学中非常重要。[^1]从本人的数学建模上来考虑,本人确实在这方面上吃了挺大的亏,这种图论类的问题一直不是本人擅长的范畴。鉴于以前的赛期过短,闲时又无太多精力花在这方面上,比赛时遇到的这类问题都是强行暴力穷举完成,浪费了相当多的时间。故利用这段黄金时期来补一补相关知识。而TSP是拿来实现各种只能算法的黄金问题,可以每个算法都可以试一下。
智能算法
解决TSP的方法非常多,除去之前说到的暴力穷举,还有粒子群算法(PSO),退火算法(SA),遗传算法(GA)等等等等。但以上提到的算法都有一类相同的特征:他们都包含了“初始随机化-变量筛选-反馈循环”这种大体一致的流程。基于各个算法达成结果基本一致,本人今日结合TSP问题先研究一下今日的主角——蚁群算法(ACO)。
蚁群算法
蚁群算法(Ant Colony Optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文“Ant system: optimization by a colony of cooperating agents”中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。[^2]
该算法建立在蚁群可以在不同的环境下,寻找最短到达食物源的路径的既有事实上。进一步研究发现,这是因为蚂蚁会在其经过的路径上释放一种可以称之为“信息素(pheromone)”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。
必要的图论知识
图论中,图是有序对 ,其中 是点集; 是边集,由所有无序顶点对构成(换句话说,边连接了顶点对)。对于一个边 ,顶点 被称作是边的端点,边则被称为连接了此两个点,下为举例。
notion image
给定图 ,其中 是点集; 是边集,假设 中编号为 ,令为城市 到城市 的距离,且 ,并假设图网中不产生自环。又记 为 变量满足如下约束:
notion image
则一个约束模型可以用如下方程组表示:
notion image
关于进一步的分析,请参照这个地址。
算法实现
数学基础
上面一节如果要继续讨论的话,就是整数规划模型了,不在此文章的讨论范围内,我们继续来看算法:
我们记 为任意边 的启发值,在TSP中,这个值通常设定为城市 与城市 之间距离的倒数。另外设定 ,其中 为点的个数, 为 中所有边的平均长度。又记蚂蚁数量为 ,让它们分别构造路径,并留下信息素,并让其在下一次迭代时利用信息素。对于每一只蚂蚁,当其需要访问下一个点的时候,我们让它以一个特定概率分布对接下来要访问的城市进行随机选择。
notion image
notion image
上式中, 表示蚂蚁 在城市 选择城市 的概率, 与 分别表示 和 的比重。
表示蚂蚁 在 城还需要访问的城市的集合。经验参数、 通常设置为 ,。
根据以上原则可以建立所有蚂蚁的路径,当所有蚂蚁完成其对应的一次路径后,按如下规则更新信息素:
其中 为边集, 为当前迭代最优解的蚂蚁编号,为当前迭代最优解的集合, 为蚂蚁 在边 留下的信息素,其计算方式如下:
其中 是 的路径长度。
算法流程
在搭建好了以上基础后,尝试用伪代码表述蚁群算法对于TSP问题的求解流程:
notion image
代码实例
以下为在Python的运行实例:
将以上程序与已知数据点文件*.txt放置在同一文件夹下运行,即可输出结果。其中txt文件按照“城市序号/x坐标/y坐标”序列填写。

First Revised
更新内容: ACO不但能够实现TSP问题,在复杂函数求极值无解析解时,可以用数值方式逼近。
以下为Python的实现方式:
结语
以上就是TSP-ACO解决方法的全部内容,本人从上午10时梳理到下午7时,包括了文章、程序、数学原理的探讨,应该是相当全面了。不得不说这些发明算法的人真的好厉害(词穷描述不了这种厉害之处)。总之将来几天本人看看接下来几种优化算法能不能梳理完吧,就这样。
Changelog:
2020.2.4 Initial Commit 2020.2.5 First Revised, added Python implemention.

  1. https://zh.wikipedia.org/wiki/旅行推销员问题 ↩︎
  1. https://zh.wikipedia.org/wiki/蚁群算法 ↩︎
Prev Post
TSP问题的处理方法(2)——PSO
Next Post
2019-2020 学年总结

Comments
Loading...