DA 蜻蜓优化算法

1、算法简介

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

先来了解了解蜻蜓吧(笑):

  • 自然界大约有3000种已知的蜻蜓品种
  • 蜻蜓是自然界的飞行专家,飞行速度可达35英里每小时
  • 蜻蜓以小昆虫为食,成年蜻蜓一天可以吃掉30至100只蚊子,妥妥的益虫

2、算法原理

蜻蜓算法是一种新型智能群优化算法,其原理是模拟大自然中蜻蜓寻找猎物的行为。

该算法源于自然中蜻蜓动态和静态的智能群行为,对蜻蜓的飞行线路躲避天敌寻找食物等生活习性进行数学建模。

  • 在动态群中,为获得更好的生存环境(migration),大量的蜻蜓集群朝着共同的方向进行远距离迁徙

  • 在静态群中,为寻找其他飞行猎物(fading),由小部分蜻蜓组成的各个小组,在较小的范围内来回飞行

蜻蜓飞行过程中的局部运动与飞行路径的临时突变是静态群的主要特征

在自然界中,蜻蜓的生活习性可以归纳为5类行为方式:分离、排队、结盟、寻找猎物躲避天敌

3、算法细节

公式序号对应原论文(这部分暂时看不明白也没事,后面会详细讲解)

3.1、分离

分离是每个蜻蜓个体与同类分开的行为。分离行为的数学表达式为:
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所处的位置。

3.2、成队

排队是指每个蜻蜓个体在飞行时与相邻个体之间的速度匹配。排队行为的数学表达式为:

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​ 为相邻个体的飞行速度。

3.3、结盟

结盟指蜻蜓与相邻同类之间彼此聚在一起的集群行为。结盟行为的数学表达式为:
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个蜻蜓个体结盟行为的位置向量。

3.4、寻找猎物

寻找猎物指个体为生存搜寻猎物的行为。寻找猎物行为的数学表达式为:
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+代表待捕食的猎物所处的位置。

3.5、躲避天敌

个体出于生存的本能,需时刻警惕天敌的行为。躲避天敌行为的数学表达式为:
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​∣β1​r1​∗δ​(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)将在寻优过程中自适应调整。

4、算法流程

4.1、原版论文

注:while循环下第一句objective values就是fitness values

读完论文算法的伪码描述,你或许有如下疑问:

  • step vectors 是指?
  • 如何更新 food source 和 enemy?
  • 如何更新 nerghbouring radius?

保留这些疑问,我们接着往下了解。

4.2、流程逐句拆解

本过程对应于附录代码

假设种群中有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  0Enemy_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);endif Fitness(1,i)>Enemy_fitness %寻找每次迭代的最大值if all(X(:,i)<ub') && all( X(:,i)>lb')Enemy_fitness=Fitness(1,i);Enemy_pos=X(:,i);endend
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 weightmy_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>1for k=1:neighbours_noS=S+(Neighbours_X(:,k)-X(:,i));endS=-S;elseS=zeros(dim,1);end
% Ai Alignment of the i-th individual
% Eq. (3.2)if neighbours_no>1A=(sum(Neighbours_DeltaX')')/neighbours_no;elseA=DeltaX(:,i);end
% Ci Cohesion of the i-th individual
% Eq. (3.3)if neighbours_no>1C_temp=(sum(Neighbours_X')')/neighbours_no;elseC_temp=X(:,i);endC=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);elseF=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);elseEnemy=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>1for j=1:dimDeltaX(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);endif DeltaX(j,i)<-Delta_max(j)DeltaX(j,i)=-Delta_max(j);endX(j,i)=X(j,i)+DeltaX(j,i);endelse% Eq. (3.8)%当没有任何个体与个体 i 相邻时X(:,i)=X(:,i)+Levy(dim)'.*X(:,i);DeltaX(:,i)=0;end
elsefor 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);endif 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;

5、参考文献

