蜻蜓算法优化支持向量机原理及MATLAB代码复现

目录

0 引言

1 数学模型

2 优化方式

3 MATLAB代码

3.1 伪代码

3.2 主函数代码

3.3 DA-BP

0 引言

蜻蜓算法( Dragonfly algorithm,DA)是Seyedali Mirjalili等于2016年提出的一种新型智能优化算法。其主要灵感源于自然界中蜻蜓的静态和动态群集行为,静态群体中,蜻蜓组成小群在一个小区域内来回飞行,捕食其他飞行猎物,其中局部移动和飞行路径的突然变化是静态群体的主要特征。在动态群体中,大量的蜻蜓为了长距离迁徙而形成群体蜻蜓被视为小型捕食者,幼虫期的蜻蜓还会捕食其他海洋昆虫甚至小鱼。

1 数学模型

DA的数学模型是模拟蜻蜓的捕食和迁徙,前者称为静态(觅食)集群,后者称为动态(迁徙)集群,同时可将此归纳于蜻蜓的生活习性5类行为方式:分离、排队对齐、凝聚、寻找猎物和躲避天敌来构建模型,具体模型如下:

1)分离:分离是蜻蜓个体与同类分开的行为。其数学表达式为:

式中X是当前个体的位置,Xj表示第j个邻近个体的位置,N是邻近个体的数量;

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

式中Vj表示第j个邻近个体的速度,N是邻近个体的数量;

3)凝聚:凝聚是指蜻蜓与相邻同类之间彼此聚在一起的集群行为。其的数学表达式为:

式中X是当前个体的位置,N是邻域的数量,Xj表示第j个邻域个体的位置。

4)寻找猎物:寻找猎物指蜻蜓为生存搜寻猎物,不断拉近与猎物的吸引距离,其数学表达式为:

式中X是当前个体的位置,X+表示食物来源的位置。

5)躲避天敌:个体出于生存的本能,需时刻警惕天敌,选择向外分散敌人,其表达式如下:

式中X是当前个体的位置,X-显示敌人的位置。

6)更新蜻蜓的位置:结合上述五种行为。更新人工蜻蜓在搜索空间中的位置并模拟其运动,同时考虑了两个向量:步长(DX)和位置(X)。并定义如下:

式中s表示分离权重,Si表示第i个个体的分离度,a是对齐权重,A是第i个个体的对齐情况,c表示凝聚权重,Ci是第i个个体的凝聚度,f是食物因子,Fi是第i个个体的食物来源,e是敌对因子,Ei是第i个个体的敌对位置,w是惯性权重,t是迭代计数器。

7)飞行策略:为了提高人工蜻蜓的随机性、随机行为和探索能力,当没有邻近解时,要求它们使用随机游走(Le‘vy飞行)在搜索空间中飞行,具体表达式如下:

其中t是当前迭代,d是位置向量的维度;r1、r2是[0,1]中的两个随机数,β是一个常数,为3/2;

2 优化方式

前篇对BP神经网络原理讲解(BP神经网络原理及Matlab代码复现-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述DA原理介绍,可以将BP神经网络权值和阈值作为蜻蜓和食物的个体位置,每一个种群位置对应BP神经网络的预测值,将这个预测值作为适应度模拟蜻蜓个体进行上述五种行为,更新蜻蜓个体,进行下一迭代蜻蜓。

3 MATLAB代码

3.1 伪代码

3.2 主函数代码

%%DA算法的主函数
% 适应度大小
cg_curve=zeros(1,Max_iteration);

if size(ub,2)==1
    ub=ones(1,dim)*ub;
    lb=ones(1,dim)*lb;
end

%蜻蜓邻域的初始半径
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(SearchAgents_no,dim,ub,lb);
Fitness=zeros(1,SearchAgents_no);

DeltaX=initialization(SearchAgents_no,dim,ub,lb);

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-SVM/SVR

蜻蜓算法优化支持向量机的回归预测和分类模型MATLAB代码如下:

蜻蜓算法(DA)优化支持向量机的代MATLAB代码复现-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值