優(yōu)化算法筆記(十五)蝙蝠算法

1. 蝙蝠算法簡(jiǎn)介

(以下描述,均不是學(xué)術(shù)用語(yǔ),僅供大家快樂(lè)的閱讀)
  蝙蝠算法(Bat Algorithm)是受蝙蝠回聲定位的特性啟發(fā)而提出的新興算法,提出時(shí)間是2010年,雖然距今(2020)有近10年,但與其它的經(jīng)典算法相比仍算一個(gè)新算法。算法也已有一定規(guī)模的研究和應(yīng)用,但仍有改進(jìn)點(diǎn)、創(chuàng)新點(diǎn)及應(yīng)用點(diǎn)。
  蝙蝠算法主要模擬了蝙蝠通過(guò)回聲定位系統(tǒng)來(lái)尋找小型昆蟲(chóng)進(jìn)行覓食的行為。蝙蝠算法對(duì)解空間的搜索方式與粒子群算法(PSO)有一定的類(lèi)似,與粒子群相比,蝙蝠算法的每只蝙蝠多了頻率屬性和響度,頻率與相對(duì)距離決定蝙蝠的速度,而速度與當(dāng)前位置決定了蝙蝠下一刻的位置。可以看出,算法很符合我們想象中的蝙蝠的回聲定位覓食行為:當(dāng)蝙蝠發(fā)出的超聲波返回的頻率和自己與目標(biāo)之間的相對(duì)距離均較為合適時(shí)(目標(biāo)個(gè)頭不太大,自己離得也不太遠(yuǎn)),蝙蝠會(huì)加速(或減速)向目標(biāo)飛去。
  當(dāng)然發(fā)送超聲波的動(dòng)物還有海豚什么的,大家可以發(fā)揮想象力,創(chuàng)造一個(gè)什么海豚算法。

2. 算法流程

這次我們的主角顯而易見(jiàn),就是蝙蝠了。


  每一個(gè)蝙蝠有四個(gè)屬性,當(dāng)前位置X,當(dāng)前速度V,回聲頻率f,回聲響度A。蝙蝠算法每只蝙蝠的有兩種行為(1)更新頻率,更新位置,(2)隨機(jī)飛行

2.1更新速度,更新位置

每只蝙蝠在更新速度之前會(huì)先隨機(jī)自己的超聲波頻率f:
f^{t+1}=rand(f_{min},f_{min})(1)
  其中 f_{min}f_{max}表示其頻率的最大值和最小值。
  然后每只蝙蝠會(huì)根據(jù)自身當(dāng)前速度和當(dāng)前位置與最優(yōu)位置間的距離來(lái)更新其速度:
v^{t+1}=v^{t}+f^{t+1}(x^{t}-x_{best}^{t})(2)
  可以看出,本次飛行的隨度是上次的速度與自身位置到最優(yōu)位置的反方向的合速度。(想不通為什么是(x^{t}-x_{best}^{t}) 而不是 (x_{best}^{t}-x^{t}) ,為什么不向著最優(yōu)個(gè)體飛行,不過(guò)做了實(shí)驗(yàn),好像區(qū)別不大)
  更新位置的公式也很簡(jiǎn)單,和粒子群一樣
x^{t+1}=x^{t}+v^{t+1}(3)

2.2隨機(jī)飛行

蝙蝠隨機(jī)取一個(gè)數(shù),如果該數(shù)大于蝙蝠的脈沖頻率時(shí)進(jìn)行隨機(jī)飛行。文章中對(duì)隨機(jī)飛行的描述過(guò)于抽象,我完全無(wú)法明確理解其實(shí)現(xiàn)方式。
  進(jìn)行隨機(jī)飛行的公式如下:
x_{new}=x_{old}+\varepsilon A^t(4)
  其中,\varepsilon 是[-1,1]內(nèi)的均勻隨機(jī)數(shù),A為該代的所有蝙蝠的響度的平均值。
  每只蝙蝠每一代會(huì)產(chǎn)生一個(gè)(0,1)內(nèi)的隨機(jī)數(shù)rand,如果rand>r^t 則進(jìn)行隨機(jī)飛行。
  理解的難處在于 x_{old}的選取。
  文章中的偽代碼描述見(jiàn)下圖:

偽代碼

  根據(jù)上述描述,我大致有3種理解:
  (1) 如果蝙蝠的隨機(jī)數(shù)大于自己的脈沖頻率,則 選取最優(yōu)蝙蝠,即該蝙蝠在最優(yōu)蝙蝠附近進(jìn)行隨機(jī)飛行,否則 選取自己當(dāng)前位置。
  (2) 如果蝙蝠的隨機(jī)數(shù)大于自己的脈沖頻率,則 在當(dāng)前較優(yōu)的數(shù)個(gè)蝙蝠中隨機(jī)選取一個(gè)蝙蝠。
  (3) 如果蝙蝠的隨機(jī)數(shù)大于自己的脈沖頻率,則 選取最優(yōu)蝙蝠,但是隨機(jī)飛行時(shí)只隨機(jī)選擇最優(yōu)蝙蝠的一維,其他維保持不變。

