一、什么是蚁群算法
蚁群算法是一种启发式算法,灵感来自于真实世界蚁群的觅食行为,它由Marco Dorigo于1992年在他的博士论文中提出。单只蚂蚁智商有限,但整个蚁群确体现出一种高智能行为,为什么蚁群搬运食物可以沿着比较短的路线,而不是绕远路。经过研究,发现当单只蚂蚁觅食发现食物时,在途中会释放信息素。其他蚂蚁会根据信息素的浓度自觉向浓度高的地方行进。当走的次数多了,就会有一条标识较近路线的高浓度信息素带出现。信息素会随时间消失,时间越久就越稀薄。
二、基本原理
我们拿最通俗的TSP问题来演示蚁群算法。TSP (Traveling salesman problem)中文名称叫做旅行商问题。
下面演示基本原理。
有4个位置A、B、C、D。其中A是蚁穴所在,D是食物的位置。蚂蚁1从A出发后经过C、B、D找到食物,然后回到蚁穴,即A -> C -> B -> D -> A路径长度为18。这个过程中蚂蚁选择下一个节点的概率是随机的。
类似的,蚂蚁2从A出发后沿着路径A-> D -> C -> B -> A,路径长度是15。
现实世界中蚂蚁的信息素释放是在行走过程中释放的,算法中的人工蚂蚁是在路径结束后,计算需要释放的信息素浓度。这一点是和现实生活不同的地方。
在第一轮中,蚂蚁1、蚂蚁2寻找下一个位置完全是随机的。第一轮结束后,信息素浓度根据前一轮的路径计算新的信息素浓度。第二轮中蚂蚁们在选择路径的时候就会参考信息素浓度,哪里浓度高就往哪里走。
下面是信息素的计算的简单公式:
需要增加的信息素浓度= 信息素常数(初始给定的值)/ 路径长度
取【信息素常数】为1,则:
蚂蚁1路径上需要增加的浓度=1/18
蚂蚁2路径上需要增加的浓度=1/15
更新后的信息素浓度表如下:
第二轮开始。
蚂蚁1从A位置开始出发,面前有3中选择,B、C、D。其中A -> B浓度是1/15,A -> C浓度是1/18, A-> D浓度是1/18+1/15。哪里浓度高就选择走那条路,于是选择了A-> D这条路。类似的,到了D位置后,D-> C浓度是1/15,D ->B浓度是1/18,自然选择D-> C路径。由于每个位置都需要走一遍,所以路径结果已经出来了A-> D -> C -> B -> A即是行走的路径。
同理,蚂蚁2在信息素影响下将会走相同的路径。
等等。这里有个问题,明显最短路径是A -> B -> D -> C -> A,或者A -> C -> D -> B -> A,长度是13。如果路径选择仅仅是按照哪边浓度最高就选择哪边,会陷入局部最优解。这里我们引入一个选择算法,轮盘赌法。
什么是轮盘赌法?举个例子:中午不知道吃什么饭,面前有三个选择,米饭、面、米线。这几种你稍微更想吃米线、其次是面、然后是米饭。你可以给这三种设置个范围[0,0.5]吃米线(概率50%)、(0.5,0.8]吃面(概率30%)、(0.8,1]吃米线(概率20%)。产生一个随机数,取值范围[0,1],落到哪个区间就选择哪个。
信息素在每一轮结束会挥发掉一部分。如果信息素只增加不减少,也容易产生局部最优解。下面是每轮结束后的信息素浓度:
每轮结束后的信息素浓度=上一轮信息素浓度 - 挥发的信息素 + 增加的信息素浓度。
根据时间和计算量限制,可以指定这样的计算进行多少轮,在可接受的时间内产生较短的路径。
下一篇将从数学与代码实现角度进行说明。
三、参考
- B站-数学建模爱好者-蚁群算法。链接贴了不给发。