蝙蝠算法(Bat Algorithm,BA)是一种基于群体智能的算法,是受微型蝙蝠的回声定位的启发,由Xin-She Yang(Yang, 2010a)[1]于2010年提出的。大多数微型蝙蝠将声音辐射到周围环境,并聆听这些声音来自不同物体的的回声,从而可以识别猎物,躲避障碍物,并追踪黑暗的巢穴。声音脉冲因蝙蝠的种类而异,基本上,频率调谐是一种突变,因为它在解中引起波动,主要是在较好的解附近,尽管较大的突变导致全局搜索。特定的选择是通过对相对恒定的选择施加压力来实现的,这是由于在目前已经建立的种群中使用了最优解。与遗传算法相比,没有明显的交叉;然而,响度和脉冲发射的偏差会导致变异的不同。另外,还有一种自动缩放的功能,即随着搜索在响度和脉冲发射率的变化上接近全局最优,利用就会变得集中起来,这导致从探索阶段自动切换到利用阶段。
蝙蝠是唯一有翅膀的哺乳动物,它们具有非凡的回声定位能力。它们是世界上种类第二多的哺乳动物,有超过1200种。一般分为蝙蝠可以分为两类:回声定位微型蝙蝠和以水果为食的巨型蝙蝠。蝙蝠算法是由Yang Xin-She (2010a)[1]基于第一类蝙蝠的行为而开发的。大多数蝙蝠以倒挂的栖息姿势休息。所有的微型蝙蝠和一些巨型蝙蝠都会发出超声波来产生回声。微型蝙蝠的大脑和听觉神经系统可以通过比较出站脉冲和反复出现的回声,对环境产生深入的图像。微型蝙蝠发出这些超声波(通过喉部产生)通常通过嘴巴,偶尔通过鼻子,它们会在回声返回前就结束发出超声波。回声定位可以是低负荷循环,也开始是高负荷循环,第一种情况时,蝙蝠可以根据时间区分它们的叫声和多次出现的回声;第二种情况时,蝙蝠发出不间断的叫声,并在频率上将脉冲和回声分离。回声定位也被称为生物声纳,主要用于动物的导航和觅食。在这些回声的帮助下,蝙蝠测量物体的大小和距离,有些种类的蝙蝠甚至能够测量物体移动的速度。
蝙蝠在寻找目标、对象或猎物时,在位置xi以速度vi随机飞行,其具有静态的频率fmin,变化的波长λ,响度A0。频率变化范围为fmin到fmax,声音的响度可以根据需要在A0和Amin之间变化。Xin-She Yang (2010a)[1]建立了一系列规则来更新蝙蝠寻找猎物时的速度、位置和响度。蝙蝠算法的数学公式如下:\ f i = f min + ( f max − f min ) × β (1) {fi} = {f_{\min }} + \left( { {f_{\max }} - {f_{\min }}} \right) \times \beta \tag 1fi=fmin+(fmax−fmin)×β(1)\ v i t + 1 = v i t + ( x i t − x ∗ ) × f i (2) vi^{t + 1} = vi^t + \left( {xi^t - {x*}} \right) \times {fi}\tag 2vit+1=vit+(xit−x∗)×fi(2)\ x i t + 1 = x i t + v i t (3) xi^{t + 1} = xi^t + vi^t\tag 3xit+1=xit+vit(3)\ A i t + 1 = α A i t , r i t + 1 = r i 0 [ 1 − exp ( − γ t ) ] (4) Ai^{t + 1} = \alpha Ai^t,ri^{t + 1} = ri^0[1 - \exp ( - \gamma t)]\tag 4Ait+1=αAit,rit+1=ri0[1−exp(−γt)](4)\ A i t → 0 , r i t → r i U , a s t → ∞ (5) Ai^t \to 0,ri^t \to ri^U,{\rm{ }}as{\rm{ }}t \to \infty \tag 5Ait→0,rit→riU,ast→∞(5)
其中β为[0,1]内均匀分布的随机数,x*表示当前种群中的全局最优解,r为脉冲发射率,α和γ为常数且0<α<1,γ>0。\ 选择全局最优解后,当前种群中每一个局部解(xold)使用式(6)更新其位置:\ x n e w = x o l d + ε A t (6) {x_{new}} = {x_{old}} + \varepsilon {A^t}\tag 6xnew=xold+εAt(6)
其中ε为[-1,1]之间的任意数。
BA结合了粒子群优化、遗传算法和和声搜索的最佳特性,因此,与这些算法相比,它提供了良好的结果。参数α和γ的调整会影响收敛速度。BA的实现有点复杂,但它已经证明了它的性能,并称为一种良好的受自然启发的元启发式。
蝙蝠算法在优化问题上取得了很好的效果。最近,它经历了多次改进,并通过将其与现有的元启发式杂交或引入一些新的参数来开发一些变体,这里选取一些进行讨论。
Gandomi和Yang(2014)[2]开发了混沌BA的四个变种,每个变种都在13个混沌映射的帮助下得到验证。这些混沌映射代替了固定的参数,增强了灵活性和多样性,因为不同的混沌映射会导致算法的不同行为。提出的改进主要是对参数β、γ(分别见式(7)和(8)),响度A和脉冲发射率r进行改变。\ f i = f min + ( f max − f min ) × C M i (7) {fi} = {f_{\min }} + \left( { {f_{\max }} - {f_{\min }}} \right) \times C{Mi}\tag 7fi=fmin+(fmax−fmin)×CMi(7)\ v i t + 1 = v i t + ( x i t − x ∗ ) × C M i × f i (8) vi^{t + 1} = vi^t + \left( {xi^t - {x*}} \right) \times C{Mi} \times {fi}\tag 8vit+1=vit+(xit−x∗)×CMi×fi(8)
Mirjalili, Mirjalili和Yang(2014)[3]在修改了速度和位置的一些基本概念后,使程序现代化,产生了BA的二进制版本。在离散二进制搜索空间中,由于现有方法无法对位置进行更新,因此引入传递函数对位置进行更新,所使用的传递函数为:\ S ( v i k ( t ) ) = 1 1 + e − v i k ( t ) (9) S\left( {vi^k(t)} \right) = \frac{1}{ {1 + {e^{ - vi^k(t)}}}}\tag 9S(vik(t))=1+e−vik(t)1(9)
其中vik(t)表示第i个个体在第k维上速度。使用传递函数的位置更新如下:
x i k ( t + 1 ) = { 0 if rand < S ( v i k ( t + 1 ) ) 1 if rand ≥ S ( v i k ( t + 1 ) ) (10) x_{i}^{k}(t+1)=\left\{
01 if rand \
\right.\tag {10}xik(t+1)={01 if rand \
在这个过程中,每个个体被分配0或1,因此,随着速度的增加,个体的位置保持不变。为了克服这个问题,提出了一种新的v形传递函数,并利用该函数设计了新的位置更新过程,分别如式(11)和(12)所示:\ V ( v i k ( t ) ) = ∣ 2 π arctan ( π 2 v i k ( t ) ) ∣ (11) V\left( {vi^k(t)} \right) = \left| {\frac{2}{\pi }\arctan \left( {\frac{\pi }{2}vi^k(t)} \right)} \right|\tag {11}V(vik(t))=∣∣∣∣π2arctan(2πvik(t))∣∣∣∣(11)
x i k ( t + 1 ) = { ( x i k ( t ) ) − 1 if rand < V ( v i k ( t + 1 ) ) x i k ( t ) if rand ≥ V ( v i k ( t + 1 ) ) (12) x_{i}^{k}(t+1)=\left\{
(xki(t))−1xki(t) if rand\
\right.\tag {12}xik(t+1)={(xik(t))−1xik(t) if rand\
BA的并行版本是由Tsai, Dao, Yang和Pan (2014)[4]提出的,在并行BA中,群体被分割成了一些子群体,然后这些子群体独立地进行工作。在Tsai, Dao, Yang和Pan (2014)[4]中,群体被分成G组,总迭代包含R(R={R1,2R1,3R1,…})次通信。并行BA算法如下:
Step1:初始化:生成蝙蝠种群,分成G组。分别初始化每个组,并定义迭代集R来实现通信策略。\ Step2:评估:获取每个组中每只蝙蝠的适应度值。\ Step3:更新:使用基本BA(式(2)和(3))更新蝙蝠的速度和位置。\ Step4:通信策略:选择当前群体中最优的蝙蝠(Gt),并将其迁移到每一个组中,每R1次迭代,使用变异的Gt替换每组中最差的蝙蝠。\ Step5:终止:重复Step2-Step5,直到满足终止条件。存储函数f(Gt)的最优值,以及所有蝙蝠Gt中最优蝙蝠的位置。
Chakri、Khelif、Benouaret和Yang(2017)[5]提出了一种新的BA变体—定向BA(dBA),在基本BA算法基础做了四项新的修正,以求解高维问题。蝙蝠在两个不同的方向产生声音脉冲,一个方向是当前群体中最好的,另一个方向是随机的,通过个体的适应性来决定最佳可行食物来源的位置。蝙蝠运动的数学公式由式(13)给出:\ { x i t + 1 = x i t + ( x ∗ − x i t ) f 1 + ( x k t − x i t ) f 2 if F ( x k t ) < F ( x i t ) x i t + 1 = x i t + ( x ∗ − x i t ) f 1 otherwise (13) \left\{
xt+1i=xti+(x∗−xti)f1+(xtk−xti)f2xt+1i=xti+(x∗−xti)f1 if F(xtk)\
\right.\tag {13}{xit+1=xit+(x∗−xit)f1+(xkt−xit)f2xit+1=xit+(x∗−xit)f1 if F(xkt)\
f1=fmin+(fmax−fmin)×rand1f2=fmin+(fmax−fmin)×rand2f1=fmin+(fmax−fmin)×rand1f2=fmin+(fmax−fmin)×rand2
\right.\tag {14}{f1=fmin+(fmax−fmin)×rand1f2=fmin+(fmax−fmin)×rand2(14)\ 提出的策略仅在前期的迭代中增强了探索能力,可以避免过早收敛。蝙蝠的位置更新使用式(15)进行更新,式中用到了响度At和单调递减函数wit。\ x i t + 1 = x i t + < A t > ε w i t (15) xi^{t + 1} = xi^t + < {A^t} > \varepsilon wi^t\tag {15}xit+1=xit+\ εwit(15)\ 其中wi是缩放参数,用于调节搜索过程,其计算工时如下:\ w i t = ( w i 0 − w i ∞ 1 − t max ) × ( t − t max ) + w i ∞ (16) w i^t = \left( {\frac{ { {w_{i0}} - {w_{i\infty }}}}{ {1 - {t_{\max }}}}} \right) \times \left( {t - {t_{\max }}} \right) + {w_{i\infty }}\tag {16}wit=(1−tmaxwi0−wi∞)×(t−tmax)+wi∞(16)
缩放参数的初值(wi0)和终值(wi∞)分别使用式(17)和(18)进行计算:\ w i 0 = ( U b i − L b i ) / 4 (17) {w_{i0}} = \left( {U{bi} - L{bi}} \right)/4\tag {17}wi0=(Ubi−Lbi)/4(17)\ w i ∞ = w i 0 / 100 (18) {w_{i\infty }} = {w_{i0}}/100\tag {18}wi∞=wi0/100(18)\ Chakri等(2017)[5]提出了脉率和响度的变化,如式(19)和(20)所示。\ r t = ( r 0 − r ∞ 1 − t max ) × ( t − t max ) + r ∞ (19) {r^t} = \left( {\frac{ { {r_0} - {r_\infty }}}{ {1 - {t_{\max }}}}} \right) \times \left( {t - {t_{\max }}} \right) + {r_\infty }\tag {19}rt=(1−tmaxr0−r∞)×(t−tmax)+r∞(19)\ A t = ( A 0 − A ∞ 1 − t max ) × ( t − t max ) + A ∞ (20) {A^t} = \left( {\frac{ { {A_0} - {A_\infty }}}{ {1 - {t_{\max }}}}} \right) \times \left( {t - {t_{\max }}} \right) + {A_\infty }\tag {20}At=(1−tmaxA0−A∞)×(t−tmax)+A∞(20)
所提出的两组脉冲发射方向不同,探索和利用都得到了改善,因为它使得移动在最优蝙蝠的方向更加接近有利的搜索空间。此外,提出的脉冲发射速率和响度自适应控制了不同迭代阶段的探索和利用。
Fister, Fong, and Brest(2014)[6]提出了一种自适应BA,期望控制参数在算法运行时能够自动调整,其提出的响度和脉冲率自适应调整如下:\ A t + 1 = { A l b ( t ) + rand 0 ( A u b ( t ) − A l b ( t ) ) if rand 1 < τ 1 A ( t ) otherwise (21) A^{t+1}=\left\{
A(t)lb+rand0(A(t)ub−A(t)lb)A(t) if rand1<τ1 otherwise Alb(t)+rand0(Aub(t)−Alb(t)) if rand1<τ1A(t) otherwise
\right.\tag {21}At+1={Alb(t)+rand0(Aub(t)−Alb(t))A(t) if rand1<τ1 otherwise (21)
其中τi(i={1,2})表示学习率,取固定值τi=0.1。使用该自适应策略,每10个候选解就会被重新构造一次,而且Fister等人(2014)将这种自适应技术与一种流行的进化算法—差分进化(DE)杂交。受自然启发的元启发式的最佳特征是它们之间是合作的,而不是竞争的,因此它们可以彼此杂交。杂交BA使用DE策略更新试验解,如下所示:\ y n = { D E − S trategy, if rand ( 0 , 1 ) ≤ C R ∨ n = D x i n ( t ) otherwise (23) y_{n}=\left\{
DE−S trategy, x(t)in if rand(0,1)≤CR∨n=D otherwise DE−S trategy, if rand(0,1)≤CR∨n=Dxin(t) otherwise
\right.\tag {23}yn={DE−S trategy, xin(t) if rand(0,1)≤CR∨n=D otherwise (23)\ 考虑四种DE策略:\ DE/rand/1/bin:\ y j = x r 1 , j + F × ( x r 2 , j − x r 3 , j ) (24) {yj} = {x_{r1,j}} + F \times \left( { {x_{r2,j}} - {x_{r3,j}}} \right)\tag {24}yj=xr1,j+F×(xr2,j−xr3,j)(24)\ DE/best/1/bin:\ y j = x b e s t , j + F × ( x r 1 , j − x r 2 , j ) (25) {yj} = {x_{best,j}} + F \times \left( { {x_{r1,j}} - {x_{r2,j}}} \right)\tag {25}yj=xbest,j+F×(xr1,j−xr2,j)(25)\ DE/best/2/bin:\ y j = x b e s t , j + F × ( x r 1 , j + x r 2 , j − x r 3 , j − x r 4 , j ) (26) {yj} = {x_{best,j}} + F \times \left( { {x_{r1,j}} + {x_{r2,j}} - {x_{r3,j}} - {x_{r4,j}}} \right)\tag {26}yj=xbest,j+F×(xr1,j+xr2,j−xr3,j−xr4,j)(26)\ DE/randtobest/1/bin:\ y j = x i , j + F × ( b e s t j − x i , j ) − F × ( x r 1 , j − x r 2 , j ) (27) {yj} = {x_{i,j}} + F \times \left( {bes{t_j} - {x_{i,j}}} \right) - F \times \left( { {x_{r1,j}} - {x_{r2,j}}} \right)\tag {27}yj=xi,j+F×(bestj−xi,j)−F×(xr1,j−xr2,j)(27)
所使用的DE策略是修改操作中的最佳解,即“randtobest/1/bin”、“best/2/bin”和“best/1/bin”,通常将模拟蝙蝠引导到当前最佳解的方向。