文章目录
蚁群算法的背景
古有牛顿在苹果树下被苹果砸中发现万有引力,三十年前有人观察蚂蚁觅食发明蚁群算法。蚁群算法是意大利学者Dorigo、Maniezzo等人于20世纪90年代看蚂蚁觅食发明的。蹲在地上看蚂蚁,也能发明新成果,曾经的我咋就光看蚂蚁,给蚂蚁的觅食捣蛋呢。这意大利的大兄弟在看蚂蚁觅食的时候呢,发现单个蚂蚁的行为比较简单,但是蚂蚁群却能体现一些智能行为,比如蚂蚁能在不同环境中,寻找最短的从蚂蚁窝到达食物的路径。经过进一步研究发现,蚂蚁在找食物的路径会留下记号(生物学称之为“信息素”),蚂蚁群里的蚂蚁会根据这个记号,也就是信息素行走,每个蚂蚁都做记号,经过一段时间后,整个蚂蚁群就会找到一个最短的到达食物的路径了。
蚁群算法的思想
蚁群算法具体的思想是什么呢?我是一只小蚂蚁,我要去找食儿。我带上几个兄弟一起走,一起去找事儿。可是食物在哪儿呢?我们也不知。那我们分头行动随机找,记得做标记。过了很久很久之后,我找到了食物,带着食物原路返回告诉大家我找到食物了。在蚂蚁窝里,我和兄弟们分享了找食物的路线,有的长,有的短。这些食物还不够,我们继续又出发。沿着大家新的路径去搬食物。有时候我会走错路,走了弯路;有时候,我走错路,却发现一条捷径。经过一次又一次的外出搬运食物,回到蚂蚁窝,我们找到了一个最方便的路径。这就是蚁群算法的基本思想。
蚁群算法可以很好的解决旅行商问题。所谓旅行商问题,是存在一些城市,旅行商如何从某个城市出发,经过所有城市后返回出发城市的最短路径。
下面用旅行商问题来继续阐述蚁群算法。
1、首先有一组蚂蚁,也就是小蚂蚁和它的兄弟们,从某个城市出发,完成一个城市遍历的路径。
2、当某个小蚂蚁站在人生的十字路口,哦不,是城市交叉路况,那么必须要走向一个城市,如果某个城市越远,那么将更有可能先不走。比如,当小蚂蚁站在天津,有一条路上北京,有一条路去深圳,那么小蚂蚁最有可能先踏上进京之路,因为近啊。
3、当某个城市边际上的记号信息素越多,则更有可能被选中。比如在天津,如果去深圳上记号信息素多,则可能先去深圳,尽管进京之路比较短,这是其他蚂蚁兄弟的记号表示的,相信蚂蚁兄弟。
4、每次回到出发点,蚂蚁兄弟标记在路上的记号信息素会挥发。
这里有两个关键点,即下一个城市的选择和信息素的更新。
现在给出一些数字表示:
城市数量为M,蚁群规模(蚂蚁数量)m、信息素重要程度因子α、启发函数重要程度因子β,即启发式信息的相对重要程度、信息素会发银子ρ、信息素释放总量Q、最大迭代次数iter_max、迭代次数初值iter=1。
小蚂蚁现在位于城市 i i i,到其他城市 j j j的距离为 d i j d_{ij} dij,信息素浓度为 p i j p_{ij} pij,那么小蚂蚁朝哪个城市前进呢。从当前城市 i i i到城市 j j j的概率是 q i j = p i j α ∗ ( 1 / d i j ) β q_{ij}=p^\alpha_{ij}*(1/d_{ij})^\beta qij=pijα∗(1/dij)β。
现在小蚂蚁知道了到其他城市的概率,可是该走哪条路呢。小蚂蚁拿出勇闯天涯的雪花啤酒瓶放在地上转个圈,瓶口指向哪个城市就去哪个城市吧。这就是轮盘对赌。把每个城市的转移概率除以所有城市的转移概率之和,那就是该城市被选中的概率,然后随机一个0到1的数,该随机数落到哪个区间就被选中。现在有ABCDE四个城市可以选择,那么可以看到下图里,D城市在所有城市中占据的分量最大,则最有可能被选中。可以参考这里轮盘对赌
当小蚂蚁走完所有的城市,那就对应着一条路径。蚂蚁兄弟也有搜索路径。根据小蚂蚁和蚂蚁兄弟的探路结果,更新下蚂蚁群体对路径的认识,那就是信息素的更新。两个城市之间的信息素更新公式为
p i j = ρ ∗ p i j + Q / s u m p_{ij}=\rho*p_{ij}+Q/sum pij=ρ∗pij+Q/sum
其中sum是每个蚂蚁走过的距离之和。
蚁群算法的python实现实例
我们用python的GUI模块Tkinter来验证我们的小蚂蚁是怎么寻找最优路径的。python代码如下:
# -*- coding: utf-8 -*-
# @Time : 2019/12/25 16:23
# @Author : HelloWorld!
# @FileName: ant.py
# @Software: PyCharm
# @Operating System: Windows 10
# @Python.version: 3.6
#城市数量为M,
# 蚁群规模(蚂蚁数量)m、
# 信息素重要程度因子α、
# 启发函数重要程度因子β,即启发式信息的相对重要程度、
# 信息素会发银子ρ、
# 信息素释放总量Q、
# 最大迭代次数iter_max、迭代次数初值iter=1。
import random
import copy
import sys
import math
import tkinter