蚁群算法通俗讲解(附MATLAB代码)_最佳路径


本文依然参考《MATLAB智能算法30个案例分析》一书,文末的源代码也来自本书

今天小编与大家聊聊蚁群算法,蚁群算法一个显著的特点是蚂蚁在经过路径后会释放信息素,蚂蚁之间能够相互感知彼此的信息素,如果某一段路径的信息素浓度高,则说明有大量的蚂蚁经过此路径,也就说明该条路径可能是“较好的”正在纠结选择哪条路走的蚂蚁,会以大概率参照以前蚂蚁所走的路径而走那条“较好的”路径(既然是大概率,就说明还有小概率选择不走“较好的”路径,小编认为这里的思想和“轮盘赌”的思想差不多),按照此种逻辑走下去,信息素浓度最高的那条路径就可能是“最优”路径。生物学家发现,路径上的信息素浓度会随着时间推进而逐渐衰减。

下面是书中的一段话,我把它摘抄下来,小编觉得这段话把蚁群算法的思想讲得很透彻。

蚁群算法应用于解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推进,较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也愈来愈多。最终,整个蚂蚁会在正反馈的作用下集中到最佳路径上,此时对应的便是待优化问题的最优解。


因为蚁群算法的核心思想是“信息素”,所以用蚁群算法求解TSP问题有两个关键步骤:

步骤一:根据信息素浓度计算出选择转移到下一个城市的概率

步骤二:更新信息素浓度

首先设置一些基本参数:设整个蚂蚁群体数量为m,城市数量为n,城市i与城市j之间的距离为dijt时刻城市i与城市j连接路径上的信息素浓度为蚁群算法通俗讲解(附MATLAB代码)_最佳路径_02。初始时刻,各个城市连接路径上的信息素浓度相同(因为蚂蚁们都还没开始走),设蚁群算法通俗讲解(附MATLAB代码)_最佳路径_03

步骤一详解前文我们说到,蚂蚁能够感知某条路径上的信息素浓度,并根据信息素浓度选择继续沿着那条路走,小编前面也说到这里的思想和“轮盘赌”的思想差不多,不过还有一点小小的差异。

蚁群算法通俗讲解(附MATLAB代码)_优化问题_04

这个式子表明t时刻蚂蚁k从城市i移动到城市j的概率,其中蚁群算法通俗讲解(附MATLAB代码)_蚁群算法_05蚁群算法通俗讲解(附MATLAB代码)_最佳路径_06为蚂蚁k待访问城市的集合,开始时蚁群算法通俗讲解(附MATLAB代码)_最佳路径_06中有(n-1)个元素,即包括除了蚂蚁k出发城市的其他城市,随着时间的推进,蚁群算法通俗讲解(附MATLAB代码)_最佳路径_06中的元素不断减少,直至为空,即表示所有的城市均访问完毕;蚁群算法通俗讲解(附MATLAB代码)_最佳路径_09为信息素重要程度因子,其值越大,表示信息素的浓度在转移中起到的作用越大;蚁群算法通俗讲解(附MATLAB代码)_优化问题_10蚁群算法通俗讲解(附MATLAB代码)_蚁群算法_11的重要程度影响因子,其值越大,表示蚁群算法通俗讲解(附MATLAB代码)_蚁群算法_11在转移中的作用越大,即蚂蚁会以较大的概率转移到距离最短的城市。

步骤二详解:在计算完转移概率之后,蚂蚁一定会移动到下一个城市,这时不同路径上的信息素浓度一定会发生变化,因为刚才蚂蚁已经经过这条路线。如前文所述,在蚂蚁释放信息素的同时,各个城市连接路径上的信息素也在逐渐消失,设参数蚁群算法通俗讲解(附MATLAB代码)_蚁群算法_13蚁群算法通俗讲解(附MATLAB代码)_最佳路径_14)表示信息素的挥发程度。因此当所有蚂蚁完成一次循环后(这里的意思是所有的蚂蚁全部找到自己的路径后,这些蚂蚁会更新完各连接路径上的信息素浓度之后进行新一轮的“寻找最优路径活动”,这其实属于一个迭代的过程),各个城市间连接路径上的信息素浓度需要进行实时更新。

下面给出信息素浓度更新公式。

蚁群算法通俗讲解(附MATLAB代码)_优化问题_15

其中,蚁群算法通俗讲解(附MATLAB代码)_优化问题_16表示第k只蚂蚁在城市i与城市j连接路径上释放的信息素浓度;蚁群算法通俗讲解(附MATLAB代码)_蚁群算法_17表示所有蚂蚁在城市i与城市j连接路径上释放的信息素浓度之和。

蚁群算法通俗讲解(附MATLAB代码)_最佳路径_18

其中,Q为常数,表示蚂蚁循环一次所释放的信息素总量;Lk为第k只蚂蚁经过路径的长度。



综上所述,蚁群算法求解TSP问题的流程图如下所示

蚁群算法通俗讲解(附MATLAB代码)_最佳路径_19


最后老规矩,附上蚁群算法求解TSP问题MATLAB代码(后台回复“蚁群TSP”提取代码)

链接:https://pan.baidu.com/s/1SQxcB7mmCbUZT6J2DXOIbQ 

提取码:l0l2 

小编分享的百度网盘链接保存期限一般为7天,有期限的原因是为了让大家真正学习算法,而不是保存到网盘里然后就放在里面不看了,如果各位小伙伴需要前几篇推文的代码,可以在后台留言给我,我会把链接重新分享给您,多谢各位理解。

如果各位觉得小编的推文写得还可以的话,请分享给身边的人,关注的人数越多,小编更新就越有动力。

最后因为小编能力有限,如果推文中哪里写得有问题,欢迎大家积极指正,小编会虚心采纳各位的意见。