【智能算法】蜻蜓算法(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:maxIter
    
    r=(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<0
        my_c=0;
    end
    
    s=2*rand*my_c; % Seperation weight
    a=2*rand*my_c; % Alignment weight
    c=2*rand*my_c; % Cohesion weight
    f=2*rand;      % Food attraction weight
    e=my_c;        % Enemy distraction weight
    
    for i=1:pop %Calculate all the objective values first
        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
    
    for i=1:pop
        index=0;
        neighbours_no=0;
        
        clear Neighbours_DeltaX
        clear Neighbours_X
        for j=1:pop
            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_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==1
    ub_new=ones(1,dim)*ub;
    lb_new=ones(1,dim)*lb;
else
     ub_new=ub;
     lb_new=lb;   
end
for i=1:dim
    ub_i=ub_new(i);
    lb_i=lb_new(i);
    Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i;
end

Positions=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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型相关整理

机器学习 模型就是函数&#xff0c;这个函数可能是一个很简单的线性函数&#xff0c;也可以是一个非常复杂的高阶函数、或者是一个多层的神经网络函数。 机器学习领域的很多研究和方法都是在尝试设计这个函数&#xff0c;以自动驾驶领域为例&#xff0c;之前的自动驾驶基于人…

四川宏博蓬达法律咨询有限公司:专业可靠,您身边的法律守护者

在现代社会&#xff0c;法律咨询服务的需求日益增长&#xff0c;选择一家专业可靠的法律咨询公司成为了许多企业和个人的当务之急。四川宏博蓬达法律咨询有限公司便是这样一个值得信赖的法律服务提供者&#xff0c;以其专业、高效、贴心的服务&#xff0c;赢得了广大客户的信赖…

c++ primer plus笔记 第十八章 探讨c++新标准

复习前面的内容&#xff1a; 1.auto&#xff0c;可以自动识别auto本身在这种语境下是什么类型 2.decltype,让一个变量的类型和另外一个变量的类型相同 decltype(x) y;//让y的类型和x的类型相同 如何理解&#xff1f; decltype是一个关键词&#xff0c;其作用是检查括号内的…

【MySQL系列 05】Schema 与数据类型优化

良好的数据库 schema 设计和合理的数据类型选择是 SQL 获得高性能的基石。 一、选择优化的数据类型 MySQL 支持的数据类型非常多&#xff0c;选择正确的数据类型对于获得高性能至关重要。不管存储哪种类型的数据&#xff0c;下面几个简单的原则都有助于做出更好的选择。 1. …

AOP-注解实现-记录日志到数据库

概念解释 AOP&#xff1a;Aspect Oriented Programming Aspect&#xff1a;方面Oriented&#xff1a;面向…的Programming编程 之前我对模块化编程的认识&#xff0c;主要是局限在布局结构、目录结构上。比如Vue的template模板。 对方法的模块化编程&#xff0c;我之前的认识…

基于springboot+layui仓库管理系统设计和实现

基于 java springbootlayui仓库管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取…

硬件工程师面试题梳理-百度硬件面试题

硬件工程师基本职责 在公司里面&#xff0c;硬件工程师的主要职责包括设计、开发和测试硬件系统&#xff0c;以满足产品需求和性能要求。他们负责确保硬件系统的可靠性、稳定性和可维护性&#xff0c;并与软件工程师和其他团队成员合作&#xff0c;以确保硬件和软件的协同工作…

arcgis辅助下的GIS滑坡泥石流易发性评估模型构建

我国是地质灾害多发国家&#xff0c;地质灾害的发生无论是对于地质环境还是人类生命财产的安全都会带来较大的威胁&#xff0c;因此需要开展地质灾害风险普查。利用遥感&#xff08;RS&#xff09;技术进行地质灾害调查工作具有宏观、快速、准确的特点&#xff0c;能反映出地质…

SpringCloud(21)之SpringCloud Alibaba Nacos实战应用

一、Nacos安装 1.1 Nacos概述 Nacos是Alibaba微服务生态组件中的重要组件之一&#xff0c;主要用它实现应用的动态服务发现、配置管理、 服务管理。Nacos discovery alibaba/spring-cloud-alibaba Wiki GitHub Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简…

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 这篇论文是基于VideoCrafter的&#xff0c;而VideoCrafter是基于LVDM的 关于LVDM可以看https://blog.csdn.net/Are_you_ready/article/details/136615853 2023年12月6日发表在arxiv 这篇论文讨论…

seo js转码工具

js转码工具作用 用于把js加密 如果不想让别人看到自己的js 代码就可以使用这个方法 js工具网址 https://tool.chinaz.com/js.aspx 效果

J.K.罗琳创作的《神奇动物》系列电影赏析

故事情节 《神奇动物在哪里》&#xff1a; 这部电影讲述了纽特斯卡曼德来到纽约的故事&#xff0c;他是一位收集和研究魔法动物的巫师。在纽约&#xff0c;他的一只神奇生物逃脱&#xff0c;并引发了一系列麻烦。与此同时&#xff0c;纽约巫师社会面临着黑暗力量的威胁&#x…

超大规模-近场

这里先了解基站到用户的&#xff0c;无RIS的近场模型 超大规模智能反射面辅助的近场移动通信研究 &#xff08;论文题目&#xff09; &#xff08;期刊&#xff09;无线电通信技术 系统&#xff1a;BS-RIS-UE&#xff0c;两个阶段都是近场 模型&#xff1a;球面波传播模型&…

在dpvs上实现ICMP的源进源出

目录 1. 缘起2. 源码分析3. 让ICMP也走源进源出1. 缘起 在网络通信中,当一个请求报文从源主机到达目标主机,并经过中间路由器或交换机进行转发时,请求报文进入主机A的路径和响应报文离开主机A的路径可能不同。这种情况下,就会出现所谓的三角路径问题。如下图: 具体来说,…

USB协议学习(三)大容量存储设备SCSI协议分析

笔者来简单介绍一下SCSI得协议命令 1、SCSI协议认识 SCSI&#xff1a;Small Computer System Interface&#xff0c;用于计算机外部设备得接口标准&#xff0c;定义了与外部设备得一套协议。SCSI标准协议族支持很多钟SCSI设备&#xff0c;像盘&#xff0c;打印机&#xff0c;扫…

论企业安全漏洞扫描的重要性

前言 随着信息技术的迅猛发展和互联网的广泛普及&#xff0c;网络安全问题日益凸显。在这个数字化的世界里&#xff0c;无论是企业还是个人&#xff0c;都面临着前所未有的安全威胁。安全漏洞&#xff0c;作为这些威胁的源头&#xff0c;常常被忽视或无法及时发现。 而安全漏洞…

提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C++风格字符串完成

#include <iostream> #include <array> using namespace std;int main() {cout<<"请输入一个字符串"<<endl;//array<string,100> str;string str;getline(cin,str);int daxie0,xiaoxie0,num0,space0,other0;int lenstr.size();;for(in…

植物病害识别:YOLO水稻病害识别数据集(11000多张,yolo标注)

YOLO水稻病害识别数据集&#xff0c;包含叶斑病&#xff0c;褐斑病&#xff0c;细菌性枯萎病&#xff0c;东格鲁病毒病4个常见病害类别&#xff0c;共11000多张图像&#xff0c;yolo标注完整&#xff0c;可直接训练。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c…

Flink 性能优化总结(反压优化篇)

反压的理解 Flink 中每个节点间的数据都以阻塞队列的方式传输&#xff0c;下游来不及消费导致队列被占满后&#xff0c;上游的生产也会被阻塞&#xff0c;最终导致数据源的摄入被阻塞。简单来说就是系统接收数据的速率远高于它处理数据的速率。 反压如果不能得到正确的处理&am…

软件测试面试需要准备什么?面试有什么技巧?看完面试轻松解决

前言 无论是在校招还是社会企业招聘中&#xff0c;应聘者总是要经过层层的考核才能被聘用。然而&#xff0c;在招聘时&#xff0c;设置的编程以及非技术面试问题&#xff0c;真的有必要吗&#xff1f;如此就能考核出一位开发者的真实水平&#xff1f; 说到底就是考验你的技术以…