1. 蝙蝠算法简介
(以下描述,均不是学术用语,仅供大家快乐的阅读)
蝙蝠算法(Bat Algorithm)是受蝙蝠回声定位的特性启发而提出的新兴算法,提出时间是2010年,虽然距今(2020)有近10年,但与其它的经典算法相比仍算一个新算法。算法也已有一定规模的研究和应用,但仍有改进点、创新点及应用点。
蝙蝠算法主要模拟了蝙蝠通过回声定位系统来寻找小型昆虫进行觅食的行为。蝙蝠算法对解空间的搜索方式与粒子群算法(PSO)有一定的类似,与粒子群相比,蝙蝠算法的每只蝙蝠多了频率属性和响度,频率与相对距离决定蝙蝠的速度,而速度与当前位置决定了蝙蝠下一刻的位置。可以看出,算法很符合我们想象中的蝙蝠的回声定位觅食行为:当蝙蝠发出的超声波返回的频率和自己与目标之间的相对距离均较为合适时(目标个头不太大,自己离得也不太远),蝙蝠会加速(或减速)向目标飞去。
当然发送超声波的动物还有海豚什么的,大家可以发挥想象力,创造一个什么海豚算法。
2. 算法流程
这次我们的主角显而易见,就是蝙蝠了。
每一个蝙蝠有四个属性,当前位置X,当前速度V,回声频率f,回声响度A。蝙蝠算法每只蝙蝠的有两种行为(1)更新频率,更新位置,(2)随机飞行
2.1更新速度,更新位置
每只蝙蝠在更新速度之前会先随机自己的超声波频率f:
其中 和表示其频率的最大值和最小值。
然后每只蝙蝠会根据自身当前速度和当前位置与最优位置间的距离来更新其速度:
可以看出,本次飞行的随度是上次的速度与自身位置到最优位置的反方向的合速度。(想不通为什么是 而不是 ,为什么不向着最优个体飞行,不过做了实验,好像区别不大)
更新位置的公式也很简单,和粒子群一样
2.2随机飞行
蝙蝠随机取一个数,如果该数大于蝙蝠的脉冲频率时进行随机飞行。文章中对随机飞行的描述过于抽象,我完全无法明确理解其实现方式。
进行随机飞行的公式如下:
其中, 是[-1,1]内的均匀随机数,A为该代的所有蝙蝠的响度的平均值。
每只蝙蝠每一代会产生一个(0,1)内的随机数rand,如果rand> 则进行随机飞行。
理解的难处在于 的选取。
文章中的伪代码描述见下图:
根据上述描述,我大致有3种理解:
(1) 如果蝙蝠的随机数大于自己的脉冲频率,则 选取最优蝙蝠,即该蝙蝠在最优蝙蝠附近进行随机飞行,否则 选取自己当前位置。
(2) 如果蝙蝠的随机数大于自己的脉冲频率,则 在当前较优的数个蝙蝠中随机选取一个蝙蝠。
(3) 如果蝙蝠的随机数大于自己的脉冲频率,则 选取最优蝙蝠,但是随机飞行时只随机选择最优蝙蝠的一维,其他维保持不变。
反正我不知道是哪一种,亦或是以上都不是。后面我们实验说话。
位置更新完后,蝙蝠会比较新位置与之前的位置中哪个更好,如果新位置更好,则飞行到新的位置,否则留在原处。飞到新位置的同时,蝙蝠会更新自己的响度A和自己的脉冲频率r:
其中 为常数。
我的三个理解的流程图如上,看上去三个都差不太多,但是实现方式和效果的差别还挺大的。
3. 实验
适应度函数。
实验一: 按照理解(1)实现
参数 | 值 |
---|---|
问题维度(维度) | 2 |
总群数量(种群数) | 20 |
搜索次数(最大迭代次数) | 100 |
最小频率-最大频率 | 0-1 |
最小响度-最大响度 | 1-2 |
0.85 | |
0.9 | |
初始脉冲频率r | 0.7 |
取值范围 | (-100,100) |
实验次数 | 10 |
值 | |
---|---|
最优值 | 9.200577911544411E-5 |
最差值 | 98.94310340856839 |
平均值 | 9.894879535644769 |
可以看出按照理解(1)实现的算法有点不稳定,我选取了得到最差值的那次实验的图像,可以看出,算法在一开始收敛很快,在第二代就聚集于一个较小的范围,之后在不停的蠕动着。这说明按照这种方式理解,算法的收敛速度极快,且局部搜索能力较强,但是其全局搜索能力不足,且易陷入局部最优,并且在算法后期,其收敛速度随着蝙蝠越来越集中,变得越来越慢。
实验二: 按照理解(2)实现,选取种群中较优的20%个体为最优群体,每次从最有群体中随机选取一个最为随机飞行的目标位置
参数 | 值 |
---|---|
问题维度(维度) | 2 |
总群数量(种群数) | 20 |
搜索次数(最大迭代次数) | 100 |
最小频率-最大频率 | 0-1 |
最小响度-最大响度 | 1-2 |
0.85 | |
0.9 | |
初始脉冲频率r | 0.7 |
取值范围 | (-100,100) |
实验次数 | 10 |
值 | |
---|---|
最优值 | 2.7533362235525127E-5 |
最差值 | 372.7498404620516 |
平均值 | 139.51154472392443 |
按照理解(2)实现的结果好像比理解(1)差不少。从图像中可以看出,虽然在开始没有像实验一一样收敛的那么快,但是在中期聚集的范围更加集中,导致陷入局部最优难以寻得更优的位置。从理解上看似乎随机飞行的随机性增大了,但只是减缓了收敛速度,并没有增强跳去局部最优的能力。
实验三:按照理解(3),随机选择最优个体的一维进行随机飞行
值 | |
---|---|
最优值 | 1.5094277647207394E-9 |
最差值 | 8.377006798211614E-5 |
平均值 | 1.9714038461326115E-5 |
实验三的结果优于实验一和实验二,但是从图像中可以看出,其实和实验一并没有太大的差别,可以认为这次实验只是运气比较好,每次都在100代内找到较好的解,而实验一也只是在十次实验中有一次没有在100代以内找到最优的个体。
综上,个人认为选择理解(1)和理解(3)差别不大,这两种理解方式都行,理解(2)还有待商榷。
为什么蝙蝠群前期收敛的这么快呢?看一看公式(6)的曲线:
公式6曲线可以看出r的值随着迭代次数iter的增加上升的非常的快,在第6代时就接近1了。R的大小又决定该蝙蝠是否进行随机飞行过程。看了随机飞行的实现方式,可以明确蝙蝠的随机飞行就是一个向着全局最优位置迅速靠近的过程。进行随机飞行的条件决定了算法在最初期蝙蝠会大概率飞向全局最优位置,而在约6代后则大概率按照自己的行为飞行(频率->速度->位置)。因此算法在初期会急速收敛,而后进行局部搜索,这与实验中的表现一致。
实验四:在实验一的基础上,将随机飞行的条件由rand(0,1)>r,修改为rand(0,1)>0.9,即每只蝙蝠每代有10%的概率进行随机飞行,实验图像如下:
实验四图像值 | |
---|---|
最优值 | 9.663711890794937E-5 |
最差值 | 0.002455606291026529 |
平均值 | 0.0014838545478091704 |
可以看出蝙蝠群的收敛速度减慢了不少,这次的结果相对较为稳定,但仍然容易陷入局部最优,不过由于收敛的速度没有那么快,陷入局部最优的概率相对较低。
对于蝙蝠收敛过快导致陷入局部最优的情况,我们也可以学习粒子群算法,对其飞行速度增加上限,保证每只蝙蝠每代的飞行距离存在上限,也能防止其收敛过速。但是这样一来,蝙蝠算法就成了粒子群算法的一个改进。(弱化版“改进”,蝙蝠算法本就是参照了粒子群算法)。
4. 总结
蝙蝠算法提出距今10年,也算法是一个新算法。算法根据蝙蝠觅食的行为对粒子群算法进行了改造。就结果而言,蝙蝠算法可以看做是一个弱化的粒子群,抛弃了粒子群的部分优点(速度最大限制和向着两个目标飞行),引入了频率来控制飞行速度,导致飞行的速度没有粒子群的随机性好,更加容易陷入局部最优,但收敛速度更快。
原始论文的描述不清晰,关键的部分描述的模棱两可,而其他的改进蝙蝠算法的论文中的描述与原始论文如出一辙,感觉并未对算法流程有明确的了解。蝙蝠算法的文章我这几年间反反复复看了很多遍,也参考了前人大神们的代码,感觉这个论文就像《哈姆雷特》一样。
看了数年后还是在此记录一下,可能我的理解能力确实有待提高,但还是希望发布论文时要将细节描述清楚,不然文中的实验将无法由其他读者重现。
参考文献
Yang X S . A New Metaheuristic Bat-Inspired Algorithm[J]. computer knowledge & technology, 2010, 284:65-74.提取码:vu7l
以下指标纯属个人yy,仅供参考
指标 | 星数 |
---|---|
复杂度 | ★★★★★☆☆☆☆☆ |
收敛速度 | ★★★★★★★★☆☆ |
全局搜索 | ★★☆☆☆☆☆☆☆☆ |
局部搜索 | ★★★★☆☆☆☆☆☆ |
优化性能 | ★★★☆☆☆☆☆☆☆ |
跳出局部最优 | ☆☆☆☆☆☆☆☆☆☆ |
改进点 | ★★★★★★★★☆☆ |
网友评论