赞
踩
蜻蜓优化算法( Dragonfly algorithm,DA)是Seyedali Mirjalili等于2016年提出的一种新型启发式智能优化算法[1]。其主要灵感源于自然界中蜻蜓的静态和动态群集行为,具有寻优能力强等特点。
先来了解了解蜻蜓吧(笑):
蜻蜓算法是一种新型智能群优化算法,其原理是模拟大自然中蜻蜓寻找猎物的行为。
该算法源于自然中蜻蜓动态和静态的智能群行为,对蜻蜓的飞行线路、躲避天敌及寻找食物等生活习性进行数学建模。
在动态群中,为获得更好的生存环境(migration),大量的蜻蜓集群朝着共同的方向进行远距离迁徙;
在静态群中,为寻找其他飞行猎物(fading),由小部分蜻蜓组成的各个小组,在较小的范围内来回飞行。
蜻蜓飞行过程中的局部运动与飞行路径的临时突变是静态群的主要特征。
在自然界中,蜻蜓的生活习性可以归纳为5类行为方式:分离、排队、结盟、寻找猎物和躲避天敌。
公式序号对应原论文(这部分暂时看不明白也没事,后面会详细讲解)
分离是每个蜻蜓个体与同类分开的行为。分离行为的数学表达式为:
S
i
=
−
Σ
N
’
j
=
1
(
X
−
X
j
)
(3.1)
S_i=-\underset{j=1}{\overset{N’}{\varSigma}}\left( X-X_j \right) \tag{3.1}
Si=−j=1ΣN’(X−Xj)(3.1)
式中
N
′
N'
N′为邻近个体的个数;
S
i
S_i
Si为第
i
i
i个蜻蜓同类之间分离行为的位置向量;
X
X
X为个体所在位置;
X
j
X_j
Xj为相邻个体蜻蜓
j
j
j所处的位置。
排队是指每个蜻蜓个体在飞行时与相邻个体之间的速度匹配。排队行为的数学表达式为:
A
i
=
Σ
j
=
1
N
′
V
j
N
′
(3.2)
A_i=\frac{\varSigma _{j=1}^{N'}V_j}{N'}\tag{3.2}
Ai=N′Σj=1N′Vj(3.2)
式中
A
i
A_{i}
Ai 为第
i
i
i 个蜻蜓个体排队行为的位置向量;
V
j
V_j
Vj 为相邻个体的飞行速度。
结盟指蜻蜓与相邻同类之间彼此聚在一起的集群行为。结盟行为的数学表达式为:
C
i
=
Σ
j
=
1
N
′
X
j
N
′
−
X
(3.3)
C_i=\frac{\varSigma _{j=1}^{N'}X_j}{N'}-X\tag{3.3}
Ci=N′Σj=1N′Xj−X(3.3)
式中
C
i
C_i
Ci为第
i
i
i个蜻蜓个体结盟行为的位置向量。
寻找猎物指个体为生存搜寻猎物的行为。寻找猎物行为的数学表达式为:
F
i
=
X
+
−
X
(3.4)
F_i=X^+-X\tag{3.4}
Fi=X+−X(3.4)
式中
F
i
F_i
Fi 代表第
i
i
i个蜻蜓个体猎食行为的位置向量;
X + X^+ X+代表待捕食的猎物所处的位置。
个体出于生存的本能,需时刻警惕天敌的行为。躲避天敌行为的数学表达式为:
E
i
=
X
−
+
X
(3.5)
E_i=X^-+X\tag{3.5}
Ei=X−+X(3.5)
式中
E
i
E_i
Ei为第
i
i
i个蜻蜓个体逃避天敌行为的位置向量;
X
−
X^-
X− 为蜻蜓猎食所处的位置。步向量表示为蜻蜓的飞行方向以及步长,其数学式如下:
Δ
X
t
+
1
=
(
s
S
i
+
a
A
i
+
c
C
i
+
f
F
i
+
e
E
i
)
+
w
Δ
X
i
(3.6)
\varDelta X_{t+1}=\left( sS_i+aA_i+cC_i+fF_i+eE_i \right) +w\varDelta X_i\tag{3.6}
ΔXt+1=(sSi+aAi+cCi+fFi+eEi)+wΔXi(3.6)
式中:
a
a
a为对齐权重;
c
c
c为凝聚权重;
e
e
e为天敌权重因子;
f
f
f为猎物权重因子;
s
s
s为分离权重;
t
t
t为当前迭代次数;
w
w
w 为惯性权重。
在自然界中,出于生存需要,大部分时间蜻蜓都是运动的,因此所处位置也需实时更新。更新蜻蜓个体所处位置的向量,数学表达式如下:
X
t
+
1
=
X
t
+
Δ
X
t
+
1
(3.7)
X_{t+1}=X_t+\varDelta X_{t+1}\tag{3.7}
Xt+1=Xt+ΔXt+1(3.7)
要达到使算法性能进一步得到强化的目的,在同类个体附近无临近解时,通过使用Lévy飞行的方法绕搜索空间飞行,进行蜻蜓位置的更新:
X
t
+
1
=
X
i
+
L
e
v
y
(
d
)
Δ
X
i
(3.8)
X_{t+1}=X_i+Levy(d)\varDelta X_i\tag{3.8}
Xt+1=Xi+Levy(d)ΔXi(3.8)
其中
d
d
d代表维度,Lévy函数计算如下:
L
e
v
y
(
x
)
=
0.01
∗
r
1
∗
δ
∣
r
2
∣
1
β
(3.9)
Levy\left( x \right) =0.01*\frac{r_1*\delta}{|r_2|^{\frac{1}{\beta}}}\tag{3.9}
Levy(x)=0.01∗∣r2∣β1r1∗δ(3.9)
δ = ( Γ ( 1 + β ) ∗ sin ( π β 2 ) Γ ( 1 + β 2 ) ∗ β ∗ 2 ( β − 1 2 ) ) 1 β , Γ ( x ) = ( x − 1 ) ! (3.10) \delta =\left( \frac{\varGamma \left( 1+\beta \right) *\sin \left( \frac{\pi \beta}{2} \right)}{\varGamma \left( \frac{1+\beta}{2} \right) *\beta *2^{\left( \frac{\beta -1}{2} \right)}} \right) ^{\frac{1}{\beta}},\varGamma \left( x \right) =\left( x-1 \right) !\tag{3.10} δ=⎝ ⎛Γ(21+β)∗β∗2(2β−1)Γ(1+β)∗sin(2πβ)⎠ ⎞β1,Γ(x)=(x−1)!(3.10)
式子中: r 1 , r 2 r_1,r_2 r1,r2为 [ 0 , 1 ] [0,1] [0,1] 范围内的随机数; β \beta β为常数。
为调节DA算法的搜索性能,参数值(分离权重 s s s、对齐权重 a a a、凝聚权重 c c c、猎物权重因子 f f f、天敌权重因子 e e e)将在寻优过程中自适应调整。
注:while循环下第一句objective values就是fitness values
读完论文算法的伪码描述,你或许有如下疑问:
保留这些疑问,我们接着往下了解。
本过程对应于附录代码
假设种群中有25只蜻蜓,即 TotalPopulation = 25;UpperBound、LowerBound、dim、fobj由具体问题给出;设定Max_iteration=500;
(1) 随机初始化蜻蜓种群 Initialize the dragonflies population X i ( i = 1 , 2 , 3... , n ) X_i(i = 1,2,3...,n) Xi(i=1,2,3...,n)代码如下:
Positions(:,i)=rand(TotalPopulation, 1).*(UpperBound - LowerBound) + LowerBound;
(2) 初始化ΔX和(1)一样 Initialize step vectors Δ X i ( i = 1 , 2 , 3... , n ) \varDelta X_i(i = 1,2,3...,n) ΔXi(i=1,2,3...,n)
DeltaX(:,i)=rand(TotalPopulation, 1).*(UpperBound - LowerBound) + LowerBound;
(3) While the condition is not satisfied
for iter=1:Max_iteration
(4) 计算每只蜻蜓的适应度 Calculate the objetive values of all dragonflies
Fitness(1,i)=fobj(X(:,i)');
(5) 更新猎物 (F) 和天敌 (E) Update the food source and enemy
F
o
o
d
i
=
F
o
o
d
S
o
u
r
c
e
P
o
s
i
t
i
o
n
−
I
n
d
i
v
i
d
u
a
l
C
u
r
r
e
n
t
P
o
s
i
t
i
o
n
Food_i = FoodSourcePosition - IndividualCurrentPosition
Foodi=FoodSourcePosition−IndividualCurrentPosition
F i = X + − X (3.4) F_i=X^+-X\tag{3.4} Fi=X+−X(3.4)
E n e m y i = E n e m y P o s i t i o n − I n d i v i d u a l C u r r e n t P o s i t i o n Enemy_i = EnemyPosition - IndividualCurrentPosition Enemyi=EnemyPosition−IndividualCurrentPosition
E i = X − + X (3.5) E_i=X^-+X\tag{3.5} Ei=X−+X(3.5)
% 蜻蜓的策略应该是 远离天敌,趋向猎物 % Enemy Position就是迭代中适应度最大值坐标 % Food Source Position就是迭代中适应度最小值坐标 % 初始化 Food_fitness=inf;%正无穷 Food_pos=zeros(dim,1);%10*1 0 Enemy_fitness=-inf;%负无穷 Enemy_pos=zeros(dim,1);%10*1 0 % 在迭代中更新猎物和天敌坐标 for i=1:SearchAgents_no %首先计算所有目标值 Fitness(1,i)=fobj(X(:,i)'); 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
(6) 更新参数 Update w, s, a, c, f and e
% w 惯性权重 Inertia weight w=0.9-iter*((0.9-0.4)/Max_iteration); %不断减小 % s 分离权重 Separation weight % a 对齐权重 Alignment weight % c 内聚权重 Cohesion weight % f 猎物吸引权重 Food attraction weight % e 天敌规避权重 Enemy distraction weight my_c=0.1-iter*((0.1-0)/(Max_iteration/2));% 不断减小 初始 0.0996 s=2*rand*my_c; % 分离权重 0.0013 a=2*rand*my_c; % 对齐权重 0.1884 c=2*rand*my_c; % 内聚权重 0.1791 f=2*rand; % 猎物吸引权重 0.8826 e=my_c; % 天敌规避权重 0.0996 % Swarm Behavior follows three Important Principles: % 1. Separation : Individual avoid static collision with neighbor. % 2. Alignment : Individuals velocity matched with neighbor individuals. % 3. Cohesion : Individual tendency toward center of the herd. % 群体行为遵循三个重要原则: % 1. 分离:个体避免与邻居发生静态碰撞。 % 2. 结盟:个体速度与邻近个体相匹配。 % 3. 成队:个体趋向于群体中心。
(7) 计算参数 Calculate S, C, A, F (3.1)~(3.5)
% Si Separation of the i-th individual % 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 % Ai Alignment of the i-th individual % Eq. (3.2) if neighbours_no>1 A=(sum(Neighbours_DeltaX')')/neighbours_no; else A=DeltaX(:,i); end % Ci Cohesion of the i-th individual % 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); % Fi Food source of the i-th individual % Eq. (3.4) Dist2Food=distance(X(:,i),Food_pos(:,1)); if all(Dist2Food<=r) F=Food_pos-X(:,i); else F=0; end % Ei Enemy position of the i-th individual % 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
(8) 更新邻居半径 Update neighboring radius
% 迭代次数越大,半径越大,这里代表欧氏距离
r=(ub-lb)/4+((ub-lb)*(iter/Max_iteration)*2);
(9) if 结构 如果蜻蜓有同伴 if a dragonfly has at least one neighbouring dragonfly
使用如下两个方程更新 t+1 时刻蜻蜓的 速度(velocity) 和 位置(position):
Δ
X
t
+
1
=
(
s
S
i
+
a
A
i
+
c
C
i
+
f
F
i
+
e
E
i
)
+
w
Δ
X
i
(3.6)
\varDelta X_{t+1}=\left( sS_i+aA_i+cC_i+fF_i+eE_i \right) +w\varDelta X_i\tag{3.6}
ΔXt+1=(sSi+aAi+cCi+fFi+eEi)+wΔXi(3.6)
X t + 1 = X t + Δ X t + 1 (3.7) X_{t+1}=X_t+\varDelta X_{t+1}\tag{3.7} Xt+1=Xt+ΔXt+1(3.7)
if any(Dist2Food>r) %如果食物位置不是相邻蜻蜓位置 %当有个体与个体 i 相邻时 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) %当没有任何个体与个体 i 相邻时 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 % Eq. (3.7) X(j,i)=X(j,i)+DeltaX(j,i); end end
(9) else 结构 如果蜻蜓没有同伴
只需要更新t+1时刻的蜻蜓的位置(position):
X
t
+
1
=
X
i
+
L
e
v
y
(
d
)
Δ
X
i
(3.8)
X_{t+1}=X_i+Levy(d)\varDelta X_i\tag{3.8}
Xt+1=Xi+Levy(d)ΔXi(3.8)
function o=Levy(d)
beta=3/2;
%Eq. (3.10)
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(1,d)*sigma;
v=randn(1,d);
step=u./abs(v).^(1/beta);
% Eq. (3.9)
o=0.01*step;
end
(10) 进行边界检查
Flag4ub=X(:,i)>ub';
Flag4lb=X(:,i)<lb';
%范围大于上限则取上限
%范围小于下限则取下限,
%否则不变
X(:,i)=(X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;
[1]Mirjalili S. Dragonfly algorithm: a new meta-heuristic optimization technique for solving single-objective, discrete, and multi-objective problems[J]. Neural Computing and Applications, 2016, 27(4): 1053-1073.
F6:
F20:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。