【智能算法】蜻蜓算法(DA)原理及实现

在这里插入图片描述

目录

    • 1.背景
    • 2.算法原理
      • 2.1算法思想
      • 2.2算法过程
    • 3.代码实现
    • 4.参考文献


1.背景

2016年,Mirjalili受到蜻蜓静态和动态集群行为启发,提出了蜻蜓算法(Dragonfly algorithm, DA)。

2.算法原理

2.1算法思想

蜻蜓集群有两种行为目的:狩猎(静态集群)和迁徙(动态集群)。静态集群中,蜻蜓分成小群捕猎,局部移动和突然飞行路径变化是其特征。动态集群则是大量蜻蜓在单一方向上长距离迁徙。这两种行为类似于元启发式优化中的探索和开发利用阶段,静态集群探索不同区域,而动态集群利用大群体沿着一个方向飞行。

2.2算法过程

在这里插入图片描述

群体的行为遵循三个基本原则:

  • 分离(Separation):指个体在邻域内静态地避免与其他个体碰撞
  • 对齐(Alignment):表示个体的速度与邻域内其他个体的速度匹配
  • 凝聚(Cohesion):指个体朝向邻域质心的趋势
    分离
    S i = − ∑ j = 1 N X i − X j S_i=-\sum_{j=1}^NX_i-X_j Si=j=1NXiXj
    其中, X j X_j Xj表示第 i i i只蜻蜓领域内其他蜻蜓, S i S_i Si表示第 i i i只蜻蜓分离位置向量。
    对齐
    A i = ∑ j = 1 N V j N A_{i}=\frac{\sum_{j=1}^{N}V_{j}}{N} Ai=Nj=1NVj
    其中, A i A_i Ai表示第 i i i只蜻蜓与领域内其他蜻蜓对齐的位置向量。
    凝聚
    C i = ∑ j = 1 N X j N − X i C_i=\frac{\sum_{j=1}^NX_j}N-X_i Ci=Nj=1NXjXi
    其中, C i C_i Ci示第 i i i只蜻蜓凝聚时的位置向量。
    寻找食物
    F i = X + − X i F_i=X^+-X_i Fi=X+Xi
    其中, X + X^+ X+表示猎物位置。
    躲避天敌
    E i = X − + X i E_i=X^-+X_i Ei=X+Xi
    其中, X − X^- X表示天敌位置。
    位置更新
    Δ X t + 1 = ( s S i + a A i + c C i + f F i + e E i ) + w Δ X t X t + 1 = X t + Δ X t + 1 \Delta X_{t+1}=(sS_i+aA_i+cC_i+fF_i+eE_i)+w\Delta X_t \\ X_{t+1}=X_t+\Delta X_{t+1} ΔXt+1=(sSi+aAi+cCi+fFi+eEi)+wΔXtXt+1=Xt+ΔXt+1
    式中参数均为权重因子。
    为了提高DA随机性和探索能力,当没有邻近解时,它们需要在搜索空间中进行Lévy飞行:
    X t + 1 = X t + L e ˊ vy ( d ) × X t X_{t+1}=X_t+\text{Lévy}(d)\times X_t Xt+1=Xt+Leˊvy(d)×Xt
    Lévy函数表述如下(Mantegna算法):
    L e ˊ vy ( x ) = 0.01 × r 1 × σ ∣ r 2 ∣ 1 β σ = ( Γ ( 1 + β ) × sin ⁡ ( π β 2 ) Γ ( 1 + β 2 ) × β × 2 ( β − 1 2 ) ) 1 / β \text{Lévy}(x)=0.01\times\frac{r_1\times\sigma}{|r_2|^{\frac1\beta}} \\ \sigma=\left(\frac{\Gamma(1+\beta)\times\sin\left(\frac{\pi\beta}{2}\right)}{\Gamma\left(\frac{1+\beta}{2}\right)\times\beta\times2^{\left(\frac{\beta-1}{2}\right)}}\right)^{1/\beta} Leˊvy(x)=0.01×r2β1r1×σσ= Γ(21+β)×β×2(2β1)Γ(1+β)×sin(2πβ) 1/β
    伪代码
    在这里插入图片描述

3.代码实现

