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:
其中 和
表示其頻率的最大值和最小值。
然后每只蝙蝠會(huì)根據(jù)自身當(dāng)前速度和當(dāng)前位置與最優(yōu)位置間的距離來(lái)更新其速度:
可以看出,本次飛行的隨度是上次的速度與自身位置到最優(yōu)位置的反方向的合速度。(想不通為什么是 而不是
,為什么不向著最優(yōu)個(gè)體飛行,不過(guò)做了實(shí)驗(yàn),好像區(qū)別不大)
更新位置的公式也很簡(jiǎn)單,和粒子群一樣
2.2隨機(jī)飛行
蝙蝠隨機(jī)取一個(gè)數(shù),如果該數(shù)大于蝙蝠的脈沖頻率時(shí)進(jìn)行隨機(jī)飛行。文章中對(duì)隨機(jī)飛行的描述過(guò)于抽象,我完全無(wú)法明確理解其實(shí)現(xiàn)方式。
進(jìn)行隨機(jī)飛行的公式如下:
其中, 是[-1,1]內(nèi)的均勻隨機(jī)數(shù),A為該代的所有蝙蝠的響度的平均值。
每只蝙蝠每一代會(huì)產(chǎn)生一個(gè)(0,1)內(nèi)的隨機(jī)數(shù)rand,如果rand> 則進(jìn)行隨機(jī)飛行。
理解的難處在于 的選取。
文章中的偽代碼描述見(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:
其中 為常數(shù)。
我的三個(gè)理解的流程圖如上,看上去三個(gè)都差不太多,但是實(shí)現(xiàn)方式和效果的差別還挺大的。
3. 實(shí)驗(yàn)
適應(yīng)度函數(shù)。
實(shí)驗(yàn)一: 按照理解(1)實(shí)現(xiàn)
參數(shù) | 值 |
---|---|
問(wèn)題維度(維度) | 2 |
總?cè)簲?shù)量(種群數(shù)) | 20 |
搜索次數(shù)(最大迭代次數(shù)) | 100 |
最小頻率-最大頻率 | 0-1 |
最小響度-最大響度 | 1-2 |
0.85 | |
0.9 | |
初始脈沖頻率r | 0.7 |
取值范圍 | (-100,100) |
實(shí)驗(yàn)次數(shù) | 10 |
值 | |
---|---|
最優(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 |
0.85 | |
0.9 | |
初始脈沖頻率r | 0.7 |
取值范圍 | (-100,100) |
實(shí)驗(yàn)次數(shù) | 10 |
值 | |
---|---|
最優(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ī)飛行
值 | |
---|---|
最優(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):
可以看出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)圖像如下:
值 | |
---|---|
最優(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) | ★★★★★★★★☆☆ |