firefly algorithm
螢火蟲優化算法是模擬自然界中螢火蟲總是朝着發光最亮的螢火蟲的位置進行移動的算法。(一般的群智能算法就是模擬該生物的生存行為的(覓食,求偶,遷徙。。。)
換句話說:
螢火蟲算法(Firefly Algorithm,FA)是一種模仿螢火蟲之間信息交流,相互吸引集合,警戒危險。算法的原理簡單,但實現過程較為復雜,而且算法的提出時間不長(2008年劍橋學者(Xin-She Yang,挺牛逼的,提出了很多的算法,這些人的腦子都是怎么長得。。。?都是地球人,為啥別人那么優秀
),算法的改進、優化處於初級階段,國內外相應的應用研究已經有了一定的成果(一般的NP-hard問題,工程優化,調度問題等等,反正,很多。
螢火蟲算法中,每個螢火蟲的位置代表了一個待求問題的可行解,而螢火蟲的亮度表示該螢火蟲位置的適應度,亮度越高的螢火蟲個體在解空間內的位置越好。螢火蟲個體之間,高亮度的螢火蟲會吸引低亮度的螢火蟲。在解空間(搜索空間)內,每個螢火蟲會像着亮度比自己高螢火蟲飛行來搜尋更優的位置。亮度越大對其他的螢火蟲的吸引度越大。同時,螢火蟲之間光的傳播介質會吸收光,降低光的亮度,影響光的傳播,所以螢火蟲之間的吸引度會隨着空間距離成反比,即兩只螢火蟲之間的吸引度會隨着這兩只螢火蟲之間距離的增大而減小。
算法中的兩個要素是亮度和吸引度,螢火蟲位置越優,
亮度越大,吸引亮度小的螢火蟲向自己移動;螢火蟲之間距
離越近,吸引度越大,移動距離越長。
算法的相關描述如下:
(1)螢火蟲亮度:
(2.) 螢火蟲之間的相對吸引度:
其中, d為所求解問題的維數。
(3)螢火蟲 i 被比其明亮的螢火蟲 j 吸引而移動,其位置更新公式為:
這個是之前看的一篇文獻上面的,我感覺寫的很簡潔,比原作者寫的好一些,原作者的代碼很清楚但是論文的結構我看起來很費勁。。
Reference
[1]劉曉明,沈明玉,侯整風.基於Levy飛行的螢火蟲模糊聚類算法[J/OL].計算機應用:1-8[2019-11-08].http://kns.cnki.net/kcms/detail/51.1307.TP.20190822.0958.008.html.
[2]Firefly Algorithms for Multimodal Optimization(springer)上面的
%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YOEA112
% Project Title: Implementation of Firefly Algorithm (FA) in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
%
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
%
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
clc;
clear;
close all;
%% Problem Definition
CostFunction=@(x) Rosenbrock(x); % Cost Function
nVar=5; % Number of Decision Variables
VarSize=[1 nVar]; % Decision Variables Matrix Size
VarMin=-10; % Decision Variables Lower Bound
VarMax= 10; % Decision Variables Upper Bound
%% Firefly Algorithm Parameters
MaxIt=1000; % Maximum Number of Iterations
nPop=25; % Number of Fireflies (Swarm Size)
gamma=1; % Light Absorption Coefficient
beta0=2; % Attraction Coefficient Base Value
alpha=0.2; % Mutation Coefficient
alpha_damp=0.98; % Mutation Coefficient Damping Ratio
delta=0.05*(VarMax-VarMin); % Uniform Mutation Range
m=2;
if isscalar(VarMin) && isscalar(VarMax)
dmax = (VarMax-VarMin)*sqrt(nVar);
else
dmax = norm(VarMax-VarMin);
end
%% Initialization
% Empty Firefly Structure
firefly.Position=[];
firefly.Cost=[];
% Initialize Population Array
pop=repmat(firefly,nPop,1);
% Initialize Best Solution Ever Found
BestSol.Cost=inf;
% Create Initial Fireflies
for i=1:nPop
pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
pop(i).Cost=CostFunction(pop(i).Position);
if pop(i).Cost<=BestSol.Cost
BestSol=pop(i);
end
end
% Array to Hold Best Cost Values
BestCost=zeros(MaxIt,1);
%% Firefly Algorithm Main Loop
for it=1:MaxIt
newpop=repmat(firefly,nPop,1);
for i=1:nPop
newpop(i).Cost = inf;
for j=1:nPop
if pop(j).Cost < pop(i).Cost
rij=norm(pop(i).Position-pop(j).Position)/dmax;
beta=beta0*exp(-gamma*rij^m);
e=delta*unifrnd(-1,+1,VarSize);
%e=delta*randn(VarSize);
newsol.Position = pop(i).Position ...
+ beta*rand(VarSize).*(pop(j).Position-pop(i).Position) ...
+ alpha*e;
newsol.Position=max(newsol.Position,VarMin);
newsol.Position=min(newsol.Position,VarMax);
newsol.Cost=CostFunction(newsol.Position);
if newsol.Cost <= newpop(i).Cost
newpop(i) = newsol;
if newpop(i).Cost<=BestSol.Cost
BestSol=newpop(i);
end
end
end
end
end
% Merge
pop=[pop
newpop]; %#ok
% Sort
[~, SortOrder]=sort([pop.Cost]);
pop=pop(SortOrder);
% Truncate
pop=pop(1:nPop);
% Store Best Cost Ever Found
BestCost(it)=BestSol.Cost;
% Show Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
% Damp Mutation Coefficient
alpha = alpha*alpha_damp;
end
%% Results
figure;
%plot(BestCost,'LineWidth',2);
semilogy(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
這個是matlab代碼,不是r的,但是我貌似用的是R的格式。。。我回頭查一下R的怎么使用
提示一下,這個是基本的代碼,我沒放測試函數,測試函數一般基本的是23個,這個是開源的,可以自己編寫一個運行一下,我一般是把23個放到一起,基本思路是一樣的,只不過是每個人的style不同。。