萤火虫优化算法(FA)附matlab代码

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 萤火虫优化算法(FA)附matlab代码


✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测雷达通信 无线传感器

信号处理图像处理路径规划元胞自动机无人机 电力系统

⛄ 内容介绍

FA算法的基本思想是,低亮度的火虫会被绝对亮度比它大的萤火虫吸引并向其靠笼,根据位置更新公式更新自身位置,使所有萤火虫向亮度高的火虫移动从而实现寻优的目的由于FA算法中的最优是根据䖵火虫的绝对亮度来定的,因此,需要建立苗火虫的绝对亮度与目标函数值之间的关系。萤火虫火虫的相对亮度的定义式为

 FA算法的基本流程如图1所示。算法初始化阶段主要将火虫均匀随机分布于搜索空间内,并根据亮度公式计算出每个火虫的亮度,然后亮度低的萤火虫被亮度高的萤火虫所吸引并向其移动,按式(7)更新位置,重新计算萤火虫亮度,最后在达到精度要求或最大迭代次数后结束。

⛄ 完整代码


% Usage: firefly_simple([number_of_fireflies,MaxGeneration])

%  eg:   firefly_simple([12,50]);

function [best]=firefly_simple(instr)

% n=number of fireflies

% MaxGeneration=number of pseudo time steps

if nargin<1,   instr=[12 50];     end

n=instr(1);  MaxGeneration=instr(2);

rand('state',0);  % Reset the random generator

% ------ Four peak functions ---------------------

str1='exp(-(x-4)^2-(y-4)^2)+exp(-(x+4)^2-(y-4)^2)';

str2='+2*exp(-x^2-(y+4)^2)+2*exp(-x^2-y^2)';

funstr=strcat(str1,str2);

% Converting to an inline function

f=vectorize(inline(funstr));

% range=[xmin xmax ymin ymax];

range=[-5 5 -5 5];


% ------------------------------------------------

alpha=0.2;      % Randomness 0--1 (highly random)

gamma=1.0;      % Absorption coefficient

% ------------------------------------------------

% Grid values are used for display only

Ngrid=100;

dx=(range(2)-range(1))/Ngrid;

dy=(range(4)-range(3))/Ngrid;

[x,y]=meshgrid(range(1):dx:range(2),...

              range(3):dy:range(4));

z=f(x,y);

% Display the shape of the objective function

figure(1);    surfc(x,y,z);


% ------------------------------------------------

% generating the initial locations of n fireflies

[xn,yn,Lightn]=init_ffa(n,range);

% Display the paths of fireflies in a figure with

% contours of the function to be optimized

figure(2);

% Iterations or pseudo time marching

for i=1:MaxGeneration,     %%%%% start iterations

% Show the contours of the function

contour(x,y,z,15); hold on;

% Evaluate new solutions

zn=f(xn,yn);


% Ranking the fireflies by their light intensity

[Lightn,Index]=sort(zn);

xn=xn(Index); yn=yn(Index);

xo=xn;   yo=yn;    Lighto=Lightn;

% Trace the paths of all roaming  fireflies

plot(xn,yn,'.','markersize',10,'markerfacecolor','g');

% Move all fireflies to the better locations

[xn,yn]=ffa_move(xn,yn,Lightn,xo,yo,Lighto,alpha,gamma,range);

drawnow;

% Use "hold on" to show the paths of fireflies

   hold off;

end   %%%%% end of iterations

best(:,1)=xo'; best(:,2)=yo'; best(:,3)=Lighto';


% ----- All subfunctions are listed here ---------

% The initial locations of n fireflies

function [xn,yn,Lightn]=init_ffa(n,range)

xrange=range(2)-range(1);

yrange=range(4)-range(3);

xn=rand(1,n)*xrange+range(1);

yn=rand(1,n)*yrange+range(3);

Lightn=zeros(size(yn));


% Move all fireflies toward brighter ones

function [xn,yn]=ffa_move(xn,yn,Lightn,xo,yo,...

   Lighto,alpha,gamma,range)

ni=size(yn,2); nj=size(yo,2);

for i=1:ni,

% The attractiveness parameter beta=exp(-gamma*r)

   for j=1:nj,

r=sqrt((xn(i)-xo(j))^2+(yn(i)-yo(j))^2);

if Lightn(i)<Lighto(j), % Brighter and more attractive

beta0=1;     beta=beta0*exp(-gamma*r.^2);

xn(i)=xn(i).*(1-beta)+xo(j).*beta+alpha.*(rand-0.5);

yn(i)=yn(i).*(1-beta)+yo(j).*beta+alpha.*(rand-0.5);

end

   end % end for j

end % end for i

[xn,yn]=findrange(xn,yn,range);


% Make sure the fireflies are within the range

function [xn,yn]=findrange(xn,yn,range)

