1、什么是蚁群算法
蚁群算法(ant colony optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的概率型算法。它是Marco Dorigo 于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路劲行为。
2、蚁群算法的基本原理
自然界中蚁群觅食要经过若干条路径从蚁穴到达食物源,但是最终所有蚂蚁选择了一条最短路进行觅食。蚁群算法就是模拟自然界中蚂蚁觅食行为而提出的一种模拟进化优化算法。它采用有记忆的人工蚂蚁,蚂蚁会在所经过的路径上留下一种挥发性分泌物(信息素),信息素随着时间的推移会逐渐挥发消失。蚂蚁在觅食过程中会感知这种物质的存在及其强度,并以此来制导自己的运动方向,其倾向于朝着这种物质强度高的方向移动。因此,由大量蚂蚁组成的集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁多,则后来者选择该路劲的概率就越大。
3、蚁群算法的基本思想
当蚂蚁沿着一条路到达终点以后会立马饭回来,这样,短的路蚂蚁来回一次的时间就断短,这也意味着重复的频率就快,因而在单位时间走过的蚂蚁数目就多,洒下的信息素自然也会多,自然会有更多的蚂蚁被吸引过来,从而洒下更多的信息素….;而长的路正好相反,因此,越来越多的蚂蚁聚集到较短的路径上来,最短的路径就近似找到了。
4、蚂蚁如何找到最短路
信息素:信息素多的地方显然经过这里的蚂蚁多,因而会有更多的蚂蚁聚集过来。
正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。
5、算法解析
蚂蚁k(k=1,2,…,m)根据各个城市间连接路径上的信息素浓度和到邻接城市的距离决定其下一个访问城市,设 Pkij(t) P i j k ( t ) 表示t时刻蚂蚁k从城市i转移到城市j的概率,其计算公式为:
Pk(i,j)=⎧⎩⎨⎪⎪[τ(i,j)]α⋅[η(i,j)]β∑s∈Jk(i)[τ(i,s)]α⋅[η(i,s)]β,ifj∈Jk(i)0,otherwise P k ( i , j ) = { [ τ ( i , j ) ] α ⋅ [ η ( i , j ) ] β ∑ s ∈ J k ( i ) [ τ ( i , s ) ] α ⋅ [ η ( i , s ) ] β , i f j ∈ J k ( i ) 0 , o t h e r w i s e
其中, Jk(i) J k ( i ) 表示从城市i可以直接到达的且又不在蚂蚁访问过的城市序列 Rk R k 中的城市集合, η(i,j) η ( i , j ) 是一个启发式信息,通常由 η(i,j)=1/d(i,j) η ( i , j ) = 1 / d ( i , j ) 直接计算, τ(i,j) τ ( i , j ) 表示边 (i,j) ( i , j ) 上的信息素量。由上面公式可知,长度越短、信息素浓度越大的路径被蚂蚁选择的概率越大。 α α 和 β β 是两个预先设置的参数,用来控制信息浓度(路劲的轨迹)与启发式信息(路劲的能见度)作用的权重关系。当 α=0 α = 0 时,算法演变成传统的随机贪婪算法,最邻近城市被选中的概率最大,当 β=0 β = 0 时,蚂蚁完全只根据信息素浓度确定路路径,算法将快速收敛,这样构建出的路径往往与实际目标有着较大的差异,算法的性能比较糟糕。实验表明,在AS中设置 α=1∼2,β=2∼5 α = 1 ∼ 2 , β = 2 ∼ 5 比较合适。信息素更新公式为:
⎧⎩⎨⎪⎪⎪⎪⎪⎪τ(t+1)=(1−ρ)τij(t)+Δτij,0<ρ<1Δτij=∑k=1nΔτkij { τ ( t + 1 ) = ( 1 − ρ ) τ i j ( t ) + Δ τ i j , 0 < ρ < 1 Δ τ i j = ∑ k = 1 n Δ τ i j k
信息素更新的每一轮中,问题空间中的所有路径上的信息素都会蒸发,信息素蒸发时自然界本身固有的特征,在算法中能避免信息素的无限积累,使得算法可以快速丢弃之前构建过的较差的路径。随后所有的蚂蚁根据自己构建路径长度在它们本轮经过的边释放信息素。蚂蚁构建的路径越短释放的信息素越多;一只蚂蚁爬过的边的次数越多、它所获得的信息素也越多。n表示蚂蚁的个数, ρ ρ 是信息素的蒸发率,规定 0<ρ≤1 0 < ρ ≤ 1 ,一般设置为0.5。 Δτkij Δ τ i j k 是第k只蚂蚁在它经过的边 (i,j) ( i , j ) 上释放的信息素量。针对蚂蚁释放信息素问题,M.Dorigo等人曾给出三种不同计算模型,分别为蚁周系统(Ant-Cycle)、蚁量系统(Ant-Quantity)、蚁密系统(Ant-Density)计算公式分别如下:
1.蚁周系统模型(初始时置为0)
Δτkij={Q/Lk,Lk表示第k只蚂蚁在本次循环中所走路径的总长度0,其他 Δ τ i j k = { Q / L k , L k 表 示 第 k 只 蚂 蚁 在 本 次 循 环 中 所 走 路 径 的 总 长 度 0 , 其 他
2.蚁量系统模型(初始时置为0)
Δτkij={Q/dij,dij表示城市i到j的路径长度0,其他 Δ τ i j k = { Q / d i j , d i j 表 示 城 市 i 到 j 的 路 径 长 度 0 , 其 他
3.蚁密系统模型(初始时置为0)
Δτkij={Q0,其他 Δ τ i j k = { Q 0 , 其 他
上式中,Q表示信息素强度,它在一定程度上影响算法的收敛速度。可见 蚁周系统模型 在搜素过程中使用的反馈信息是全局的,而后两者使用的反馈信息是局部的,故前者要优于后两种算法,所以,一般都采用蚁周系统作为基本模型。
在算法初始化时,问题空间中所有边上的信息素都被初始化为 τ0 τ 0 ,如果 τ0 τ 0 太小,算法容易过早收敛,即蚂蚁很快就会集中到一个局部最优路径上,反之,如果 τ0 τ 0 太大,信息素对搜索方向指导作用太低,也会影响算法的性能。对AS来说,一般使用 τ0=m/Cm τ 0 = m / C m ,n是蚂蚁的个数, Cm C m 是由贪婪算法构造的路径长度。
6、蚁群算法求解TSP问题
下面以TSP为例说明基本蚁群算法模型,附c++程序代码
首先将m只蚂蚁随机放置在n个城市,位于城市i的第k只蚂蚁选择下一个城市j的概率为:
Pk(i,j)=⎧⎩⎨⎪⎪[τ(i,j)]α⋅[η(i,j)]β∑s∈Jk(i)[τ(i,s)]α⋅[η(i,s)]β,ifj∉tabuk(i)0,otherwise P k ( i , j ) = { [ τ ( i , j ) ] α ⋅ [ η ( i , j ) ] β ∑ s ∈ J k ( i ) [ τ ( i , s ) ] α ⋅ [ η ( i , s ) ] β , i f j ∉ t a b u k ( i ) 0 , o t h e r w i s e
其中 τ(i,j) τ ( i , j ) 表示边 (i,j) ( i , j ) 上的信息素浓度;
η(i,j)=1/d(i,j) η ( i , j ) = 1 / d ( i , j ) 是启发信息,d是城市i和j之间的距离;
α和β α 和 β 反映了信息素与启发信息的相对重要性;
tabuk t a b u k 表示蚂蚁k已经访问过的城市列表。当所有蚂蚁完成周游后,按如下公式进行信息素更新。
⎧⎩⎨⎪⎪⎪⎪⎪⎪τ(t+1)=(1−ρ)τij(t)+Δτij,0<ρ<1Δτij=∑k=1nΔτkij { τ ( t + 1 ) = ( 1 − ρ ) τ i j ( t ) + Δ τ i j , 0 < ρ < 1 Δ τ i j = ∑ k = 1 n Δ τ i j k
Δτkij={Q/Lk,Lk表示第k只蚂蚁在本次循环中所走路径的总长度0,其他 Δ τ i j k = { Q / L k , L k 表 示 第 k 只 蚂 蚁 在 本 次 循 环 中 所 走 路 径 的 总 长 度 0 , 其 他
7、蚁群算法参数设置经验(基于TSP问题)
- 蚁群算法中参数主要有
m m :蚂蚁数量
蚂蚁数目越多,蚁群算法的全局搜索能力及算法稳定性越强,但是蚂蚁数目过多时,会使大量曾被搜索过的路径上的信息素的变化趋于平均,信息正反馈减弱,虽然全局搜索的随机性加强,但收敛速度变慢;反之,蚂蚁数目过少时,特别是对于规模较大的问题时,使得那些从未被搜索到的路径上的信息素减少至0,全局搜索的随机性减弱,虽然收敛速度变快,但是算法稳定性变差,容易出现过早停滞。
:启发因子
启发因子 α α 反映蚂蚁在运动过程中所积累的信息量在指导蚂蚁搜索中的相对重要程度,其值越大,蚂蚁选择以前走过的路径的可能性就越大,搜索的随机性减弱;而当启发因子 α α 值过小时,则易使蚁群的搜索过早限于局部最优。
β β : 期望启发因子
期望启发因子 β β 反映了启发信息在指导蚁群搜索过程中的相对重要程度,其大小反映了蚁群寻优过程中先验性、确定性因素的作用强度。 β β 越大,则蚂蚁在局部点上选择局部最短路径的可能性越大,但蚁群搜索路径的随机性减弱,易陷入局部最优。
ρ ρ :信息素挥发因子
信息素挥发因子 ρ ρ 对算法的影响具有双重性,当 ρ ρ 较小时,未被选中路径上的信息素量将迅速衰减,这使得搜素空间减小,算法陷入局部最优的可能性加大而算法的收敛速度提高,另一方面,被选路径上的信息素量减小,这使得搜索空间增大,算法陷入局部最优的可能性减少,而算法的收敛性降低。
Q Q :信息素强度
在本应用中采用的是蚁周系统模型,信息素强度 为蚂蚁循环一周时释放在所有路径上的信息素总量。作为反馈量, Q Q 越大算法的收敛性越高,但同时由于反馈加强使搜索空间减小算法陷入局部最优的可能性加大。
:信息素初始值
如果 τ0 τ 0 太小,算法容易过早收敛,即蚂蚁很快就会集中到一个局部最优路径上,反之,如果 τ0 τ 0 太大,信息素对搜索方向指导作用太低,也会影响算法的性能。 - 根据参考论文经验
m=[0.6n,0.9n],α∈[1.0,2.0],β∈[4.0,6.0],ρ∈[0.5,0.8],Q=100,τ0=m/Cm m = [ 0.6 n , 0.9 n ] , α ∈ [ 1.0 , 2.0 ] , β ∈ [ 4.0 , 6.0 ] , ρ ∈ [ 0.5 , 0.8 ] , Q = 100 , τ 0 = m / C m
其中n为城市数量。
8、c++代码实例
因该博客无法上传城市信息文件,现将其和代码一起打包上传至csdn资源库code example。
参考资源:
https://wenku.baidu.com/view/b6c508fb700abb68a982fbca.html?sxts=1530361390173
https://wenku.baidu.com/view/c62a963a76c66137ef06190b.html
声明:博客为个人记录学习日志之用,采用了大量的引用,如有侵权请告知,本人将马上删除,谢谢!!