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)的曲線:
可以看出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,僅供參考
指標 | 星數 |
---|---|
復雜度 | ★★★★★☆☆☆☆☆ |
收斂速度 | ★★★★★★★★☆☆ |
全局搜索 | ★★☆☆☆☆☆☆☆☆ |
局部搜索 | ★★★★☆☆☆☆☆☆ |
優化性能 | ★★★☆☆☆☆☆☆☆ |
跳出局部最優 | ☆☆☆☆☆☆☆☆☆☆ |
改進點 | ★★★★★★★★☆☆ |