二、烟花算法简介

1 烟花算法

烟花算法是由谭营教授等人于2010年提出的一种新型群体优化算法[6],该算法容易实现,鲁棒性较好,一经提出,就得到了广泛的研究和应用[7]。烟花算法由爆炸算子、变异算子、选择策略和映射规则四部分组成。

爆炸算子主要由爆炸强度决定。在实际烟花爆炸过程中,烟花每次爆炸都会产生许多火花,烟花算法中利用爆炸强度使不同适应度的烟花产生不同数目的火花,这样可以避免算法陷入局部最优,使算法尽可能探索搜寻整个可行解的空间。爆炸生成的烟花数目和爆炸半径计算方式分别如公式(4)和公式(5)所示:

【优化算法】烟花优化算法(FWA)【含Matlab源码 1079期】_spark

式中:Si为第i个烟花爆炸产生的火花数目;m和d为常数;f(xi)为个体适应度的值;Ymax和Ymin分别是当前群体适应度的最大值和最小值;ε为一个极小的数,防止公式无意义。

烟花在爆炸后,需要对爆炸火花进行位移操作和变异操作。本文采用随机位移的方法对火花进行维度的更新。变异操作是为了扩展寻优空间和增加种群的多样性,避免算法陷入局部最优,本文采用高斯变异生成变异火花,计算如公式(6)所示:

【优化算法】烟花优化算法(FWA)【含Matlab源码 1079期】_spark_02

其中,e服从均值为1、方差为1的高斯分布。

变异操作之后,火花多样性增加,由选择策略选择下一代烟花,本文采用标准烟花算法中的基于曼哈顿距离的选择策略,计算如公式(7)所示:

【优化算法】烟花优化算法(FWA)【含Matlab源码 1079期】_matlab_03

式中:d(xi,xj)为两个火花间的曼哈顿距离。

综上,烟花算法的主要流程如下:(1)初始化烟花位置和参数;(2)计算所有烟花的适应度和爆炸半径、火花数目,生成变异火花;(3)使用选择策略选择下一代烟花,循环执行(2),直到满足条件。

2 FWA算法框架

烟花算法的算法流程图如图1所示。

【优化算法】烟花优化算法(FWA)【含Matlab源码 1079期】_matlab_04

三、部分源代码

%烟花算法进行函数优化
%fitness适应度函数,N烟花数,D变量维数,M变异火花数,Er爆炸半径,En爆炸数目
%LB,UB分别为变量上下界,T为迭代次数,a,b为爆炸数目限制因子
clear;clc
N=100; % N烟花数
D=2; % D变量维数
M=5; % M变异火花数
En=6; % En爆炸数目
Er=5; % Er爆炸半径
a=0.3; % a,b为爆炸数目限制因子
b=0.6;
T=500; % T为迭代次数

%求最大值变量上下界
LB=[-5.12,-5.12];
UB=[5.12,5.12];

%随机在解空间初始化N个烟花位置
x = zeros(N,D);
for i=1:N
x(i,:)=LB+rand(1,D).*(UB-LB);
end
%循环迭代
E_Spark=zeros(T,D,N);
Fit = zeros(1,N);
F = zeros(1,T);
for t=1:T
%计算每个烟花适应度值
for i=1:N
Fit(i)=fitness(x(i,:));
end
[F(t),~]=min(Fit);
Fmin=min(Fit);
Fmax=max(Fit);
%计算每个烟花的爆炸半径E_R和爆炸数目E_N以及产生的爆炸火花
E_R = zeros(1,N);
E_N = zeros(1,N);
for i=1:N
E_R(i)=Er*((Fit(i)-Fmin+eps)/(sum(Fit)-N*Fmin+eps)); %爆炸半径
E_N(i)=En*((Fmax-Fit(i)+eps)/(N*Fmax-sum(Fit)+eps)); %爆炸数目
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

四、运行结果

【优化算法】烟花优化算法(FWA)【含Matlab源码 1079期】_三维数组_05

五、matlab版本及参考文献

1 matlab版本

2014a

2 参考文献

[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.

[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

[3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.

[4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.

[5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.