大家都看过蚂蚁的新闻,他们合作冲出火圈、他们的分工比蜜蜂还要明确、他们个个都是大力士。
但是,今天,我们将认识到,蚂蚁,还可以解优化问题!
原理
蚂蚁在觅食的时候,首先会漫无目的地寻找。此时的蚂蚁,可以说都是瞎子。但他们沿途会留下信息素,对,就是蚂蚁味。如果找到食物,它们就会返回,并同样留下信息素。
此后,蚂蚁前赴后继,顺着前人留下的信息素的强度,选择性地找到一条路来走。
由于那些不是最短的路,蚂蚁来回的时间比较长,所以信息素挥发得多。因此,如是过程一直持续下去,必然会出现一条路,上面的信息素的浓度远远大于其他路。
再往后,由于这条路的信息素浓度很高。几乎所有的蚂蚁,都会沿着这条路去搬运粮食。所以就造成了,我们小时候看到的,蚂蚁龙的现象。
而这条路,正是最短路径。
因此,能否将参数寻优问题对应到蚁群算法,找到最短路径的问题呢?
答案可能让大家失望了,比较难,或者说,不直观!
蚁群算法可以直观的用于求解,离散优化问题的经典——TSP 问题
什么是 TSP 问题,相信大家都知道了。
TSP 问题,可以很直观地对应到蚁群算法中。虽然没有“食物”这个东西。
转移概率原则
首先,假设有 m 只蚂蚁,由于 TSP 问题要求不能重复,因此对于每个蚂蚁,都维护一个禁忌表,table,表示蚂蚁下一次移动的目标,不能是 table 里面列举的城市。设城市节点构成一个集合,记为 C。城市 i 与 j 之间的距离为 dij 。对于某一只蚂蚁 k,假设其当前时刻为 t,其位置为 i,则其移动到城市 j 的概率为:
pijk(t)=∑Nτirα(t)ηirβ(t)τijα(t)ηijβ(t) N=C−tablek(t)
其中 τij(t) 是当前时刻,城市 i 和 j 留下的信息素。ηij 为启发元素,一般有
ηij=1/dij
如果 α=0,那么蚂蚁完全是靠着路程来选择路径,忽略了信息素的作用,同时加快了收敛,但增加了局部最优的风险(就好像贪心算法一样,但带有一点启发性/随机性)。如果 α 很大,蚂蚁会容易过分依赖 “前人的经验”,无法 “创新”,从而同样导致局部最优。
因此,当从这一点来看,就可以发现蚁群算法对算法的参数敏感!
局部调整原则
信息素在经过一段时间后,就会挥发。蚁群算法也是如此,信息素τ的作用,也会随着时间的推进而减小。
在 TSP 问题中,时间比较难界定。我们可以设置,当蚂蚁(蚂蚁们同时出发,同时来到下一个城市)走过 n 个城市后,就启动挥发,减小当前的τ(t):
τij(t+n)=(1−ϵ)τij(t)+ϵτ0
其中,ϵ∈[0,1]为挥发系数,τ0=1/(nlmin),其中lmin为最小的 dij。
全局调整原则
蚁群算法和遗传算法一样,都是以种群为单位,而且都经过很多次迭代循环。
蚁群在其所经过的路径会留下信息素,但在算法中,蚁群的信息素不是及时留下的。而是在满一个迭代后,再来进行清算。清算的规则为:
τij(T+1)=(1−ρ)τij(T)+Δτij(T)δτij(T)=∑k=1mΔτijk(T)
其中:Δτijk(T)是在循环 T 中,蚂蚁留下的信息素。
根据计算方式的不同,衍生出如下三种蚁群算法:
- AC:Δτijk(T)={Q/Lk 若k经过ij,Q为常数,Lk为蚂蚁k走过的总距离0 否则
- AQ:Δτijk(T)={Q/dij 若k经过ij0 否则
- AD:Δτijk(T)={Q 若k经过ij0 否则
对于 AD、AQ,可以及时更新信息素,而不必到循环结束后再做清算。
流程

参考文献
http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=27FAF83A33355430314226371D101358?doi=10.1.1.421.7129&rep=rep1&type=pdf
缺点
前期的搜索非常慢。要搜索到一定程度后,才会收敛。
算法的鲁棒性不高。也就是说,如果不加改变(大改),它很难用于其他问题,如连续型的优化问题。
优点
算法很健壮,他不是十分依赖与初始值。