for i=1:length(yn),

  if xn(i)<=range(1), xn(i)=range(1); end

  if xn(i)>=range(2), xn(i)=range(2); end

  if yn(i)<=range(3), yn(i)=range(3); end

  if yn(i)>=range(4), yn(i)=range(4); end

end

%  ============== end =====================================


% ======================================================== %

% Files of the Matlab programs included in the book:       %


function fa_mincon

% parameters [n N_iteration alpha betamin gamma]

para=[40 150 0.5 0.2 1];


help fa_mincon.m

% This demo uses the Firefly Algorithm to solve the

% [Spring Design Problem as described by Cagnina et al.,

% Informatica, vol. 32, 319-326 (2008). ]


% Simple bounds/limits

disp('Solve the simple spring design problem ...');

Lb=[0.05 0.25 2.0];

Ub=[2.0 1.3 15.0];


% Initial random guess

u0=(Lb+Ub)/2;


[u,fval,NumEval]=ffa_mincon(@cost,@constraint,u0,Lb,Ub,para);


% Display results

bestsolution=u

bestojb=fval

total_number_of_function_evaluations=NumEval


%%% Put your own cost/objective function here --------%%%

%% Cost or Objective function

function z=cost(x)

z=(2+x(3))*x(1)^2*x(2);


% Constrained optimization using penalty methods

% by changing f to F=f+ \sum lam_j*g^2_j*H_j(g_j)

% where H(g)=0 if g<=0 (true), =1 if g is false


%%% Put your own constraints here --------------------%%%

function [g,geq]=constraint(x)

% All nonlinear inequality constraints should be here

% If no inequality constraint at all, simple use g=[];

g(1)=1-x(2)^3*x(3)/(71785*x(1)^4);

% There was a typo in Cagnina et al.'s paper,

% the factor should 71785 insteady of 7178 !    

tmpf=(4*x(2)^2-x(1)*x(2))/(12566*(x(2)*x(1)^3-x(1)^4));

g(2)=tmpf+1/(5108*x(1)^2)-1;

g(3)=1-140.45*x(1)/(x(2)^2*x(3));

g(4)=x(1)+x(2)-1.5;


% all nonlinear equality constraints should be here

% If no equality constraint at all, put geq=[] as follows

geq=[];


%%% End of the part to be modified -------------------%%%


%%% --------------------------------------------------%%%

%%% Do not modify the following codes unless you want %%%

%%% to improve its performance etc                    %%%

% -------------------------------------------------------

% ===Start of the Firefly Algorithm Implementation ======

% Inputs: fhandle => @cost (your own cost function,

%                   can be an external file  )

%     nonhandle => @constraint, all nonlinear constraints

%                   can be an external file or a function

%         Lb = lower bounds/limits

%         Ub = upper bounds/limits

%   para == optional (to control the Firefly algorithm)

% Outputs: nbest   = the best solution found so far

%          fbest   = the best objective value

%      NumEval = number of evaluations: n*MaxGeneration

% Optional:

% The alpha can be reduced (as to reduce the randomness)

% ---------------------------------------------------------


% Start FA

function [nbest,fbest,NumEval]...

          =ffa_mincon(fhandle,nonhandle,u0, Lb, Ub, para)

% Check input parameters (otherwise set as default values)

if nargin<6, para=[20 50 0.25 0.20 1]; end

if nargin<5, Ub=[]; end

if nargin<4, Lb=[]; end

if nargin<3,

disp('Usuage: FA_mincon(@cost, @constraint,u0,Lb,Ub,para)');

end


% n=number of fireflies

% MaxGeneration=number of pseudo time steps

% ------------------------------------------------

% alpha=0.25;      % Randomness 0--1 (highly random)

% betamn=0.20;     % minimum value of beta

% gamma=1;         % Absorption coefficient

% ------------------------------------------------

n=para(1);  MaxGeneration=para(2);

alpha=para(3); betamin=para(4); gamma=para(5);


% Total number of function evaluations

NumEval=n*MaxGeneration;


% Check if the upper bound & lower bound are the same size

if length(Lb) ~=length(Ub),

   disp('Simple bounds/limits are improper!');

   return

end


% Calcualte dimension

d=length(u0);


% Initial values of an array

zn=ones(n,1)*10^100;

% ------------------------------------------------

% generating the initial locations of n fireflies

[ns,Lightn]=init_ffa(n,d,Lb,Ub,u0);


% Iterations or pseudo time marching

for k=1:MaxGeneration,     %%%%% start iterations


% This line of reducing alpha is optional

alpha=alpha_new(alpha,MaxGeneration);


% Evaluate new solutions (for all n fireflies)

for i=1:n,

  zn(i)=Fun(fhandle,nonhandle,ns(i,:));

  Lightn(i)=zn(i);

end


% Ranking fireflies by their light intensity/objectives

[Lightn,Index]=sort(zn);

ns_tmp=ns;

for i=1:n,

