前言
蜻蜓优化算法( Dragonfly algorithm,DA) 是 Seyedali Mirjalili 等于 2016 年提出的一种新型智能优化算法[1]。其主要灵感源于自然界中蜻蜓的静态和动态群集行为,具有寻优能力强等特点。

截止到 2023 年,算法引用趋势

1. 蜻蜓的生物行为
- 蜻蜓是节肢动物门,昆虫纲,蜻蜓目的统称
- 该算法源于自然中蜻蜓动态和静态的智能群行为,对蜻蜓的飞行线路、躲避天敌及寻找食物等生活习性进行数学建模。
- 在动态群中,为获得更好的生存环境,大量的蜻蜓集群朝着共同的方向进行远距离迁徙
- 在静态群中,为寻找其他飞行猎物,由小部分蜻蜓组成的各个小组,在较小的范围内来回飞行
- 在自然界中,蜻蜓的生活习性可以归纳为5类行为方式:分离、结队、结盟、寻找猎物和躲避天敌。
2. 算法优化原理
2.1 分离
分离是每个蜻蜓个体与同类分开的行为。分离行为的数学表达式为:
s
i
=
−
∑
j
=
1
N
′
(
X
j
−
X
)
(2-1)
s_i = -\sum_{j=1}^{N{'}} (X_j - X)\tag{2-1}
si=−j=1∑N′(Xj−X)(2-1)
式中 N ′ N{'} N′ 为邻近个体的个数; S i S_i Si 为第 i i i 个蜻蜓同类之间分离行为的位置向量; X X X 为当前个体所在位置; X j X_j Xj 相邻个体蜻蜓 j j j 所处的位置

2.2 结队
结队是指每个蜻蜓个体在飞行时与相邻个体之间的速度匹配。结队行为的数学表达式为:
A
i
=
∑
j
=
1
N
′
V
j
N
′
(2-2)
A_i = \frac{\sum_{j=1}^{N{'}}V_j}{N{'}}\tag{2-2}
Ai=N′∑j=1N′Vj(2-2)
式中 A i A_i Ai 为第 i i i 个蜻蜓个体结队行为的位置向量; V j V_j Vj 为第 j j j 个相邻个体的飞行速度

2.3 结盟
结盟指蜻蜓与相邻同类之间彼此聚在一起的集群行为。结盟行为的数学表达式为:
C
i
=
∑
j
=
1
N
′
X
j
N
′
−
X
(2-3)
C_i = \frac{\sum^{N{'}}_{j=1}X_j}{N{'}} - X \tag{2-3}
Ci=N′∑j=1N′Xj−X(2-3)
式中 C i C_i Ci 为第 i i i 个蜻蜓个体结盟行为的位置向量, X X X 为当前个体的位置信息, X j X_j Xj 为第 j j j 个相邻个体的位置

2.4 寻找猎物
寻找猎物指个体为生存搜寻猎物的行为。寻找猎物行为的数学表达式为:
F
i
=
X
+
−
X
(2-4)
F_i = X^+ - X\tag{2-4}
Fi=X+−X(2-4)
式中
F
i
F_i
Fi 为第
i
i
i 个蜻蜓个体猎食行为的位置向量;
X
+
X^+
X+ 待捕食的猎物所处的位置,即已记录的目标最优解

2.5 躲避天敌
个体出于生存的本能,需时刻警惕天敌的行为。躲避天敌行为的数学表达式为:
E
i
=
X
−
+
X
(2-5)
E_i = X^{-} +X \tag{2-5}
Ei=X−+X(2-5)
式中
E
i
E_i
Ei 为第
i
i
i 个蜻蜓个体逃避天敌行为的位置向量;
X
−
X^-
X− 为天敌所处的位置。

2.6 位置更新
步向量表示为蜻蜓的飞行方向以及步长,其数学式为:
Δ X t + 1 = ( s S i + a A i + c C i + f F i + e E i ) + ω Δ X t (2-6) \Delta X_{t+1} = (sS_i + aA_i + cC_i + fF_i + eE_i) + \omega\Delta X_t \tag{2-6} ΔXt+1=(sSi+aAi+cCi+fFi+eEi)+ωΔXt(2-6)
式中: a a a 为结队对齐权重; c c c 为结盟凝聚权重; e e e 为天敌权重因子; f f f 为猎物权重因子; s s s 为分离权重; t t t 为当前迭代次数; ω \omega ω 为惯性权重
在自然界中,出于生存需要,大部分时间蜻蜓都是运动的,因此所处位置也需实时更新。 更新蜻蜓个体所处位置的向量,数学表达式如下:
X
t
+
1
=
X
t
+
Δ
X
t
+
1
(2-7)
X_{t+1} = X_t + \Delta X_{t+1} \tag{2-7}
Xt+1=Xt+ΔXt+1(2-7)
要达到使算法性能进一步得到强化的目的,在同类个体附近无临近解时,通过使用 Lévy 飞行的方法绕搜索空间飞行,进行蜻蜓位置的更新:
X
t
+
1
=
X
t
+
L
e
ˊ
vy
(
d
)
X
t
(2-8)
X_{t+1} = X_t + \text{Lévy}{(d)}X_t\tag{2-8}
Xt+1=Xt+Leˊvy(d)Xt(2-8)
其中
d
d
d 表示维度。Lévy 函数计算如下:
L
e
ˊ
vy
(
x
)
=
0.01
∗
r
1
∗
δ
∣
r
2
∣
1
β
\text{Lévy}(x) = 0.01 * \frac{r_1 * \delta}{|r_2|^{\frac{1}{\beta}}}
Leˊvy(x)=0.01∗∣r2∣β1r1∗δ
δ
=
(
Γ
(
1
+
β
)
∗
s
i
n
(
π
β
2
)
Γ
(
1
+
β
2
)
∗
β
∗
2
β
−
1
2
)
1
β
,
Γ
(
x
)
=
(
x
−
1
)
!
\delta = \left(\frac{\Gamma(1 + \beta) * sin(\frac{\pi \beta}{2})}{\Gamma(\frac{1 + \beta}{2})*\beta * 2^{\frac{\beta - 1}{2}}} \right)^{\frac{1}{\beta}}, \Gamma(x) = (x - 1)!
δ=(Γ(21+β)∗β∗22β−1Γ(1+β)∗sin(2πβ))β1,Γ(x)=(x−1)!
式子中: r 1 r_1 r1, r 2 r_2 r2 为 [0, 1] 范围内的随机数; β \beta β 为常数
为调节 DA 算法的搜索性能,参数值 ( a a a 结队对齐权重; c c c 结盟凝聚权重; e e e 天敌权重因子; f f f 猎物权重因子; s s s 分离权重) 将在寻优过程中自适应调整。
3. 算法流程

注: while 循环下第一句 objective values 就是 fitness values
- a.初始化蜻蜓算法参数,包括最大迭代次数、种群数量。
- b.初始化蜻蜓在搜索空间中的位置向量 X X X 和在搜索空间中的方向向量 Δ X ΔX ΔX。各只蜻蜓优化参数的组合设为 (C,g) \text{(C,g)} (C,g),其中 X X X 矩阵的第 1、2 行分别存放 C、g \text{C、g} C、g 的值。
- c.更新各权重值。根据上述步骤的数据,对相关权重值进行初始化。变量包括邻域半径 r r r、惯性权重 ω ω ω、猎物权重因子 f f f、对齐权重 a a a、凝聚权重 c c c、分离权重 s s s、天敌权重因子 e e e。
- d.适应度值的计算,蜻蜓的最大适应度值随着蜻蜓不断地进行操作而实时更新,如果蜻蜓当前的适应度值大于已保存的适应度值,则更新原适应度值,否则原适应度值不变。因此保存的适应度值为最优值,并且保存当前最优值对应的参数组合 (C,g) \text{(C,g)} (C,g)。
- e.搜寻邻域中有无蜻蜓个体存在,以欧氏距离作为邻域中有无蜻蜓存在的根据。若存在,用式 (2-6)、(2-7) 更新位置与步长;若不存在,用式 (2-8) 更新位置。
- f.用式(2-1)~(2-5)计算蜻蜓的行为度,包括 f , a , c , s , e f , a , c , s , e f,a,c,s,e
- g.更新 X X X 与 Δ X ΔX ΔX
- h.终止条件的判断。如果满足终止条件,则直接跳出,同时输出最优参数组合 (C,g) \text{(C,g)} (C,g);如果不满足则迭代次数加1,跳转执行步骤 c。
4. 代码讲解
假设种群中有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) 代码如下:
initialization.m
Positions(:,i)=rand(TotalPopulation, 1).*(UpperBound - LowerBound) + LowerBound;
(2) 初始化 Δ X ΔX ΔX 和 (1) 一样 Initialize step vectors Δ X i ( i = 1 , 2 , 3... , n ) Δ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
DA.m
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
(2-4)
F_i = X^+ - X\tag{2-4}
Fi=X+−X(2-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
(2-5)
E_i = X^{-} +X \tag{2-5}
Ei=X−+X(2-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
)
+
ω
Δ
X
t
(2-6)
\Delta X_{t+1} = (sS_i + aA_i + cC_i + fF_i + eE_i) + \omega\Delta X_t \tag{2-6}
ΔXt+1=(sSi+aAi+cCi+fFi+eEi)+ωΔXt(2-6)
X
t
+
1
=
X
t
+
Δ
X
t
+
1
(2-7)
X_{t+1} = X_t + \Delta X_{t+1} \tag{2-7}
Xt+1=Xt+ΔXt+1(2-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
t
+
L
e
ˊ
vy
(
d
)
X
t
(2-8)
X_{t+1} = X_t + \text{Lévy}{(d)}X_t\tag{2-8}
Xt+1=Xt+Leˊvy(d)Xt(2-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;
5. 代码以及结果
Github 地址: https://github.com/99Young99/Intelligent-optimization-algorithm
Gitee 地址: https://gitee.com/futurelqh/Intelligent-optimization-algorithm
F6:

F20:

Reference
[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.
[2] https://blog.csdn.net/qq_45555061/article/details/125942253