% 蜻蜓优化算法
function [Best_pos,Best_fitness,Iter_curve,History_pos, History_best]=DA(pop, dim, ub,lb, fobj, maxIter)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优个体位置
%% 记录
Iter_curve=zeros(1,maxIter);
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(pop,dim,ub,lb);
Fitness=zeros(1,pop);
DeltaX=initialization(pop,dim,ub,lb);
%% 迭代
for iter=1:maxIterr=(ub-lb)/4+((ub-lb)*(iter/maxIter)*2);w=0.9-iter*((0.9-0.4)/maxIter);my_c=0.1-iter*((0.1-0)/(maxIter/2));if my_c<0my_c=0;ends=2*rand*my_c; % Seperation weighta=2*rand*my_c; % Alignment weightc=2*rand*my_c; % Cohesion weightf=2*rand;      % Food attraction weighte=my_c;        % Enemy distraction weightfor i=1:pop %Calculate all the objective values firstFitness(1,i)=fobj(X(:,i)');if Fitness(1,i)<Food_fitnessFood_fitness=Fitness(1,i);Food_pos=X(:,i);endif Fitness(1,i)>Enemy_fitnessif all(X(:,i)<ub') && all( X(:,i)>lb')Enemy_fitness=Fitness(1,i);Enemy_pos=X(:,i);endendendfor i=1:popindex=0;neighbours_no=0;clear Neighbours_DeltaXclear Neighbours_Xfor j=1:popDist2Enemy=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);endend% 分离% 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% 对齐% Eq. (3.2)if neighbours_no>1A=(sum(Neighbours_DeltaX')')/neighbours_no;elseA=DeltaX(:,i);end% 凝聚% Eq. (3.3)if neighbours_no>1C_temp=(sum(Neighbours_X')')/neighbours_no;elseC_temp=X(:,i);endC=C_temp-X(:,i);% 寻找食物% Eq. (3.4)Dist2Food=distance(X(:,i),Food_pos(:,1));if all(Dist2Food<=r)F=Food_pos-X(:,i);elseF=0;end% 躲避天敌% Eq. (3.5)Dist2Enemy=distance(X(:,i),Enemy_pos(:,1));if all(Dist2Enemy<=r)Enemy=Enemy_pos+X(:,i);elseEnemy=zeros(dim,1);endfor tt=1:dimif X(tt,i)>ub(tt)X(tt,i)=lb(tt);DeltaX(tt,i)=rand;endif X(tt,i)<lb(tt)X(tt,i)=ub(tt);DeltaX(tt,i)=rand;endendif any(Dist2Food>r)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)X(:,i)=X(:,i)+Levy(dim)'.*X(:,i);DeltaX(:,i)=0;endelsefor 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);endX(j,i)=X(j,i)+DeltaX(j,i);end endFlag4ub=X(:,i)>ub';Flag4lb=X(:,i)<lb';X(:,i)=(X(:,i).*(~(Flag4ub+Flag4lb)))+ub'.*Flag4ub+lb'.*Flag4lb;endBest_fitness=Food_fitness;Best_pos=Food_pos;Iter_curve(iter)=Best_fitness;History_pos{iter} = X;History_best{iter} = Best_pos;
end
end
%% 欧式距离
function o = distance(a,b)for i=1:size(a,1)o(1,i)=sqrt((a(i)-b(i))^2);
end
end
%% 位置初始化
function Positions=initialization(SearchAgents_no,dim,ub,lb)Boundary_no= size(ub,2); if Boundary_no==1ub_new=ones(1,dim)*ub;lb_new=ones(1,dim)*lb;
elseub_new=ub;lb_new=lb;   
end
for i=1:dimub_i=ub_new(i);lb_i=lb_new(i);Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
endPositions=Positions';
end
%% Levy飞行
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

在这里插入图片描述

4.参考文献

[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: 1053-1073.
[2] Mantegna RN. Fast, accurate algorithm for numerical simulation of Lévy stable stochastic process. Phys Rev E 1994;49(5):4677–83.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高端新颖知识竞赛活动方案

设计一场高端新颖知识竞赛活动&#xff0c;需要组织者用心策划&#xff0c;精心准备。下面这场竞赛设计新颖&#xff0c;可供大家组织竞赛活动时参考 。本竞赛分为“万箭齐发”、“城旗易主”、“群雄逐鹿”、“追风逐电”&#xff0c;四个环节&#xff0c;所有环节必须在主持人…

【CesiumJS-5】绘制动态路线实现飞行航线、汽车轨迹、路径漫游等

实现效果 前言 Cesium中&#xff0c;动态路线绘制的核心是借助CZML格式&#xff0c;CZML是一种用来描述动态场景的JSON数组,可以用来描述点、线、多边形、体、模型及其他图元,同时定义它们是怎样随时间变化的&#xff1b; CZML主要做三件事&#xff1a; 1.添加模型信息 2.添加…

如何在Linux系统部署APITable容器并实现无公网IP远程管理本地数据

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

C#,蛇梯问题(Snake and Ladder Problem)的算法与源代码

1 蛇梯问题 Snake and Ladder Problem 给定一个蛇梯板,找出从源单元格或第一个单元格到达目标单元格或最后一个单元格所需的最小掷骰次数。基本上,玩家可以完全控制掷骰子的结果,并希望找出到达最后一个单元格所需的最小掷骰次数。 如果玩家到达的牢房是梯子的底部,玩家…

(PTA乙级)1045 快速排序 (单调栈思想)

著名的快速排序算法里有一个经典的划分过程&#xff1a;我们通常采用某种方法取一个元素作为主元&#xff0c;通过交换&#xff0c;把比主元小的元素放到它的左边&#xff0c;比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列&#xff0c;请问有多少个元…

Java 调用 Groovy 脚本的简单案例

Java 调用 Groovy 脚本的简单案例 前言 Groovy 和 Java 都是使用 JVM 虚拟机进行解释执行的。工作中会遇到一些场景&#xff0c;需要对特殊的业务进行解耦。那段业务可能会经常变动&#xff0c;如果直接在Java代码里写业务的话就会涉及频繁的发包服务重启这类情况&#xff0c;…

金融防线升级:构筑数据安全的不可逾越之墙

近日&#xff0c;中国人民银行专栏《金融科技支持高质量发展》指出&#xff0c;应不断增强金融行业的网络安全和数据安全保障能力&#xff0c;坚持总体国家安全观&#xff0c;持续完善金融网络安全、数据安全制度体系&#xff0c;依法开展金融业关键信息基础设施安全保护工作&a…

mac删除带锁标识的app

一 、我们这里要删除FortiClient.app 带锁 常规方式删除不掉带锁的 app【如下图】 二、删除命令&#xff0c;依次执行即可。 /bin/ls -dleO /Applications/FortiClient.app sudo /usr/bin/chflags -R noschg /Applications/FortiClient.app /bin/ls -dleO /Applications/Forti…

Wireshark4.2.3 x64 Setup20240313

参考&#xff1a;【抓包工具】win 10 / win 11&#xff1a;WireShark 下载、安装、使用&#xff08;https://blog.csdn.net/qq_39720249/article/details/128157223&#xff09; 文章目录 下载安装12 license 许可证3 donations&#xff1a;捐款4 Choose Components&#xff1…

算法-图的存储,图的转置,拓扑排序

1.图的存储 图用来对关系建模&#xff0e;图是节点和边构成的集合&#xff0e;节点反映图的元素集合&#xff0c;边反映图的元素集合中元素间的关系&#xff0e; 上述是由五个节点&#xff0c;三条边构成的结构&#xff0e;我们可以用图对其建模&#xff0e; 对由节点&#x…

大数据开发(Kafka面试真题-卷三)

大数据开发&#xff08;Kafka面试真题&#xff09; 1、Kafka是如何进行数据备份的&#xff1f;2、Kafka里面存的数据格式是什么样的&#xff1f;3、Kafka是如何清理过期文件的&#xff1f;4、Kafka的一条message中包含了哪些信息&#xff1f;5、Kafka中的数据能彻底删除吗&…

【Python】Leetcode 240. 搜索二维矩阵 II - 削减矩阵+递归,击败88%

描述 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。 该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路 确定左右及上下限&#xff0c;削减矩阵&#xff0c;递归。 注意判断四个端…

Python 面向对象

在 Python 中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种程序设计范例&#xff0c;它以对象为基础&#xff0c;将数据和操作封装在对象内部&#xff0c;通过定义类和创建对象来实现。让我们来介绍 Python 中面向对象编…

【Git】统计所有仓库单个用户的代码提交量

将以下代码保存为 gitStatics.sh,并且放置在存放所有仓库的文件夹内,与仓库文件保持同级。 #!/bin/bash # 检查是否提供了足够的参数 if [ "$#" -ne 1 ]; then echo "Usage: $0 <username>" exit 1 fi # 获取用户名参数 user

API数据能力开放架构 数据api接口

一.API数据接口可以从几个不同的角度来看待&#xff1a; 1. 技术角度&#xff1a;API数据接口是一种技术实现&#xff0c;通常是以HTTP协议或其他网络协议为基础&#xff0c;并采用特定的数据格式&#xff08;如JSON或XML&#xff09;来传递数据。 2. 业务角度&#xff1a;API…

视口坐标转换成Canvas下本地坐标与shader显示在3D物体前

shader显示在3D物体前&#xff0c;先转化成视口坐标 public virtual void SetESignPos() { float x 0; float y 0; int v PlayerPrefsTool.GetSpecialScreen(-1); if (EScreenCamera ! null) { Vector3 viewPointEScreenCa…

前端input上传文件 使用new FormData()同时上传文件类型和JSON数据

失败案例 async uploadFileHandler(e) {if (e.target.files.length) {const files e.target.files[0];let formData new FormData();formData.append("file", files);formData.append("module", "knowledge");fileupload(formData).then(res …

JVM探究

JVM探究 请你谈谈你对JVM的理解&#xff1f;java -> class -> jvm java 8虚拟机和之前的变化更新OOM 内存溢出。栈溢出 StackOverFlowError > 怎么分析JVM的常用调优参数 &#xff1f; 扩大内存内存快照如何抓取&#xff0c;怎么分析Dump文件&#xff1f;知道吗&…

SAP 生产订单中计划成本问题简介

最近财务在月结的时候,发现有生产订单结算的时候有物料不存在计划成本,并且财务顾问反馈这个问题已经存在有一段时间了。通过对生产订单的成本分析按钮查看生产订单的成本 发现确实存在有物料不存在计划成本,但是生产订单存在实际成本。 1、首先想到的是无计划成本的原材料…

使用Python进行图片格式转化/分辨率转化

一.下载python PIY插件库 PIP下载命令: pip install pillow -i https://mirrors.aliyun.com/pypi/simple PIY插件库:pillow Installation - Pillow (PIL Fork) 10.3.0.dev0 documentation 二.分辨率转化 from PIL import Image import osresolution (1024, 1024) with Image…