提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
蚁群算法是一种寻找最优化路径的概率型算法,据说是是从灵感来源于蚂蚁在寻找食物过程中发现路径的行为。
一、蚁群寻找食物的路径
蚂蚁路过的地方会留下激素—信息素,后续的蚂蚁可以根据信息素来判断自己该怎么走。
刚开始时,第一批蚂蚁出动,此时地面没有任何信息素,所有蚂蚁随机选择一个方向去寻找食物,同时留下信息素,当蚂蚁寻找食物以后,原路返回。因为信息素随着时间的推移,会慢慢消散,所以寻找食物路程比较短的路径,信息素浓度会比较高,这对后面的蚂蚁寻找较优化路径提供了依据。
第二批蚂蚁出动时,地面已经有一些信息素了,大部分蚂蚁自然会选择信息素比较高,也就是路径比较短方向去寻找食物,但是自然也会存在比较“叛逆”的蚂蚁,选择信息素浓度低的,或者开创新路径。第二批蚂蚁返回以后,信息素浓度更新,时间会让没有蚂蚁走的路径的信息素慢慢消散,蚂蚁多的路径信息素浓度更高。若是那些“叛逆”的蚂蚁找到了更优的路径,因为路径短,耗时也短,所以信息素挥发少。这些对第三批的蚂蚁选择较优路径提供了更有力依据。
第三批重复第二批。。。。。
二、蚁群算法步骤
1.初始化
初始化蚂蚁的个数,每次派多少只蚂蚁,ant=常数;
初始化每个方向的信息素,方向i到j的信息素为 msg[i,j]=常数;
初始化启发式因子,ins[i,j]=1/d[i,j],d[i,j]是i到j的距离;
(这个我就有点好奇了,蚂蚁怎么知道距离数值的。。。。。。。哈哈哈,但是这个是算法有的,我也不懂为啥)
每只蚂蚁携带的信息素,Q=常数;
最多派多少批蚂蚁,也就是最多循环多少次,cycle=常数;
初始化信息素和启发式因子的重要程度 α=常数,β=常数;
定义信息素的挥发比例,μ=常数。
2.公式
1 方向选择概率公式
p[i,j]=msg[i,j]^α * ins[i,j]^β / ∑(msg[i,j]^α * ins[i,j]^β)
p[i,j]表示在i选择方向j的概率
∑(msg[i,j]^α * ins[i,j]^β) 对j求和,表示从i出发,所有方向的信息素和启发因子的关系总和
2 信息素更新公式
msg[i,j]=(1-μ)*msg[i,j]+∑Δmsg[i,j]
∑Δmsg[i,j] 表示经过一次遍历,所有蚂蚁在方向i到j留下的信息素的和,1-μ表示这段时间信息素的挥发
3 信息素增加公式
Δmsg[i,j]=∑( Q / ∑d[i,j]);
∑d[i,j] 表示某只蚂蚁选择的路径总和;
Q / ∑d[i,j] 表示这只蚂蚁的信息素平分到所有路径上,这样较短的路径分配的信息素也会比较高;
∑( Q / ∑d[i,j]) 对蚂蚁数ant求和,表示这次遍历,所有蚂蚁在方向i到j的信息素总和;
3.出发
1 给每只蚂蚁随机分配一个初始位置
2 建立一个禁忌表,表示这只蚂蚁已经路过的位置,初始位置和路过的位置都加入禁忌表。排除已经在禁忌表的位置,用方向选概率公式计算剩下方向的概率,根据轮盘法选择一个的方向前进。遍历所有位置,计算距离,求得这只蚂蚁留下的信息素 Δmsg[i,j] ;
3 让数量为ant的蚂蚁走完,统计信息素的总和 ∑Δmsg[i,j] ,记录这批蚂蚁的最短路径L,更新信息素msg[i,j];
4 如果遍历次数达到阈值,或者最短路径L达到目标值,误差在可接受范围,结束,输出最终结果L;否则重复1-3.
总结
算法新手入门,代码就不加了,只记录自己对算法的理解,如果有理解错误的地方,欢迎指正。
新手写文章,好难写啊啊啊啊啊!!!!
不过好处就是,写出来印象深一点,谁让我不想做笔记呢。