算法PPT另附
一、 天然螢火蟲的行爲
天然螢火蟲在尋找獵物、吸引配偶和保護領地時表現出驚人的閃光行爲。螢火蟲的吸引力取決於它的光照強度,對於任何一對螢火蟲來說,較亮的螢火蟲會吸引另一隻螢火蟲。所以,亮度較低的個體移向較亮的個體,同時光的亮度隨着距離的增加而降低。
有些螢火蟲在一大羣螢火蟲中表現出同步閃光的行爲來吸引獵物,雌螢火蟲從靜止的位置觀察雄螢火蟲發出的閃光,在發現一個感興趣的閃光後,雌性螢火蟲會做出反應,發出閃光,求偶儀式就這樣開始了。一些雌性螢火蟲會產生其他種類螢火蟲的閃光模式,來誘捕雄性螢火蟲並喫掉它們。
二、算法原則
根據以上天然螢火蟲的行爲,我們不難得出以下幾個算法原則。
1、無性別
無論是求偶還是捕食,都依賴於螢火蟲自身通過發光實現吸引的目的。無性別即要求將所有的螢火蟲視作無性別,且可吸引別的螢火蟲。
2、最優解
螢火蟲的亮度由它周圍的環境所決定。對於最優解問題,亮度可以簡單地被看做最優解的值。當它處在一個最合適的位置上時,亮度最亮,可視爲找到了最優解。
3、吸引力法則
亮度高的螢火蟲會吸引亮度低的螢火蟲。吸引力與亮度成正比,同時會隨着兩者距離的增加而減少。如果一隻螢火蟲發現沒有比它更亮的螢火蟲,那麼它將會隨機移動。
4、距離反比
由於空氣的吸收,光的強度I隨着與光源距離r的增加而減小
三、僞代碼
在看公式的推導之前,知道了前面的算法原則之後,我們可以先來看一下螢火蟲算法的流程走向。
Begin
初始化算法基本參數:設置螢火蟲數目n,最大吸引度β0,光強吸收係數γ,步長因子α,最大迭代次數MaxGeneration或搜索精度ε;
初始化:隨機初始化螢火蟲的位置,計算螢火蟲的目標函數值作爲各自最大熒光亮度I0;
t=1
while(t<=MaxGeneration || 精度>ε)
計算羣體中螢火蟲的相對亮度I和吸引度β,根據相對亮度決定螢火蟲的移動方向;
更新螢火蟲的空間位置,對處在最佳位置的螢火蟲進行隨機移動;
根據更新後螢火蟲的位置,重新計算螢火蟲的亮度I0;
t=t+1
end while
輸出全局極值點和最優個體值。
end
四、螢火蟲算法詳解
1、算法公式
光強(I)與光源距離(r)服從平方反比定律,因此由於空氣的吸收,光的強度(I)隨着與光源距離的增加而減小,這種現象將螢火蟲的可見性限定在了非常有限的半徑內:
這裏查了一下爲什麼光強是跟距離的平方成反比而不是普通的距離反比。
光強和光亮度成正比,光亮度是發光表面在指定方向的發光強度與垂直且指定方向的發光面的面積之比,所以這裏寫是跟r²成反比。
論文中給出了兩個計算光強的公式
由於當r=0 時,公式(1)數值上極大,與實際不符,故而綜合(1)(2)得出公式(3)
其中I0爲距離r=0時的光強(最亮),即自身亮度,與目標函數值有關,目標值越優,亮度越亮;γ爲吸收係數,因爲熒光會隨着距離的增加和傳播媒介的吸收逐漸減弱,所以設置光強吸收係數以體現此特性,可設置爲常數;r表示兩個螢火蟲之間的距離。
請注意,這裏的距離不一定是歐氏距離,可以根據實際情況選用任何距離算法.
有時我們想選用別的遞減速度沒有那麼快的函數去替代公式(3)
讓我們來看一下(3)(4)的函數走向
可知(4)確實比(3)遞減的更慢一些。
那麼爲什麼可以用(4)去替代(3)呢?
這兩個公式展開後長這樣↓
可以看出,在O(r³)級別以內二者是相等的,r→0,這兩個公式近似相等。
第二步爲種羣初始化:
其中t表示代數,xt表示個體的當前位置,是吸引度,αε是隨機項。
因爲吸引度與亮度成正比,亮度和光強成正比,那麼計算螢火蟲之間的吸引度:
其中表示r=0時的最大吸引度。
理論上,γ∈[0,∞)
實際上,γ是由實際的特徵長度決定的
因此,在大多數應用中,γ取[0.01,100]
下一步,低亮度螢火蟲向較亮螢火蟲運動:
一般而言,取1,,ε取N(0,1)或其他。若是每個維度的α相差較大,可另設取代,
2、算法代碼
以下是個不成熟的小代碼,理論上是這麼寫,實際上的參數並沒有調好
clc,clear
% 構造目標函數
x = linspace(-5,5,10000);
y = 2*sin(3*x)+3*cos(x);
% 原始點位置-光強圖
plot(x,y)
hold on;
n=3; % 種羣個體數目
x_i = -5 + (5+5) * rand(n,1); % 隨機產生n個個體
y_i = 2*sin(3*x_i)+3*cos(x_i);
plot(x_i,y_i,'o')
globe_ans = max(y); % 存儲函數內最大光強
gama = 0.01; % 光強吸收係數
beta = 1; % 最大吸引度
alpha = 0.01; % 步長
maxGeneration = 1000000;% 迭代總次數
t = 1; % 目前的迭代次數
globe_I = max(y_i); % 初始種羣的最大光強
temp_I = 0;
while (t<=maxGeneration)
for i = 1:n
for j = 1:i
% 若j位置的光強大於i位置的,則i位置向j位置發生移動
if y_i(j)>y_i(i)
if x_i(i)>5
x_i(i)=x_i(i)+beta*exp(-gama*(x_i(j)-x_i(i))^2)*(x_i(j)-x_i(i))-alpha* rand(1);
elseif x_i(i)<-5
x_i(i)=x_i(i)+beta*exp(-gama*(x_i(j)-x_i(i))^2)*(x_i(j)-x_i(i))+alpha* rand(1);
else
x_i(i)=x_i(i)+beta*exp(-gama*(x_i(j)-x_i(i))^2)*(x_i(j)-x_i(i))+alpha*(-1 + (1 +1 )) * rand(1);
end
end
end
% 若i位置的光強爲最大光強,則進行隨機移動。
if y_i(i) == max(y_i)
x_i(i)=x_i(i)+alpha*(-1 + (1 +1 )) * rand(1);
end
end
% 更新光強
y_i = 2*sin(3*x_i)+3*cos(x_i);
temp_I = max(y_i); % 最優個體值
% 如果個體最優值大於全局最優值,則進行更新。
if(temp_I>globe_I)
globe_I = temp_I;
x_i
end
t=t+1;
end
globe_I
globe_ans
勉強看個效果圖
- 初始化種羣數量爲3
- 函數爲2sin(3x)+3cos(x)
- 紅色小圓點代表個體所在位置
- 最高峯值點代表最大光強,其數值約爲4.6528
最後全局最優解和理論上的最優解數值相同,意味着找到了光強最亮的那個點
參考文獻
1、X.-S. Yang, “Firefly algorithms for multimodal optimization”, in: Stochastic Algorithms: Foundations and Applications, SAGA 2009,
Lecture Notes in Computer Sciences, Vol. 5792, pp. 169-178 (2009).
2、羣體智能優化算法之螢火蟲算法