[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.

6、代码以及结果

完整代码下载地址

F6:

F20:

DA 蜻蜓优化算法 - 逐句拆解 - 含代码相关推荐

  1. 蜻蜓优化算法(Matlab完整代码实现)

    目录 1 蜻蜓算法概述 2 蜻蜓算法数学模型 2.1 分离 2.2 对齐 2.3 聚集 2.4 食物吸引 2.5 天敌驱散 2.6 程序中的表述 3 完整matlab代码实现  3.1 展现 3.2 ...

  2. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  3. Pytorch优化器全总结(四)常用优化器性能对比 含代码

    目录 写在前面 一.优化器介绍 1.SGD+Momentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二.优化器对 ...

  4. 【优化算法】蚁狮优化算法(ALO)【含Matlab源码 1307期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]蚁狮优化算法(ALO)[含Matlab源码 1307期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费专栏M ...

  5. 无人机航拍图像匹配——ORB算法实践(含代码)

    无人机航拍图像匹配--ORB算法实践(含代码) 一.摘要 二.ORB算法的原理 1. FAST角点检测 2.BRIEF描述子 描述子生成 3.方向计算(角点检测和描述子之间的步骤) 4.尺度金字塔 三 ...

  6. 【优化算法】基于matlab象鼻虫损害优化算法 (WDOA)【含Matlab源码 2228期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab象鼻虫损害优化算法 (WDOA)[含Matlab源码 2228期] 点击上面蓝色字体,直接付费下载,即可. 获 ...

  7. 果蝇(FOA)优化算法(附完整Matlab代码,可直接复制)

    果蝇优化算法的核心是利用果蝇搜索实物的机制来对问题进行寻优.果蝇根据气味来确定食物的位置,食物腐烂程度越高,气味越大,果蝇对其越敏感.果蝇的觅食行为如下图: Fig1. 果蝇觅食行为示意图 1.果蝇位 ...

  8. 无人机航拍图像匹配——SIFT算法实践(含代码)

    无人机航拍图像匹配--SIFT算法实践(含代码) 一.摘要 二.SIFT算法的原理 1.尺度空间极值检测 &关键点定位 尺度不变性&尺度空间 高斯金字塔 2.方向分配 3.特征描述 4 ...

  9. 蜻蜓优化算法Python代码(详细注释)

    1.代入例子,目标函数求最优解迭代过程: 蜻蜓算法流程: 蜻蜓算法(Dragonfly Algorithm)是一种基于种群的优化算法,灵感来自于蜻蜓的群集行为.该算法通过模拟蜻蜓之间的吸引力和斥力,以 ...

最新文章

  1. Android之ListActivity(一):布局与数据绑定
  2. 自定义异常类: 运行期间跟编译期间的区别
  3. 死磕Java并发:J.U.C之AQS同步状态的获取与释放
  4. mysql 修改root用户密码
  5. 比较简单的创造印象派画风的网站
  6. 3维线程格 gpu_论文导读 | GPU加速子图同构算法
  7. Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
  8. (pytorch-深度学习系列)pytorch中backwards()函数对梯度的操作
  9. Java基础知识之方法的通用格式、注意事项与带参数的方法
  10. 1071-数字的空洞
  11. 【TensorFlow-windows】(七) CNN之VGG-net的测试
  12. 【Sniffer和网络执法官软件助你维护网络(转网络安全)】
  13. 油猴【QQ空间自动点赞-模拟点击】
  14. java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda...
  15. JAVA计算机毕业设计原创网络文学管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  16. Redis锁解决超卖问题
  17. python 抓取猫眼电影评分
  18. xp计算机用户密码设置,WinXP怎样给电脑设密码?WinXP给电脑设密码的方法
  19. 小胖机器人宣传语_智能机器人推广宣传语
  20. ubuntu 装在ssd_如何在Ubuntu中调整SSD以提高性能

热门文章

  1. UML::UML核心元素
  2. JMM学习之Java实现原子性操作
  3. 迈创股份冲刺上交所:年营收11.2亿 小米与复星是股东
  4. 北京大学高性能计算平台未名教学一号使用入门(仅限北大在校学生使用)
  5. 青理工大work总结知识点 3
  6. Android 连连看设计 (1)
  7. 基于meteor开发的开源项目资源
  8. 商品管理系统商品分类树查询
  9. 图像中的脸部、四肢问题及其解决方法
  10. 【华为机试真题 Python】字符串简单数据解压缩