1 简介
烟花算法是受实际生活中烟花爆炸产生火花的启发而提出的一种智能优化算法,在这里烟花被视为可行域内的一个解向量,烟花爆炸产生的火花即解在其领域内的搜索过程。烟花算法的寻优性能主要是由爆炸算子、变异算子和选择策略决定,烟花算法其程序框图如图 1 所示。
2 部分代码
%基本烟花算法进行函数优化
%fitness适应度函数,N烟花数,D变量维数,M变异火花数,Er爆炸半径,En爆炸数目
%LB,UB分别为变量上下界,T为迭代次数,a,b为爆炸数目限制因子,epsion为一很小的常数
function [xm fmin]=fundmental_FWA(fitness,N,D,M,Er,En,LB,UB,T,a,b,epsion)
%随机在解空间初始化N个烟花位置
for i=1:N
for j=1:D
x(i,j)=LB(j)+rand*(UB(j)-LB(j));
end
end
%循环迭代
% E_Spark=zeros(100,D,N);
for t=1:T
%计算每个烟花适应度值
for i=1:N
Fit(i)=fitness(x(i,:));
end
[F(t),Y]=min(Fit);
Fmin=min(Fit);
Fmax=max(Fit);
%计算每个烟花的爆炸半径E_R和爆炸数目E_N以及产生的爆炸火花
for i=1:N
E_R(i)=Er*((Fit(i)-Fmin+epsion)/(sum(Fit)-N*Fmin+epsion)); %爆炸半径
E_N(i)=En*((Fmax-Fit(i)+epsion)/(N*Fmax-sum(Fit)+epsion)); %爆炸数目
if E_N(i)<a*En %爆炸数目限制
E_N(i)=round(a*En);
elseif E_N(i)>b*En
E_N(i)=round(b*En);
else
E_N(i)=round(E_N(i));
end
%产生爆炸火花 E_Spark
for j=2:(E_N(i)+1) %第i个烟花共产生E_N(i)个火花
E_Spark(1,:,i)=x(i,:); %将第i个烟花保存为第i个火花序列中的第一个,爆炸产生的火花从序列中的第二个开始存储(即烟花为三维数组每一页的第一行)
h=E_R(i)*(-1+2*rand(1,D)); %位置偏移
E_Spark(j,:,i)=x(i,:)+h; %第i个烟花(三维数组的i页)产生的第j(三维数组的j行)个火花
for k=1:D %越界检测
if E_Spark(j,k,i)>UB(k)||E_Spark(j,k,i)<LB(k) %第i个烟花(三维数组的i页)产生的第j个火花(三维数组的j行)的第k个变量(三维数组的k列)
E_Spark(j,k,i)=LB(k)+rand*(UB(k)-LB(k)); %映射规则
end
end
end
end
%产生高斯变异火花Mut_Spark,随机选择M个烟花进行变异
Mut=randperm(N); %随机产生1-N内的N个数
for m1=1:M %M个变异烟花
m=Mut(m1); %随机选取烟花
for n=1:E_N(m)
e=1+sqrt(1)*randn(1,D); %高斯变异参数,方差为1,均值也为1的1*D随机矩阵
E_Spark(n,:,m)=E_Spark(n,:,m).*e;
for k=1:D %越界检测
if E_Spark(n,k,m)>UB(k)||E_Spark(n,k,m)<LB(k) %第i个烟花(三维数组的i页)产生的第j个火花(三维数组的j行)的第k个变量(三维数组的k列)
E_Spark(n,k,m)=LB(k)+rand*(UB(k)-LB(k)); %映射规则
end
end
end
end
%选择操作,从烟花、爆炸火花、变异火花里(都包含在三维数组中)选取N个优良个体作为下一代(先将最优个体留下,然后剩下的N-1个按轮盘赌原则选取)
n=sum(E_N)+N; %烟花、火花总个数
q=1;
for i=1:N %三维转二维
for j=1:(E_N(i)+1) %三维数组每一页的行数(即每个烟花及其产生的火花数之和)
E_Sum(q,:)=E_Spark(j,:,i); %烟花与火花总量
Fitness(q)=fitness(E_Sum(q,:)); %计算所有烟花、火花的适应度,用于选取最优个体
q=q+1;
end
end
[Fitness X]=sort(Fitness); %适应度升序排列
x(1,:)=E_Sum(X(1),:); %最优个体
dist=pdist(E_Sum); %求解各火花两两间的欧式距离
S=squareform(dist); %将距离向量重排成n*n数组,第i行之和即为第i个火花到其他火花的距离之和
for i=1:n %分别求各行之和
P(i)=sum(S(i,:));
end
[P Ix]=sort(P,'descend'); %将距离按降序排列,选取前N-1个,指的是如果个体密度较高,即该个体周围有很多其他候选者个体时,该个体被选择的概率会降低
for i=1:(N-1)
x(i+1,:)=E_Sum(Ix(i),:);
end
end
for i=1:N
Fit(i)=fitness(x(i,:));
end
%求最大值输出
[F(T),Y]=min(Fit);
fmin=min(F);
xm=x(Y,:);
fprintf('xm=%f %f\n',xm(1),xm(2));
fprintf('fmax=%f\n',-fmin);
figure(1);
t=1:T;
F=-F;
plot(t,F)
% %求最小值输出
% [F(T),Y]=min(Fit);
% fmin=min(F);
% xm=x(Y,:);
% fprintf('xm=%f %f\n',xm(1),xm(2));
% fprintf('fmin=%f\n',fmin);
% figure(1);
% t=1:T;
% plot(t,F)
end
3 仿真结果
4 参考文献
[1]李智梅. 烟花算法的改进及其在聚类的应用.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。