目录
0 引言
蜻蜓算法( Dragonfly algorithm,DA)是Seyedali Mirjalili等于2016年提出的一种新型智能优化算法。其主要灵感源于自然界中蜻蜓的静态和动态群集行为,静态群体中,蜻蜓组成小群在一个小区域内来回飞行,捕食其他飞行猎物,其中局部移动和飞行路径的突然变化是静态群体的主要特征。在动态群体中,大量的蜻蜓为了长距离迁徙而形成群体蜻蜓被视为小型捕食者,幼虫期的蜻蜓还会捕食其他海洋昆虫甚至小鱼。
1 数学模型
DA的数学模型是模拟蜻蜓的捕食和迁徙,前者称为静态(觅食)集群,后者称为动态(迁徙)集群,同时可将此归纳于蜻蜓的生活习性5类行为方式:分离、排队对齐、凝聚、寻找猎物和躲避天敌来构建模型,具体模型如下:
1)分离:分离是蜻蜓个体与同类分开的行为。其数学表达式为:
式中X是当前个体的位置,Xj表示第j个邻近个体的位置,N是邻近个体的数量;
2)排队对齐:排队对齐是指蜻蜓个体在飞行时与相邻个体之间的速度匹配对齐。其数学表达式为:
式中Vj表示第j个邻近个体的速度,N是邻近个体的数量;
3)凝聚:凝聚是指蜻蜓与相邻同类之间彼此聚在一起的集群行为。其的数学表达式为:
式中X是当前个体的位置,N是邻域的数量,Xj表示第j个邻域个体的位置。
4)寻找猎物:寻找猎物指蜻蜓为生存搜寻猎物,不断拉近与猎物的吸引距离,其数学表达式为:
式中X是当前个体的位置,X+表示食物来源的位置。
5)躲避天敌:个体出于生存的本能,需时刻警惕天敌,选择向外分散敌人,其表达式如下:
式中X是当前个体的位置,X-显示敌人的位置。
6)更新蜻蜓的位置:结合上述五种行为。更新人工蜻蜓在搜索空间中的位置并模拟其运动,同时考虑了两个向量:步长(DX)和位置(X)。并定义如下:
式中s表示分离权重,Si表示第i个个体的分离度,a是对齐权重,A是第i个个体的对齐情况,c表示凝聚权重,Ci是第i个个体的凝聚度,f是食物因子,Fi是第i个个体的食物来源,e是敌对因子,Ei是第i个个体的敌对位置,w是惯性权重,t是迭代计数器。
7)飞行策略:为了提高人工蜻蜓的随机性、随机行为和探索能力,当没有邻近解时,要求它们使用随机游走(Le‘vy飞行)在搜索空间中飞行,具体表达式如下:
其中t是当前迭代,d是位置向量的维度;r1、r2是[0,1]中的两个随机数,β是一个常数,为3/2;
2 优化方式
前篇对BP神经网络原理讲解(BP神经网络原理及Matlab代码复现-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述DA原理介绍,可以将BP神经网络权值和阈值作为蜻蜓和食物的个体位置,每一个种群位置对应BP神经网络的预测值,将这个预测值作为适应度模拟蜻蜓个体进行上述五种行为,更新蜻蜓个体,进行下一迭代蜻蜓。
3 MATLAB代码
3.1 伪代码
3.2 主函数代码
%%DA算法的主函数
% 适应度大小
cg_curve=zeros(1,Max_iteration);
if size(ub,2)==1
ub=ones(1,dim)*ub;
lb=ones(1,dim)*lb;
end
%蜻蜓邻域的初始半径
r=(ub-lb)/10;
Delta_max=(ub-lb)/10;
Food_fitness=inf;
Food_pos=zeros(dim,1);
Enemy_fitness=-inf;
Enemy_pos=zeros(dim,1);
X=initialization(SearchAgents_no,dim,ub,lb);
Fitness=zeros(1,SearchAgents_no);
DeltaX=initialization(SearchAgents_no,dim,ub,lb);
for iter=1:Max_iteration
r=(ub-lb)/4+((ub-lb)*(iter/Max_iteration)*2);
w=0.9-iter*((0.9-0.4)/Max_iteration);
my_c=0.1-iter*((0.1-0)/(Max_iteration/2));
if my_c<0
my_c=0;
end
s=2*rand*my_c; % 分离权重
a=2*rand*my_c; % 对齐权重
c=2*rand*my_c; % 凝聚力权重
f=2*rand; % 食物吸引力权重
e=my_c; % 分散敌人注意力权重
for i=1:SearchAgents_no %C先计算所有目标的适应度
Fitness(1,i)=SYD(X(:,i)',net);
net.trainParam.showWindow = 0;
if Fitness(1,i)<Food_fitness
Food_fitness=Fitness(1,i);
Food_pos=X(:,i);
end
if Fitness(1,i)>Enemy_fitness
if all(X(:,i)<ub') && all( X(:,i)>lb')
Enemy_fitness=Fitness(1,i);
Enemy_pos=X(:,i);
end
end
end
for i=1:SearchAgents_no
index=0;
neighbours_no=0;
clear Neighbours_DeltaX
clear Neighbours_X
%查找邻近的解决方案
for j=1:SearchAgents_no
Dist2Enemy=distance(X(:,i),X(:,j));
if (all(Dist2Enemy<=r) && all(Dist2Enemy~=0))
index=index+1;
neighbours_no=neighbours_no+1;
Neighbours_DeltaX(:,index)=DeltaX(:,j);
Neighbours_X(:,index)=X(:,j);
end
end
% 分离
% Eq. (3.1)
S=zeros(dim,1);
if neighbours_no>1
for k=1:neighbours_no
S=S+(Neighbours_X(:,k)-X(:,i));
end
S=-S;
else
S=zeros(dim,1);
end
% 对齐
% Eq. (3.2)
if neighbours_no>1
A=(sum(Neighbours_DeltaX')')/neighbours_no;
else
A=DeltaX(:,i);
end
% 凝聚力
% Eq. (3.3)
if neighbours_no>1
C_temp=(sum(Neighbours_X')')/neighbours_no;
else
C_temp=X(:,i);
end
C=C_temp-X(:,i);
% 对食物的吸引力
% Eq. (3.4)
Dist2Food=distance(X(:,i),Food_pos(:,1));
if all(Dist2Food<=r)
F=Food_pos-X(:,i);
else
F=0;
end
% 分散敌人的注意力
% Eq. (3.5)
Dist2Enemy=distance(X(:,i),Enemy_pos(:,1));
if all(Dist2Enemy<=r)
Enemy=Enemy_pos+X(:,i);
else
Enemy=zeros(dim,1);
end
for tt=1:dim
if X(tt,i)>ub(tt)
X(tt,i)=lb(tt);
DeltaX(tt,i)=rand;
end
if X(tt,i)<lb(tt)
X(tt,i)=ub(tt);
DeltaX(tt,i)=rand;
end
end
if any(Dist2Food>r)
if neighbours_no>1
for j=1:dim
DeltaX(j,i)=w*DeltaX(j,i)+rand*A(j,1)+rand*C(j,1)+rand*S(j,1);
if DeltaX(j,i)>Delta_max(j)
DeltaX(j,i)=Delta_max(j);
end
if DeltaX(j,i)<-Delta_max(j)
DeltaX(j,i)=-Delta_max(j);
end
X(j,i)=X(j,i)+DeltaX(j,i);
end
else
% Eq. (3.8)
X(:,i)=X(:,i)+Levy(dim)'.*X(:,i);
DeltaX(:,i)=0;
end
else
for j=1:dim
% Eq. (3.6)
DeltaX(j,i)=(a*A(j,1)+c*C(j,1)+s*S(j,1)+f*F(j,1)+e*Enemy(j,1)) + w*DeltaX(j,i);
if DeltaX(j,i)>Delta_max(j)
DeltaX(j,i)=Delta_max(j);
end
if DeltaX(j,i)<-Delta_max(j)
DeltaX(j,i)=-Delta_max(j);
end
X(j,i)=X(j,i)+DeltaX(j,i);
end
end
Flag4ub=X(:,i)>ub';
Flag4lb=X(:,i)<lb';
X(:,i)=(X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;
end
Best_score=Food_fitness;
Best_pos=Food_pos;
cg_curve(iter)=Best_score;
end
3.3 DA-SVM/SVR
蜻蜓算法优化支持向量机的回归预测和分类模型MATLAB代码如下: