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ì)于飛蛾,它圍繞火焰
飛行后到達(dá)的新位置XM_new根據(jù)以下公式計(jì)算得出:

其中
可以看出其飛行公式來自于螺線公式,不過螺線公式是這樣的:

其圖像如下

而算法中的飛行軌跡應(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ù)。
實(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) | ★★★★☆☆☆☆☆☆ |