萤火虫算法_智能优化算法萤火虫算法

今天介绍的算法是萤火虫算法(Firefly Algorithm,简称FA),也是一种仿生优化算法。从算法名字就知道了,该算法的思想来源于萤火虫,具体是萤火虫的闪烁行为。下面是展开对算法相关内容的介绍。

01

原理部分

为了便于算法的设计, 作者给出了三条 理想化的设计 假设[1],分别为:

1.萤火虫不分性别,这样一个萤火虫将会吸引到所有其他的萤火虫;

2.吸引力与它们的亮度成正比,对于任何两个萤火虫,不那么明亮的萤火虫被吸引,因此移动到更亮的一个,然而,亮度又随着其距离的增加而减少;

3.如果没有比一个给定的萤火虫更亮的萤火虫,它会随机移动。

下面是算法的一个伪代码:

abd0ed3d4bcc36e5cc62a34a695b1277.png

结合这个伪代码,对算法中的一些参数进行介绍:

77db686dee376f1159f12dce2e799073.png

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值