ns(i,:)=ns_tmp(Index(i),:);

end


%% Find the current best

nso=ns; Lighto=Lightn;

nbest=ns(1,:); Lightbest=Lightn(1);


% For output only

fbest=Lightbest;


% Move all fireflies to the better locations

[ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,nbest,...

     Lightbest,alpha,betamin,gamma,Lb,Ub);


end   %%%%% end of iterations


% -------------------------------------------------------

% ----- All the subfunctions are listed here ------------

% The initial locations of n fireflies

function [ns,Lightn]=init_ffa(n,d,Lb,Ub,u0)

 % if there are bounds/limits,

if length(Lb)>0,

  for i=1:n,

  ns(i,:)=Lb+(Ub-Lb).*rand(1,d);

  end

else

  % generate solutions around the random guess

  for i=1:n,

  ns(i,:)=u0+randn(1,d);

  end

end


% initial value before function evaluations

Lightn=ones(n,1)*10^100;


% Move all fireflies toward brighter ones

function [ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,...

            nbest,Lightbest,alpha,betamin,gamma,Lb,Ub)

% Scaling of the system

scale=abs(Ub-Lb);


% Updating fireflies

for i=1:n,

% The attractiveness parameter beta=exp(-gamma*r)

  for j=1:n,

     r=sqrt(sum((ns(i,:)-ns(j,:)).^2));

     % Update moves

if Lightn(i)>Lighto(j), % Brighter and more attractive

  beta0=1; beta=(beta0-betamin)*exp(-gamma*r.^2)+betamin;

  tmpf=alpha.*(rand(1,d)-0.5).*scale;

  ns(i,:)=ns(i,:).*(1-beta)+nso(j,:).*beta+tmpf;

     end

  end % end for j


end % end for i


% Check if the updated solutions/locations are within limits

[ns]=findlimits(n,ns,Lb,Ub);


% This function is optional, as it is not in the original FA

% The idea to reduce randomness is to increase the convergence,

% however, if you reduce randomness too quickly, then premature

% convergence can occur. So use with care.

function alpha=alpha_new(alpha,NGen)

% alpha_n=alpha_0(1-delta)^NGen=0.005

% alpha_0=0.9

delta=1-(0.005/0.9)^(1/NGen);

alpha=(1-delta)*alpha;


% Make sure the fireflies are within the bounds/limits

function [ns]=findlimits(n,ns,Lb,Ub)

for i=1:n,

    % Apply the lower bound

 ns_tmp=ns(i,:);

 I=ns_tmp<Lb;

 ns_tmp(I)=Lb(I);


 % Apply the upper bounds

 J=ns_tmp>Ub;

 ns_tmp(J)=Ub(J);

 % Update this new move

 ns(i,:)=ns_tmp;

end


% -----------------------------------------

% d-dimensional objective function

function z=Fun(fhandle,nonhandle,u)

% Objective

z=fhandle(u);


% Apply nonlinear constraints by the penalty method

% Z=f+sum_k=1^N lam_k g_k^2 *H(g_k) where lam_k >> 1

z=z+getnonlinear(nonhandle,u);


function Z=getnonlinear(nonhandle,u)

Z=0;

% Penalty constant >> 1

lam=10^15; lameq=10^15;

% Get nonlinear constraints

[g,geq]=nonhandle(u);


% Apply inequality constraints as a penalty function

for k=1:length(g),

   Z=Z+ lam*g(k)^2*getH(g(k));

end

% Apply equality constraints (when geq=[], length->0)

for k=1:length(geq),

  Z=Z+lameq*geq(k)^2*geteqH(geq(k));

end


% Test if inequalities hold

% H(g) which is something like an index function

function H=getH(g)

if g<=0,

   H=0;

else

   H=1;

end


% Test if equalities hold

function H=geteqH(g)

if g==0,

   H=0;

else

   H=1;

end

%% ==== End of Firefly Algorithm implementation ======


⛄ 运行结果

⛄ 参考文献

[1]唐宏, 冯平, 陈镜伯,等. 萤火虫算法优化SVR参数在短期电力负荷预测中的应用[J]. 西华大学学报:自然科学版, 2017, 36(1):4.

❤️ 关注我领取海量matlab电子书和数学建模资料
❤️部分理论引用网络文献,若有侵权联系博主删除


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
12天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
6天前
|
存储 关系型数据库 分布式数据库
PolarDB的PolarStore存储引擎以其高效的索引结构、优化的数据压缩算法、出色的事务处理能力著称
PolarDB的PolarStore存储引擎以其高效的索引结构、优化的数据压缩算法、出色的事务处理能力著称。本文深入解析PolarStore的内部机制及优化策略,包括合理调整索引、优化数据分布、控制事务规模等,旨在最大化其性能优势,提升数据存储与访问效率。
18 5
|
16天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
19天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
21天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
21天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
21天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
21天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
40 3
|
21天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
28天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
36 3