優(yōu)化算法筆記(二十五)飛蛾撲火算法

1. 飛蛾撲火算法簡(jiǎn)介

(以下描述,均不是學(xué)術(shù)用語,僅供大家快樂的閱讀)
  飛蛾撲火算法(Moth-Flame Optimization)是受飛蛾圍繞火焰飛行啟發(fā)而提出的算法。算法提出于2015年5月(投稿日期),雖可算作一個(gè)新算法,不過無數(shù)研究者就像飛蛾見了火一樣,發(fā)表了如此之多的論文,驚了。
  飛蛾撲火算法中有兩種個(gè)體,飛蛾和火焰,飛蛾選擇并圍繞火焰以螺線方式飛行搜索,搜索完后,火焰將移動(dòng)位置,以保持火焰是飛蛾和火焰群體中最優(yōu)的位置。
  算法的流程簡(jiǎn)單,螺線搜索在之前的鯨魚算法中也出現(xiàn)過,這里會(huì)較為詳細(xì)的記錄記錄螺線搜索的具體情況。

2. 算法流程

顯然,飛蛾撲火算法中有兩種角色,飛蛾與火焰。初始時(shí)飛蛾與火焰的數(shù)量均為N。為了方便查看,將飛蛾的位置表示為XM ,火焰的位置為 XF。
  初始化時(shí),會(huì)在解空間內(nèi)初始化N個(gè)飛蛾與M(M=N)個(gè)火焰。在算法過程中,飛蛾將會(huì)圍繞它所選擇的火焰飛行,之后將這N個(gè)飛蛾與M個(gè)火焰按優(yōu)劣排序,并將M個(gè)火焰移動(dòng)到較優(yōu)的前M個(gè)個(gè)體的位置。其中火焰的數(shù)量M會(huì)隨著迭代次數(shù)的改變而不斷變化,論文中階梯遞減至1。
  算法的主要步驟如下:
  1. 飛蛾選擇火焰(將火焰分配給飛蛾)。
  2. 飛蛾圍繞火焰飛行。
  3. 移動(dòng)火焰到相應(yīng)位置。
  從步驟可以看出,算法中飛蛾的飛行是一種無貪心算法的操作,而火焰的移動(dòng)則是一種變相的貪心操作。

2.1飛蛾選擇火焰

初始化時(shí),會(huì)有N個(gè)飛蛾和N個(gè)火焰(M=N),故每只飛蛾都可以選擇互不相同的火焰。隨著迭代次數(shù)的遞增,火焰的數(shù)量會(huì)遞減。其數(shù)量根據(jù)以下公式計(jì)算得出:


其圖像如下圖所示:



  其實(shí)就是將火焰數(shù)量M線性遞減到1,由于火焰數(shù)量是正數(shù),故圖像呈階梯狀。
  隨著迭代次數(shù)增加,火焰數(shù)量遞減,每只飛蛾無法選擇互不相同的火焰,此時(shí)可以隨機(jī)選擇火焰或者飛蛾群體按順序依次往后選取,類似于取模。兩種方式的差別不大。

2.2飛蛾圍繞火焰飛行

該步驟是算法的核心計(jì)算步驟。
  對(duì)于飛蛾XM_i,它圍繞火焰XF_j飛行后到達(dá)的新位置XM_new根據(jù)以下公式計(jì)算得出:


  其中D_{i,j}為該飛蛾與該火焰的距離,具體計(jì)算應(yīng)該是對(duì)應(yīng)維度差的絕對(duì)值,t為取值范圍為(T,1)的均勻隨機(jī)數(shù),其中T的初始值為-1,并隨著迭代次數(shù)增加,線性遞減至-2,b未找到值,取1。
可以看出其飛行公式來自于螺線公式,不過螺線公式是這樣的:


其圖像如下



而算法中的飛行軌跡應(yīng)該是這樣的:



當(dāng)D=2時(shí)其圖像如下圖(修改了下相位,不然是一條直線段了):

該圖像其實(shí)不是一條直線,而是多條折線往返于兩端點(diǎn)之間。

取出一維看看