反正我不知道是哪一種,亦或是以上都不是。后面我們實(shí)驗(yàn)說(shuō)話(huà)。
  位置更新完后,蝙蝠會(huì)比較新位置與之前的位置中哪個(gè)更好,如果新位置更好,則飛行到新的位置,否則留在原處。飛到新位置的同時(shí),蝙蝠會(huì)更新自己的響度A和自己的脈沖頻率r:
A^t=\alpha^t A^0(5)
r^{t+1}=r^{t}(1-e^{-\gamma t})(6)
其中 \alpha,\gamma為常數(shù)。

理解1流程圖
理解2流程圖
理解3流程圖

  我的三個(gè)理解的流程圖如上,看上去三個(gè)都差不太多,但是實(shí)現(xiàn)方式和效果的差別還挺大的。

3. 實(shí)驗(yàn)

適應(yīng)度函數(shù)f(x_1,x_2)=(x_1-a)^2+(x_2-b)^2
實(shí)驗(yàn)一: 按照理解(1)實(shí)現(xiàn)

參數(shù)
問(wèn)題維度(維度) 2
總?cè)簲?shù)量(種群數(shù)) 20
搜索次數(shù)(最大迭代次數(shù)) 100
最小頻率-最大頻率 0-1
最小響度-最大響度 1-2
\alpha 0.85
\gamma 0.9
初始脈沖頻率r 0.7
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10
實(shí)驗(yàn)一圖像
最優(yōu)值 9.200577911544411E-5
最差值 98.94310340856839
平均值 9.894879535644769

可以看出按照理解(1)實(shí)現(xiàn)的算法有點(diǎn)不穩(wěn)定,我選取了得到最差值的那次實(shí)驗(yàn)的圖像,可以看出,算法在一開(kāi)始收斂很快,在第二代就聚集于一個(gè)較小的范圍,之后在不停的蠕動(dòng)著。這說(shuō)明按照這種方式理解,算法的收斂速度極快,且局部搜索能力較強(qiáng),但是其全局搜索能力不足,且易陷入局部最優(yōu),并且在算法后期,其收斂速度隨著蝙蝠越來(lái)越集中,變得越來(lái)越慢。

實(shí)驗(yàn)二: 按照理解(2)實(shí)現(xiàn),選取種群中較優(yōu)的20%個(gè)體為最優(yōu)群體,每次從最有群體中隨機(jī)選取一個(gè)最為隨機(jī)飛行的目標(biāo)位置

參數(shù)
問(wèn)題維度(維度) 2
總?cè)簲?shù)量(種群數(shù)) 20
搜索次數(shù)(最大迭代次數(shù)) 100
最小頻率-最大頻率 0-1
最小響度-最大響度 1-2
\alpha 0.85
\gamma 0.9
初始脈沖頻率r 0.7
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10
實(shí)驗(yàn)二圖像
最優(yōu)值 2.7533362235525127E-5
最差值 372.7498404620516
平均值 139.51154472392443

按照理解(2)實(shí)現(xiàn)的結(jié)果好像比理解(1)差不少。從圖像中可以看出,雖然在開(kāi)始沒(méi)有像實(shí)驗(yàn)一一樣收斂的那么快,但是在中期聚集的范圍更加集中,導(dǎo)致陷入局部最優(yōu)難以尋得更優(yōu)的位置。從理解上看似乎隨機(jī)飛行的隨機(jī)性增大了,但只是減緩了收斂速度,并沒(méi)有增強(qiáng)跳去局部最優(yōu)的能力。

實(shí)驗(yàn)三:按照理解(3),隨機(jī)選擇最優(yōu)個(gè)體的一維進(jìn)行隨機(jī)飛行

實(shí)驗(yàn)三圖像

最優(yōu)值 1.5094277647207394E-9
最差值 8.377006798211614E-5
平均值 1.9714038461326115E-5

實(shí)驗(yàn)三的結(jié)果優(yōu)于實(shí)驗(yàn)一和實(shí)驗(yàn)二,但是從圖像中可以看出,其實(shí)和實(shí)驗(yàn)一并沒(méi)有太大的差別,可以認(rèn)為這次實(shí)驗(yàn)只是運(yùn)氣比較好,每次都在100代內(nèi)找到較好的解,而實(shí)驗(yàn)一也只是在十次實(shí)驗(yàn)中有一次沒(méi)有在100代以?xún)?nèi)找到最優(yōu)的個(gè)體。
  綜上,個(gè)人認(rèn)為選擇理解(1)和理解(3)差別不大,這兩種理解方式都行,理解(2)還有待商榷。

