If you are interested in my experiences...

Feel interested? :-P

Interested?

Talk To Me

蚂蚁优化简介

02 Dec 2013>>Categories: ant_colony

引言

这个学期我选修了一门“高级算法设计”,上到一半的时候老师给我们布置了一些智能算法的题目,让我们下去准备,然后轮流到课上去讲。我分到的题目是“蚁群算法”,为了课上能讲好,过去一段时间抽出不少时间去仔细研究了这个算法,还用 HTML5 写了一个实现,本周就轮到我上去讲了,好长时间一直没抽出时间来写博客了,我决定写一篇博客,总结一下我的学习成果。

简述

“蚁群算法”其实并不是只有一个算法,从第一次被提出来到后来的历次改进和优化之后,这一系列算法被统称为“蚂蚁优化算法” ( Ant Colony Optimization ) 。而“蚂蚁优化算法”又可以被归类到“群体智能算法” ( Swarm Inteligence ) 这个大类。“蚂蚁优化算法”被设计出来主要是为了解决图上的计算问题,比如计算图上两点间的最短路问题。

1991年,Marco Dorigo 在他的博士论文上首次提出了“蚂蚁算法”。 Dorigo

既然这个算法以蚂蚁命名,那么自然和蚂蚁有关,确实这个算法是受到自然界蚂蚁的启发。不过奇怪的是,虽然这是一个智能算法,但是自然界的蚂蚁个体是不具备智能的。这是由蚂蚁的生物特性决定的,蚂蚁的视力非常差,只能探查周围非常小的区域,而且也不具备像别的生物那样发达的大脑。不过有一个十分有趣的现象,蚂蚁总是成群结对的活动,而且在它们群体活动的时候,它们总能找到食物,并且尽管它们的视力很糟糕,它们的记忆力很糟糕,它们总是能找到回到巢穴的路。经过更加深入的观察,发现大多数蚂蚁都会沿着“食物—巢穴”之间最优的那条路线行走,仿佛这时候它们已经不再是“瞎子”。 ants

生物学家为我们揭开了其中的奥秘。蚂蚁在行动时,会在沿途遗留一种可以被称为“信号素”的挥发性化学物质,当群体中某一只蚂蚁发现了食物,那么它的路径上所遗留的“信号素”会吸引其他蚂蚁沿着它的路径找到食物,随着越来越多的蚂蚁从这条路径经过,这条路上的信号素浓度越来越高,导致更多的蚂蚁选择这条路径。

引发思考

但是这条路径仅仅只是一条到达食物的可行路径,在蚂蚁的群体中,总是有那么一些喜欢“创新”的蚂蚁,它们不喜欢沿着“前辈”们的路线而总是喜欢另辟奚径,有时候它们会失败,不过也有时候它们成功了,找到了一条通往食物更短的路径,那么后来的蚂蚁也会有一小部分选择了这条路径。由于这条路径更短,在上面来来往往的蚂蚁花费时间更短,所以信号素浓度渐渐升高,在这种正反馈的作用下,慢慢的,更多蚂蚁选择了这条更短的路径,再后来可能原来路径上的蚂蚁大部分都会转移到这条线路上来,而原来那条线路上由于蚂蚁越来越少,而信号素在不断挥发,信号素浓度会越来越低,导致这条线路更加不会被后来的蚂蚁选择。

按照上述情况久而久之,从上帝视角来看,整个蚂蚁群落大部分都在沿着一条非常接近从巢穴通往食物的最佳路径的线路移动,但并不是全部,也会有一些蚂蚁在尝试开辟新道路,如果它们失败,它们很有可能会受到信号素的吸引重新回到“大家”的路径上来。

可是对于单个蚂蚁来看,蚂蚁依旧不具有智能,它只是在做一件很简单的事:探查周围一小片区域是否具有信号素,若没有,随机方向行动;若有,按照一定概率作出选择,沿着信号素方向前进或者其他别的方向,通常,沿信号素方向前进的概率更大。在发现食物后和搬运食物回巢穴的过程中,沿途留下信号素。这没有什么复杂的,但是蚂蚁的群落太庞大了,量变引发质变,当大多数蚂蚁都在重复做这一件简单的事情的时候,整个群落就具备了智能。

蚂蚁的记忆很差,回巢穴的路是不可能被记住的,所以回巢穴的过程中会有另外一种“信号素”指引它们回去。所以,就发现食物、搬运食物回巢穴这两个活动,分别由两种不同的信号素在领导整个蚂蚁群落。而回巢的信号素是什么时候被留在路上的呢?答案就是蚂蚁刚从巢穴出来寻找食物的时候。它们在还没有找到食物的时候会沿途一直在遗留回巢的信号素。这点非常容易理解,一次外出并不一定总能找到食物,如果在一个时间限度之内还没有找到食物,那么最好的选择是回家补给,否则可能就会饿死在路上了,回家这条路线可谓是生命线。

人工蚂蚁

自然界的蚂蚁带给人类启发:如果要解决图上两点间的最短路问题,我们可以制造一个由人工蚂蚁组成群体,它们能够在图上播洒信号素,依据此来寻找两点之间的最短路。要模拟自然界的蚂蚁,最主要的是考虑两个重要问题,一个是环境信号素更新规则,另一个是单个蚂蚁每一步行动的法则。

