螢火蟲算法 (Firefly algorithm)

做者:陳星星
連接:https://zhuanlan.zhihu.com/p/67065319
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
 

螢火蟲算法是Xin-She Yang根據螢火蟲的閃爍行爲提出的一種元啓發式算法[1]。維基百科[2]給出了該算法的僞代碼:算法

圖1 螢火蟲算法僞代碼函數

本文將結合Yang的螢火蟲算法MATLAB代碼對該算法進行分析、學習。Yang分享的代碼可從如下連接下載。學習

Firefly Algorithm - File Exchange - MATLAB Centralwww.mathworks.com圖標

firefly_simple.m是Yang提供的一個簡單的二維空間示例。該函數的目的是尋找二元函數 [公式][公式] 範圍內的最大值。spa

[公式] 曲面以下圖所示,在計算範圍內有四個極值。blog

圖2 f(x,y)曲面排序

firefly_simple函數首先對算法參數進行設定。螢火蟲數量爲12,最大代數爲50(默認值)。 [公式]ip

接着對螢火蟲羣體進行初始化——隨機均勻分佈在2D平面中。每一個螢火蟲的亮度爲其所在位置的函數 [公式] 。以下圖所示(筆者對Yang的代碼稍做修改,使點的大小與螢火蟲亮度正相關)。get

圖3 螢火蟲的初始化(圖中等高線表明f(x,y)函數大小,綠色的點表明螢火蟲,其大小與每一個螢火蟲的亮度正相關)it

接着對螢火蟲羣體按照每隻螢火蟲的亮度從小到大排序。當螢火蟲羣體裏第 [公式] 個和第 [公式] 個螢火蟲的歐式距離爲 [公式] 時,定義它們倆的吸引度爲 [公式] 。依次兩兩對比羣體裏任意兩隻螢火蟲亮度亮度,若 [公式] ,則螢火蟲 [公式] 朝向螢火蟲 [公式] 飛去。螢火蟲 [公式] 的位置更新公式爲: [公式]class

式中 [公式][公式] 之間的隨機值, [公式] 即爲螢火蟲移動過程當中加入的隨機y擾動量,避免螢火蟲羣體陷入局部極值。

螢火蟲移動完畢後檢查每隻螢火蟲是否還落在定義域內,若在定義域外則將定義域邊界值賦給螢火蟲的位置。

這樣一代螢火蟲的更新就完成了。在進行下一輪更新時可將 [公式] 乘以一個大於0小於1的數,這樣代數越大,擾動越小,能夠避免螢火蟲最後在極值點附近反覆震盪,加快算法的收斂。

屢次循環後,當算法循環次數達到最大代數值,算法中止,以下圖所示,螢火蟲羣體中最大的亮度值即爲要求的二位函數最大值。

圖4 到達最大代數後算法中止,螢火蟲羣體集中在各個極值點附近

若在設定初始參數時將螢火蟲數量設置的太小,可能會致使算法迭代到最大代數時也爲收斂到最值附近,而是螢火蟲彙集在局部極值。若將螢火蟲數量設置的過大,可能會致使算法收斂過慢。

參考

  1. ^Yang X S. Nature-Inspired Metaheuristic Algorithms[M]. Luniver Press, 2008.
  2. ^https://en.wikipedia.org/wiki/Firefly_algorithm

https://www.zhihu.com/search?type=content&q=%E8%90%A4%E7%81%AB%E8%99%AB%E7%AE%97%E6%B3%95

做者:陳星星

相關文章
相關標籤/搜索