為什么蝙蝠群前期收斂的這么快呢?看一看公式(6)的曲線(xiàn):

公式6曲線(xiàn)

可以看出r的值隨著迭代次數(shù)iter的增加上升的非常的快,在第6代時(shí)就接近1了。R的大小又決定該蝙蝠是否進(jìn)行隨機(jī)飛行過(guò)程。看了隨機(jī)飛行的實(shí)現(xiàn)方式,可以明確蝙蝠的隨機(jī)飛行就是一個(gè)向著全局最優(yōu)位置迅速靠近的過(guò)程。進(jìn)行隨機(jī)飛行的條件決定了算法在最初期蝙蝠會(huì)大概率飛向全局最優(yōu)位置,而在約6代后則大概率按照自己的行為飛行(頻率->速度->位置)。因此算法在初期會(huì)急速收斂,而后進(jìn)行局部搜索,這與實(shí)驗(yàn)中的表現(xiàn)一致。

實(shí)驗(yàn)四:在實(shí)驗(yàn)一的基礎(chǔ)上,將隨機(jī)飛行的條件由rand(0,1)>r,修改為rand(0,1)>0.9,即每只蝙蝠每代有10%的概率進(jìn)行隨機(jī)飛行,實(shí)驗(yàn)圖像如下:

實(shí)驗(yàn)四圖像
最優(yōu)值 9.663711890794937E-5
最差值 0.002455606291026529
平均值 0.0014838545478091704

可以看出蝙蝠群的收斂速度減慢了不少,這次的結(jié)果相對(duì)較為穩(wěn)定,但仍然容易陷入局部最優(yōu),不過(guò)由于收斂的速度沒(méi)有那么快,陷入局部最優(yōu)的概率相對(duì)較低。
  對(duì)于蝙蝠收斂過(guò)快導(dǎo)致陷入局部最優(yōu)的情況,我們也可以學(xué)習(xí)粒子群算法,對(duì)其飛行速度增加上限,保證每只蝙蝠每代的飛行距離存在上限,也能防止其收斂過(guò)速。但是這樣一來(lái),蝙蝠算法就成了粒子群算法的一個(gè)改進(jìn)。(弱化版“改進(jìn)”,蝙蝠算法本就是參照了粒子群算法)。

4. 總結(jié)

蝙蝠算法提出距今10年,也算法是一個(gè)新算法。算法根據(jù)蝙蝠覓食的行為對(duì)粒子群算法進(jìn)行了改造。就結(jié)果而言,蝙蝠算法可以看做是一個(gè)弱化的粒子群,拋棄了粒子群的部分優(yōu)點(diǎn)(速度最大限制和向著兩個(gè)目標(biāo)飛行),引入了頻率來(lái)控制飛行速度,導(dǎo)致飛行的速度沒(méi)有粒子群的隨機(jī)性好,更加容易陷入局部最優(yōu),但收斂速度更快。
  原始論文的描述不清晰,關(guān)鍵的部分描述的模棱兩可,而其他的改進(jìn)蝙蝠算法的論文中的描述與原始論文如出一轍,感覺(jué)并未對(duì)算法流程有明確的了解。蝙蝠算法的文章我這幾年間反反復(fù)復(fù)看了很多遍,也參考了前人大神們的代碼,感覺(jué)這個(gè)論文就像《哈姆雷特》一樣。


看了數(shù)年后還是在此記錄一下,可能我的理解能力確實(shí)有待提高,但還是希望發(fā)布論文時(shí)要將細(xì)節(jié)描述清楚,不然文中的實(shí)驗(yàn)將無(wú)法由其他讀者重現(xiàn)。
參考文獻(xiàn)
Yang X S . A New Metaheuristic Bat-Inspired Algorithm[J]. computer knowledge & technology, 2010, 284:65-74.提取碼:vu7l
以下指標(biāo)純屬個(gè)人yy,僅供參考

指標(biāo) 星數(shù)
復(fù)雜度 ★★★★★☆☆☆☆☆
收斂速度 ★★★★★★★★☆☆
全局搜索 ★★☆☆☆☆☆☆☆☆
局部搜索 ★★★★☆☆☆☆☆☆
優(yōu)化性能 ★★★☆☆☆☆☆☆☆
跳出局部最優(yōu) ☆☆☆☆☆☆☆☆☆☆
改進(jìn)點(diǎn) ★★★★★★★★☆☆

目錄
上一篇 優(yōu)化算法筆記(十四)水波算法
下一篇 優(yōu)化算法筆記(十六)混合蛙跳算法

優(yōu)化算法matlab實(shí)現(xiàn)(十五)蝙蝠算法matlab實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。