連接:https://zhuanlan.zhihu.com/p/67065319
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
螢火蟲算法是Xin-She Yang根據螢火蟲的閃爍行爲提出的一種元啓發式算法[1]。維基百科[2]給出了該算法的僞代碼:算法
![](http://static.javashuo.com/static/loading.gif)
圖1 螢火蟲算法僞代碼函數
本文將結合Yang的螢火蟲算法MATLAB代碼對該算法進行分析、學習。Yang分享的代碼可從如下連接下載。學習
Firefly Algorithm - File Exchange - MATLAB Centralwww.mathworks.com![圖標](http://static.javashuo.com/static/loading.gif)
firefly_simple.m是Yang提供的一個簡單的二維空間示例。該函數的目的是尋找二元函數 在
範圍內的最大值。spa
曲面以下圖所示,在計算範圍內有四個極值。blog
![](http://static.javashuo.com/static/loading.gif)
圖2 f(x,y)曲面排序
firefly_simple函數首先對算法參數進行設定。螢火蟲數量爲12,最大代數爲50(默認值)。 。ip
接着對螢火蟲羣體進行初始化——隨機均勻分佈在2D平面中。每一個螢火蟲的亮度爲其所在位置的函數 。以下圖所示(筆者對Yang的代碼稍做修改,使點的大小與螢火蟲亮度正相關)。get
![](http://static.javashuo.com/static/loading.gif)
圖3 螢火蟲的初始化(圖中等高線表明f(x,y)函數大小,綠色的點表明螢火蟲,其大小與每一個螢火蟲的亮度正相關)it
接着對螢火蟲羣體按照每隻螢火蟲的亮度從小到大排序。當螢火蟲羣體裏第 個和第
個螢火蟲的歐式距離爲
時,定義它們倆的吸引度爲
。依次兩兩對比羣體裏任意兩隻螢火蟲亮度亮度,若
,則螢火蟲
朝向螢火蟲
飛去。螢火蟲
的位置更新公式爲:
。class
式中 爲
之間的隨機值,
即爲螢火蟲移動過程當中加入的隨機y擾動量,避免螢火蟲羣體陷入局部極值。
螢火蟲移動完畢後檢查每隻螢火蟲是否還落在定義域內,若在定義域外則將定義域邊界值賦給螢火蟲的位置。
這樣一代螢火蟲的更新就完成了。在進行下一輪更新時可將 乘以一個大於0小於1的數,這樣代數越大,擾動越小,能夠避免螢火蟲最後在極值點附近反覆震盪,加快算法的收斂。
屢次循環後,當算法循環次數達到最大代數值,算法中止,以下圖所示,螢火蟲羣體中最大的亮度值即爲要求的二位函數最大值。
![](http://static.javashuo.com/static/loading.gif)
圖4 到達最大代數後算法中止,螢火蟲羣體集中在各個極值點附近
若在設定初始參數時將螢火蟲數量設置的太小,可能會致使算法迭代到最大代數時也爲收斂到最值附近,而是螢火蟲彙集在局部極值。若將螢火蟲數量設置的過大,可能會致使算法收斂過慢。
參考
https://www.zhihu.com/search?type=content&q=%E8%90%A4%E7%81%AB%E8%99%AB%E7%AE%97%E6%B3%95
做者:陳星星