蜻蜓算法(DA)优化BP神经网络原理及Matlab代码

目录

0 引言

1 数学模型

2 优化方式

3 Matlab代码

3.1 伪代码

3.2 DA主函数代码

3.3 DA-BP

4 视频讲解

0 引言

蜻蜓算法(Dragonfly algorithm,DA)是Mirjalili于2016年基于人工蜻蜓的动态和静态群体行为而提出的群智能算法,该算法主要包括狩猎的静态群体行为和迁徙的动态行为,以此最优化问题进行探索和开发,凸显算法全局性。

1 数学模型

DA算法数学模型主要模拟蜻蜓集群的狩猎和迁徙行为。其数学模型如下:

1)群体行为遵循准则:DA中蜻蜓算法在进行群体行为应该遵循三个基本准则,分别为分裂、对齐和凝聚,分别表示个体在领域内静态避免与其他个体碰撞,个体速度和邻居个体速度相匹配和个体朝领域中心飞行趋势。其数学模型如下:

式中Si为分离,X为当前蜻蜓位置,Xj为领域随机蜻蜓位置,N为蜻蜓种群数;Ai为对齐,Vj为领域内个体Xj对应速度;Ci为蜻蜓之间的凝聚。

2)捕食准则:任何蜻蜓蜂群的主要目标都是生存,所以所有的个体都应该被吸引到食物来源和分散外部的敌人。

式中Fi为对食物的吸引力,X+为猎物的位置;Ei为躲避天敌,X-为天敌位置。

3)蜻蜓静态捕食位置更新:蜻蜓该行为基于上述五种纠正模式的结合,从而更新蜻蜓狩猎行为。

式中s为分离权重,a为对其权重,c为凝聚力权重,f为食物因素,e为天敌因素,w为惯性权重;ΔX为蜻蜓运动方向的步长。

4)蜻蜓迁徙活动:为了提高人工蜻蜓的随机性、随机行为和探索,当没有相邻的解决方案时,它们需要使用随机行走(Le‘vy飞行)在搜索空间中飞行。

式中levy为莱维飞行策略,d为问题维度;r1r2为0到1的随机值,β为常数,取1.5,Γ为阶乘。

2 优化方式

前篇对BP神经网络原理讲解(BP神经网络原理及matlab代码-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述DA原理介绍,可以将BP神经网络权值和阈值作为蜻蜓种群位置,每一个种群位置对应BP神经网络的预测值,将这个预测值作为适应度进行上述蜻蜓的静态和动态行为,从而更新蜻蜓在全局最优位置。

3 Matlab代码

3.1 伪代码

3.2 DA主函数代码

%% DA参数
% Max_iteration 最大迭代次数
% ub,lb 问题维度边界
% SearchAgents_no  种群大小
% SYD 适应度函数
% X 种群
% distance 蜻蜓之间距离函数
% dim 问题维度
% Levy 莱维飞行函数



%% DA主函数代码
for iter=1:Max_iteration
    
    r=(ub-lb)/4+((ub-lb)*(iter/Max_iteration)*2);
    
    w=0.9-iter*((0.9-0.4)/Max_iteration);
       
    my_c=0.1-iter*((0.1-0)/(Max_iteration/2));
    if my_c<0
        my_c=0;
    end
    
    s=2*rand*my_c; % 分离权重
    a=2*rand*my_c; % 对齐权重
    c=2*rand*my_c; % 凝聚力权重
    f=2*rand;      % 食物吸引力权重
    e=my_c;        % 分散敌人注意力权重
    
    for i=1:SearchAgents_no %C先计算所有目标的适应度
        Fitness(1,i)=SYD(X(:,i)',net);
        net.trainParam.showWindow = 0; 
        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:SearchAgents_no
        index=0;
        neighbours_no=0;
        
        clear Neighbours_DeltaX
        clear Neighbours_X
        %查找邻近的解决方案
        for j=1:SearchAgents_no
            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_score=Food_fitness;
    Best_pos=Food_pos;
    
    cg_curve(iter)=Best_score;
end

3.3 DA-BP

1)单输出回归预测:单输出回归预测:蜻蜓算法优化BP神经网络(DA-LSTM)

2)多输出回归预测:私信

3)分类模型:私信

4)时间序列:私信

4 视频讲解

B站搜索:’ 不想学习的陈成 ‘

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值