1. 螢火蟲算法簡介
(以下描述,均不是學(xué)術(shù)用語,僅供大家快樂的閱讀)
螢火蟲算法(Firefly Algorithm,FA)是一種模仿螢火蟲之間信息交流,相互吸引集合,警戒危險。算法的原理簡單,但實現(xiàn)過程較為復(fù)雜,而且算法的提出時間不長,算法的改進、優(yōu)化處于初級階段,國內(nèi)外相應(yīng)的應(yīng)用研究已經(jīng)有了一定的成果。
螢火蟲算法中,每個螢火蟲的位置代表了一個待求問題的可行解,而螢火蟲的亮度表示該螢火蟲位置的適應(yīng)度,亮度越高的螢火蟲個體在解空間內(nèi)的位置越好。螢火蟲個體之間,高亮度的螢火蟲會吸引低亮度的螢火蟲。在解空間內(nèi),每個螢火蟲會像著亮度比自己高螢火蟲飛行來搜尋更優(yōu)的位置。亮度越大對其他的螢火蟲的吸引度越大。同時,螢火蟲之間光的傳播介質(zhì)會吸收光,降低光的亮度,影響光的傳播,所以螢火蟲之間的吸引度會隨著空間距離成反比,即兩只螢火蟲之間的吸引度會隨著這兩只螢火蟲之間距離的增大而減小
2. 算法流程
這次我們的主角就是它了。(順便吐槽一下,螢火蟲發(fā)光原理是熒光素氧化發(fā)光,那為什么螢火蟲的位置會影響它的亮度呢,難道是不同位置的氧氣濃度不一樣?假裝就是這樣吧)。
一句話簡述螢火蟲算法流程:每只螢火蟲都向著看上去比自己更亮的螢火蟲飛行。
在D維解空間內(nèi)每個螢火蟲的位置為 。
螢火蟲之間的相對吸引度由以下公式(1)
式(1)中為其初始吸引度,即兩只螢火蟲之間距離為0時的吸引度,r為兩只螢火蟲之間的距離。
算法運行過程中,每只螢火蟲將會朝著所有亮度比自己高的所有螢火蟲移動,其移動距離由以下公式(2)計算得出:
其中表示一個比第i個個體亮度更高的螢火蟲的位置,r表示第i個螢火蟲與第j個螢火蟲之間的距離。rand()為一個隨機擾動,
為擾動的步長因子。一般rand()取值為[-0.5,0.5]范圍內(nèi)的均勻分布或者U(0,1)的標(biāo)準(zhǔn)正態(tài)分布a取值為[0,1]之間。
基本流程如下:
(1)初始化,設(shè)定螢火蟲的種群為N,介質(zhì)對光的吸收系數(shù)為 ,初始步長 a=0.97 ,初始吸引度
,其中
,其吸引度公式如(3):
式(3)以保證任何兩個螢火蟲之間的最小吸引度為0.2,最大的吸引度為1.0。
(2)根據(jù)螢火蟲的位置計算出每個螢火蟲的適應(yīng)度值,適應(yīng)度值越優(yōu)的螢火蟲亮度越高。
(3)每個螢火蟲將根據(jù)式(2)向所有比自己亮度高的螢火蟲飛行其中第t代時螢火蟲飛行的步長公式如 (4):
式(4)計算出的螢火蟲飛行步長將隨時間遞減。
由于所有個體只會向比自己亮度高的個體飛行,那么群體中亮度最高的個體將不會更新其位置。本文中群體中亮度最大的個體將按照以下公式(5)來更新自己的位置。
(4)計算在螢火蟲向所有比自己亮度高的其它個體飛行后所到的新位置的適應(yīng)度值,若該位置優(yōu)于飛行之前的位置,則該螢火蟲將飛行到新的位置,否則螢火蟲將停留在原處。
(5)若算法到達最大迭代次數(shù)則將搜索到的最優(yōu)的螢火蟲的位置作為解輸出,否則將跳到步驟(2)。
(又想吐槽了,該算法的論文中的描述與實際算法實現(xiàn)相差較大,我的實現(xiàn)是根據(jù)作者提供的代碼反推得出,若按照原文實現(xiàn),得到的算法性能極差。該算法作者提出的其他算法亦如此)
3. 實驗
實驗一:標(biāo)準(zhǔn)螢火蟲算法
適應(yīng)度函數(shù)還是
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
螢火蟲數(shù)量(種群數(shù)) | 20 |
飛行次數(shù)(最大迭代次數(shù)) | 50 |
初始吸引度 | 1 |
吸引度范圍 | (0.2,1.0) |
介質(zhì)吸收系數(shù) | 1 |
擾動步長因子 | 0.97 |
擾動方式 | 正態(tài)分布 |
取值范圍 | (-100,100) |
實驗次數(shù) | 10 |
從搜索圖像上看,標(biāo)準(zhǔn)螢火蟲算法的搜索行為挺不錯的,可以看出最亮的個體在自身周圍小幅度的搜索,而其他個體則幾乎是圍繞著最優(yōu)個體搜索的同時也在慢慢向其靠近。我們先看看實驗的結(jié)果。
值 | |
---|---|
最優(yōu)值 | 0.008157162631779914 |
最差值 | 3.1035842131176095 |
平均值 | 0.35455247525429945 |
從結(jié)果中我們可以看出,上面看似良好的搜索行為得出的結(jié)果卻不是很穩(wěn)定,一個最差值拉低了整個實驗的平均值。
為什么會這樣呢?
前面我們說過,螢火蟲算法的核心行為就是每只螢火蟲都向著看上去比自己更亮的螢火蟲飛行,這必然會導(dǎo)致群體迅速收斂。群體全都集中于一個位置時,算法的搜索能力會迅速下降且無法跳出局部最優(yōu)。
如何改變現(xiàn)狀呢?
方案1.隨機挑選數(shù)個個體,選擇這些個體中比自己亮的螢火蟲作為目標(biāo)飛行。
方案2.將螢火蟲群體分為數(shù)個組,每個個體向組內(nèi)比自己更亮的螢火蟲飛行。(當(dāng)年師兄的創(chuàng)新點)
**實驗二**.方案1,隨機挑選10個個體
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
螢火蟲數(shù)量(種群數(shù)) | 20 |
飛行次數(shù)(最大迭代次數(shù)) | 50 |
初始吸引度 | 1 |
吸引度范圍 | (0.2,1.0) |
(介質(zhì)吸收系數(shù)) | 1 |
擾動步長因子 | 0.97 |
擾動方式 | 正態(tài)分布 |
目標(biāo)個體 | 10 |
取值范圍 | (-100,100) |
實驗次數(shù) | 10 |
看圖像好像與標(biāo)準(zhǔn)螢火蟲算法的結(jié)果沒有什么別,看看實驗結(jié)果。
值 | |
---|---|
最優(yōu)值 | 2.4611221154186236E-4 |
最差值 | 0.6282110775105908 |
平均值 | 0.13701600336856032 |
可以看出方案1的結(jié)果比標(biāo)準(zhǔn)螢火蟲算法更好,不過仍在誤差范圍內(nèi)(有可能是這幾次運氣好使結(jié)果較好),但是算法的穩(wěn)定性提升了不少。
實驗三.方案2,將螢火蟲隨機分組,組數(shù)為,其中N為螢火蟲總數(shù)
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
螢火蟲數(shù)量(種群數(shù)) | 20 |
飛行次數(shù)(最大迭代次數(shù)) | 50 |
初始吸引度 | 1 |
吸引度范圍 | (0.2,1.0) |
(介質(zhì)吸收系數(shù)) | 1 |
擾動步長因子 | 0.97 |
擾動方式 | 正態(tài)分布 |
分組數(shù) | 4 |
取值范圍 | (-100,100) |
實驗次數(shù) | 10 |
圖像依然沒有太大的變化。
值 | |
---|---|
最優(yōu)值 | 0.009197087309433645 |
最差值 | 0.6407287765162609 |
平均值 | 0.09772547993102201 |
與方案1相比,雖然最優(yōu)值沒有方案1好,但是平均值更加好,算法的穩(wěn)定性更高。
上面的兩種方案給出的都是螢火蟲算法群聚方式的改進,但是我們從圖像中可以看出,按照理論,螢火蟲們應(yīng)該會快速收斂到一起,而實際圖像卻是在整個空間內(nèi)飛行。導(dǎo)致這樣的原因是步長擾動因子計算的方式。
我們可以看看y=0.97^x的曲線圖像
可以看出到200代左右時,其值已經(jīng)非常接近0了,故我們可以推測標(biāo)準(zhǔn)螢火蟲算法會在200代時收斂,在200代之后即失去了全局搜索能力。
對于優(yōu)化算法來說,這不是一個好的設(shè)計,因為問題的難易程度不同,但是算法的收斂時間卻很固。對于簡單的問題,其他算法可能用不了200代就得出結(jié)果,而螢火蟲算法卻還未收斂,對于復(fù)雜的問題,可能200代還未能接近正確結(jié)果卻已經(jīng)收斂,陷入局部最優(yōu)。
如何改進這個問題呢?我們需要找一個與最大迭代次數(shù)相關(guān)的函數(shù)來計算步長擾動因子,即最大迭代次數(shù)為100時和最大迭代次數(shù)為1000時,其曲線不會有太大的區(qū)別。
方案3.步長擾動計算公式為
可以看出當(dāng)最大迭代次數(shù)為100、1000時,曲線的圖像沒有太大的區(qū)別,為什么要取400呢,因為,即有接近一半的迭代周期內(nèi)可以全局搜索,另一半的迭代周期可以局部搜索。
實驗四.方案3
參數(shù) | 值 |
---|---|
問題維度(維度) | 2 |
螢火蟲數(shù)量(種群數(shù)) | 20 |
飛行次數(shù)(最大迭代次數(shù)) | 50 |
初始吸引度 | 1 |
吸引度范圍 | (0.2,1.0) |
(介質(zhì)吸收系數(shù)) | 1 |
擾動步長因子 | 0.97^(400*i/iter) |
擾動方式 | 正態(tài)分布 |
取值范圍 | (-100,100) |
實驗次數(shù) | 10 |
圖像表現(xiàn)的與理論上一致接近20代時螢火蟲結(jié)束全局搜索并收斂于一點,開始局部搜索。在看看最終結(jié)果。
值 | |
---|---|
最優(yōu)值 | 3.614101894633592E-9 |
最差值 | 4.5271253657421557E-7 |
平均值 | 6.55382970718115E-8 |
可以看出結(jié)果明顯好于上面的所有實驗結(jié)果,而且也相對穩(wěn)定,說明上述改進方案改進了算法的收斂速度并提升了算法的性能。
4. 總結(jié)
螢火蟲算法的探究到此也到了尾聲,螢火蟲算法的思想相對比較簡單,但是實際的實現(xiàn)仍然有點復(fù)雜,尤其是論文與實現(xiàn)之間的區(qū)別讓人頭疼。
相對標(biāo)準(zhǔn)螢火蟲算法,給出了3種改進方案,都對算法的性能有一定的提升。由于改進點各不相同,因此這3種方案可以兩兩混合產(chǎn)生新的方案,此處不再贅述
以下指標(biāo)純屬個人yy,僅供參考
指標(biāo) | 星數(shù) |
---|---|
復(fù)雜度 | ★★★★☆☆☆☆☆☆ |
收斂速度 | ★★★★★★★☆☆☆ |
全局搜索 | ★★★★★☆☆☆☆☆ |
局部搜索 | ★★★★★★☆☆☆☆ |
優(yōu)化性能 | ★★★★★☆☆☆☆☆ |
跳出局部最優(yōu) | ☆☆☆☆☆☆☆☆☆☆ |
改進點 | ★★★★★☆☆☆☆☆ |