今天介绍的算法是萤火虫算法(Firefly Algorithm,简称FA),也是一种仿生优化算法。从算法名字就知道了,该算法的思想来源于萤火虫,具体是萤火虫的闪烁行为。下面是展开对算法相关内容的介绍。
01
—
原理部分
为了便于算法的设计, 作者给出了三条 理想化的设计 假设[1],分别为:1.萤火虫不分性别,这样一个萤火虫将会吸引到所有其他的萤火虫;
2.吸引力与它们的亮度成正比,对于任何两个萤火虫,不那么明亮的萤火虫被吸引,因此移动到更亮的一个,然而,亮度又随着其距离的增加而减少;
3.如果没有比一个给定的萤火虫更亮的萤火虫,它会随机移动。
下面是算法的一个伪代码:
02
—
实现代码
fa.m
clc;clear;close all;%% Problem DefinitionCostFunction=@(x) Sphere(x); % Cost FunctionnVar=5; % Number of Decision VariablesVarSize=[1 nVar]; % Decision Variables Matrix SizeVarMin=-10; % Decision Variables Lower BoundVarMax= 10; % Decision Variables Upper Bound%% Firefly Algorithm ParametersMaxIt=1000; % Maximum Number of IterationsnPop=25; % Number of Fireflies (Swarm Size)gamma=1; % Light Absorption Coefficientbeta0=2; % Attraction Coefficient Base Valuealpha=0.2; % Mutation Coefficientalpha_damp=0.98; % Mutation Coefficient Damping Ratiodelta=0.05*(VarMax-VarMin); % Uniform Mutation Rangem=2;if isscalar(VarMin) && isscalar(VarMax) dmax = (VarMax-VarMin)*sqrt(nVar);else dmax = norm(VarMax-VarMin);end%% Initialization% Empty Firefly Structurefirefly.Position=[];firefly.Cost=[];% Initialize Population Arraypop=repmat(firefly,nPop,1);% Initialize Best Solution Ever FoundBestSol.Cost=inf;% Create Initial Firefliesfor 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); endend% Array to Hold Best Cost ValuesBestCost=zeros(MaxIt,1);%% Firefly Algorithm Main Loopfor 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%% Resultsfigure;%plot(BestCost,'LineWidth',2);semilogy(BestCost,'LineWidth',2);xlabel('Iteration');ylabel('Best Cost');grid on;
Sphere.m
function z=Sphere(x) z=sum(x.^2);end
03
—
结语
以上就是对萤火虫算法的简单介绍,具体内容可参考原论文。在公众号内回复萤火虫算法即可获得原论文。[1] Yang X S. Firefly algorithms for multimodal optimization[C]//International symposium on stochastic algorithms. Springer, Berlin, Heidelberg, 2009: 169-178.
[2]https://ww2.mathworks.cn/matlabcentral/fileexchange/52900-firefly-algorithm-fa