其中i為計(jì)算次數(shù)。



  圖像就是cos函數(shù)圖像的變形??紤]到飛蛾與火焰之間的距離會(huì)越來越短,其飛行圖像應(yīng)該與上圖相反,即振幅越來越小,局部搜索能力越來越強(qiáng)。

2.3移動(dòng)火焰到相應(yīng)位置

N只飛蛾圍繞M個(gè)火焰飛行后,會(huì)到N個(gè)新位置,計(jì)算這N個(gè)新位置的適應(yīng)度值,將這N個(gè)新位置與M個(gè)火焰這(N+M)個(gè)位置按優(yōu)劣排序,并將其中較優(yōu)的M個(gè)位置作為下一輪中火焰的位置。

2.4 總體流程

其飛蛾撲火算法流程圖如下:


  可以看出,飛蛾撲火算法的流程也是非常簡(jiǎn)單的。不過,這個(gè)流程圖是不是很眼熟呢?是的,這流程圖和蟻獅算法幾乎一樣。飛蛾撲火算法與蟻獅算法的區(qū)別在于:
  1. 蟻獅數(shù)量恒定而火焰數(shù)量遞減。
  2. 蟻獅使用隨機(jī)游走搜索,飛蛾撲火使用螺線搜索。
  飛蛾撲火算法(2015年5月發(fā)表)可以說是對(duì)蟻獅算法(2015年1月發(fā)表)的一種改進(jìn),或者說 飛蛾撲火算法=蟻獅算法+鯨魚算法

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

由于飛蛾撲火算法可以說是對(duì)蟻獅算法和鯨魚算法的結(jié)合,這里就看看算法的圖像,不再做其他處理了。
適應(yīng)度函數(shù)f(x_1,x_2)=(x_1-a)^2+(x_2-b)^2,a=b=90。

實(shí)驗(yàn)一:

問題維度(維度) 2
總?cè)簲?shù)量(種群數(shù)) 20
最大迭代次數(shù) 50
取值范圍 (-100,100)
實(shí)驗(yàn)次數(shù) 10
b 1
最優(yōu)值 3.039575731125185E-22
最差值 1.2103078399286082E-12
平均值 1.2103148083869415E-13

從結(jié)果看來,飛蛾撲火算法的性能穩(wěn)定也優(yōu)于蟻獅算法,從圖像看算法收斂性不如蟻獅算法但局部搜索性能要強(qiáng)于蟻獅算法。
  可見螺線的局部搜索能力還是強(qiáng)于隨機(jī)游走的,不過其全局搜索要弱于隨機(jī)游走。相比蟻獅算法,飛蛾撲火算法更容易陷入局部最優(yōu)(其實(shí)與蟻獅差不多,只要火焰/蟻獅陷入局部最優(yōu)基本完蛋,不過蟻獅數(shù)量恒定,火焰數(shù)量遞減,所有火焰更容易局部最優(yōu))。

4. 總結(jié)

飛蛾撲火算法是根據(jù)飛蛾圍繞火焰飛行的行為而提出的算法。算法的結(jié)構(gòu)比較簡(jiǎn)單,與蟻獅算法類似,只是搜索步驟將隨機(jī)游走替換成了螺線搜索(當(dāng)然還有跟多細(xì)節(jié)上的不同,可以看看原文)。算法的局部搜索能力非常強(qiáng),依靠螺線就提供了全局搜索和局部搜索能力,其全局搜索和局部搜索能力強(qiáng)弱由其極半徑?jīng)Q定,算法中由b決定。不過算法缺少跳出局部最優(yōu)的能力,在平滑函數(shù)中的效果非常好,在局部最優(yōu)較多的函數(shù)中效果中規(guī)中矩。

參考文獻(xiàn)
Mirjalili S . Moth-flame optimization algorithm: A novel nature-inspired heuristic paradigm[J]. Knowledge-Based Systems, 2015, 89(NOV.):228-249.. 提取碼:koy9
以下指標(biāo)純屬個(gè)人yy,僅供參考

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

目錄
上一篇 優(yōu)化算法筆記(二十四)帝王蝶算法
下一篇 優(yōu)化算法筆記(二十六)和聲搜索算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容