由于疫情严重,出门反正无望了,但美国大学生数学建模比赛(COMAP)的时间是越来越近了。这几天呆在家中打算把把之前一直想看的部分补了。
旅行商问题(最短路径问题)(英语: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)”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。
图论中,图是有序对 $G=(V,E)$,其中 $V$ 是点集;$E\subseteq { { x,y } :( x,y ) \in V^2, x\ne y }$ 是边集,由所有无序顶点对构成(换句话说,边连接了顶点对)。对于一个边 ${x,y}$,顶点 $x,y$ 被称作是边的端点,边则被称为连接了此两个点,下为举例。

给定图 $G=(V,E)$,其中 $V$ 是点集;$E\subseteq { { x,y } :( x,y ) \in V^2, x\ne y }$ 是边集,假设 $V$ 中编号为 $0,1,2,…,N$,令$c_{ij}$为城市 $i$ 到城市 $j$ 的距离,且 $i \ne j$,并假设图网中不产生自环。又记 $x_{ij}$ 为 $0-1$ 变量满足如下约束:

则一个约束模型可以用如下方程组表示:

关于进一步的分析,请参照这个地址。
上面一节如果要继续讨论的话,就是整数$0-1$规划模型了,不在此文章的讨论范围内,我们继续来看算法:
我们记 $\eta$ 为任意边 ${r,s}$ 的启发值,在TSP中,这个值通常设定为城市 $r$ 与城市 $s$ 之间距离的倒数。另外设定 $\tau=\frac{1}{|{V}|·\bar{E}}$ ,其中 $|V|$ 为点的个数,$\bar{E}$ 为 $E$ 中所有边的平均长度。又记蚂蚁数量为 $m$ ,让它们分别构造路径,并留下信息素,并让其在下一次迭代时利用信息素。对于每一只蚂蚁,当其需要访问下一个点的时候,我们让它以一个特定概率分布对接下来要访问的城市进行随机选择。