第一个公式代表的就是单个蚂蚁每一步行动的法则。蚂蚁每行进到一点,决定下一步应该前往哪一个点时,虽然在这个时刻整个环境的信号素是确定的,但具体蚂蚁选择哪一条道路这依旧是一个随机事件。所以这里等式左边用概率表示,蚂蚁会计算这个时刻它可以前往的所有的下一个点的概率,并且按照这些概率进行选择。肯定在这些路径中有一条路径的概率最大,但是这也只能保证这条路径被选中的可能性最大,实际蚂蚁选择哪一条道路依旧是一个随机事件,任何一条可行的路径无论概率多么小,都是有可能被选择到的。

仔细观察这个式子,显然所有可能被选择的路径的概率加起来的概率为1,而具体某一条路径被选择的概率和两个因素有关,一个是和该条路径的长度 d(i,j) 有关,另一个是和该条路径当前的信号素含量 tau(i,j) 有关。在自然界中的蚂蚁因为视力和记忆力都十分有限,肯定是不知道要选择的路径的长度的,这里是人工蚂蚁的一个优势,人工蚂蚁知道所有路径的长度,而且人工蚂蚁还具有记忆力,可以记住所有曾经访问过的节点。

路径长度和信号素强度这两个因素对蚂蚁做决定的影响分别由两个指数 alpha,beta 控制,alpha 如果比较大,说明这个系统内部更愿意选择信号素强度大的路径,如果 beta 比较大,说明这个系统内部会把路径的长度作为一个很重要的影响指标去考虑。为什么要引入路径长度这一个影响因素呢?这类似于一种贪心的思想,尽量去选择短的路径来行进,但是算法可以保证长的路径依旧有可能被选中,这样就不会一直陷入局部最优而出不来。

第二个公式即为环境信号素更新规则。首先要说明人工蚂蚁系统中环境信号素更新的时机是在 m 个蚂蚁完成一次迭代(例如在TSP问题中这些蚂蚁均完成一次环游)后。某条路径在 t 时刻的信号素含量为 tau(i,j)(t) , m 个蚂蚁在完成一次迭代后时间是 t+n ,那么 t+n 时刻图上的每条路径均需要被更新,更新和两个因素有关,一是信号素的自然挥发速率,另一个是环游的蚂蚁在这次迭代中留在路径上的信号素。

公式中的 rho 即为信号素的自然挥发速率,每条道路无论有没有被蚂蚁选择都存在信号素挥发。如果某一条路径在这次迭代中被几只蚂蚁访问过,那么这条路径的信号素需要加上那几只蚂蚁留下的信号素,蚂蚁对路径上信号素增量的影响和蚂蚁在这次迭代中的总路程长度有关。从公式中可以看到,路径长度在分母中,所以,蚂蚁走总路程越长,那么它对曾经走过的每条图上的边的信号素增加影响越不明显;相对的,如果蚂蚁走的总路程越短,那么它使得它经过的边信号素增加的越多。简单地说,某个可行解越优,那么这个可行解被强化的可能性更大。

TSP Benchmark

有了以上的基础,我们就可以看一个最基本旅行商问题的蚁群算法求解了。

算法开始之初,我们要为系统初始化一些参数,比如说,alpha,beta,环境的初始信号素等等,每次迭代的蚂蚁的数量(比如 m )。把 m 个蚂蚁 放到随机 n 个城市,然后让它们按照行动法则选择后续路径,不走重复的节点,直到每只蚂蚁都完成一次环游,这一次迭代结束,根据信号素更新法则更新环境的信号素,分析这次迭代中每只蚂蚁的路径,看看是否已经满足最后的停止条件(这个算法是可以无穷进行下去的,所以有必要设置停止条件,例如最优路径长度降到某个阈值以下,或者迭代次数已经大于等于设定的最大迭代次数,最优路径长度连续多少步没有发生改变等),如果满足则退出,若不满足,则继续下一次迭代,产生新的蚂蚁,放在随机 n 个城市……

为了去找最短环游,可能给人最直接的感觉是把这些蚂蚁放在同一个起点,然后开始算法。之所以要把蚂蚁放在不同的城市,其实是为了增加解的多样性,防止算法过早收敛,减少陷入局部最优的可能性,使系统更加随机地去产生可行解,有利于提高算法的性能。

优点与缺点

优点: 1. Distributed. 天然的分布式,适合并行化,充分发挥多核CPU的计算性能。 2. Easy. 每个蚂蚁的实现非常简单,只有非常有限的与环境交流。 3. Adaptive. 鲁棒性强,适应环境的变化,响应变化后依然能比较快得给出一个比较好的新解。

缺点: 1. Slower convergence. 相对于其他的启发式算法收敛得速度较慢。 2. Performed poorly for larger problems of more cities. 当问题规模扩大的时候性能下降较大。 3. No centralized processor. 没有中央控制器去指导蚂蚁群体去获得一个比较好的解。

总结

蚁群算法相对而言还是一种比较新的人工智能算法,近期这个算法被作为一种启发式的方案去解决组合优化的问题。另外蚁群算法尤其适合去解决结构不稳定的问题,由于它的鲁棒性更强,可以很容易地去适应图上的变化,比较有应用价值的就是网络上的路由问题。

参考资料

Ant Colony Optimization, MIT Press, 2004

(完)


About Me

Master Candidate. Student of SDU. Blogger. Web Developer. Front-end Engineer. Java Programmer. Traveler. Science Fiction Addict. Dancer. Inline Skater. More