首页 > 编程语言 >非洲秃鹫算法(AVOV)优化BP神经网络原理及Matlab代码

非洲秃鹫算法(AVOV)优化BP神经网络原理及Matlab代码

时间:2024-09-03 10:24:29浏览次数:13  
标签:秃鹫 AVOV vulture bound current BP Matlab Best

目录

0 引言

1 数学模型

2 优化方式

3 Matlab代码

3.1 伪代码

3.2 AVOA主函数代码

3.3 AVOA-BP

4 视频讲解

0 引言

非洲秃鹫算法(African vultures optimization algorithm,AVOA)是Benyamin Abdollahzadeh等人于2021年提出的群智能算法,该算法通过模拟非洲秃鹫典型的领导者-追随者模式,由最优秃鹫和次优秃鹫领导全局个体进行自然捕食行为的优化算法。

1 数学模型

AVOA的数学模型主要包括四个部分:领导者选取,饥饿度,秃鹫根据饥饿度进行探索和开发阶段。

1)确定任何群体中的最佳秃鹫:在初始种群形成后,计算所有解的适应度,选择最优方案作为第一组的最佳秃鹰,第二优方案作为第二组的最佳秃鹰。

式中L1和L2是0到1的参数,Pi为通过轮盘赌(式(2))获得最佳概率解,F为解的适应度;

2)秃鹫的饥饿率:秃鹫是它们去更远距离寻找食物,或跟随更强壮秃鹫觅食的转换因子。也是其从探索阶段转移到开发阶段因子。

式中iterationi为当前迭代,maxiterations为最大迭代次数,w控制参数,常取2.5,h为-2到2的随机数,F为饥饿满足率,当大于1秃鹫进行探索阶段,当小于1秃鹫进行开发阶段。

3)探索阶段:秃鹫可以通过俩种策略检查不同区域是否存在食物,设定一个P1参数来选取不同策略。

式中R为最优秃鹫之一,X是秃鹫随机移动的地方,以保护食物免受其他秃鹫的伤害,F为F为饥饿满足率,ub,lb为问题维度界限。

开发阶段:开发阶段也有两个阶段,每个阶段使用两种不同的策略。在每个内部阶段中,每种策略的选择程度由p2和p3这两个参数决定。参数P2用于选择第一阶段中的策略,而参数P3用于选择第二阶段中策略。

4)开发阶段(第一阶段):当F在0.5到1之间,秃鹫根据参数P2的区间进行螺旋飞行策略和食物竞争策略:

食物竞争策略:当食物充足,健康秃鹫不让食物,弱势秃鹫抱团优势秃鹫进行竞争。

式中d为秃鹫和最好秃鹫的距离

螺旋飞行策略:秃鹫跟随优势秃鹫飞行策略

5)开发阶段(第二阶段):当F在0到0.5之间,秃鹫未达到食物充足状态,一些食物会聚集很多秃鹫和对食物展开激烈竞争(不帮扶):

秃鹫聚集食物的运动:

式中BestValture1为第一梯度秃鹫中最好秃鹫,BestValture2为第二梯对秃鹫中最好秃鹫;

激烈的竞争:当秃鹫足够饿时,领导者秃鹫没有能力对付其他秃鹫,其他秃鹫也会加剧竞争关系,秃鹫位置数学模型更新如下:

式中Levy为莱维飞行策略,d为秃鹫和最好俩只秃鹫的距离,u,v飞行策略正态分布随机数,β为固定参数,为1.5。Γ为阶乘。

2 优化方式

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

3 Matlab代码

3.1 伪代码

3.2 AVOA主函数代码

AVOA主函数代码:

%% 参数
% X  种群
% Best_vulture1_X 最好秃鹫种群
% Best_vulture1_F 最好秃鹫对应适应度
% Best_vulture2_X 第二好秃鹫种群
% Best_vulture2_F 第二好秃鹫种群适应度
% max_iter 最大迭代次数
% SYD 适应度函数
% 





%% 第一阶段:确定任何群体中最好的秃鹫
    current_iter=0; 
    while current_iter < max_iter
        for i=1:size(X,1)
            % 计算种群的适应度
            current_vulture_X = X(i,:);
            current_vulture_F=SYD(current_vulture_X,net);
            net.trainParam.showWindow = 0;

            % 更新前两个最佳秃鹰
            if current_vulture_F<Best_vulture1_F
                Best_vulture1_F=current_vulture_F; % 第一
                Best_vulture1_X=current_vulture_X;
            end
            if current_vulture_F>Best_vulture1_F && current_vulture_F<Best_vulture2_F
                Best_vulture2_F=current_vulture_F; % 第二
                Best_vulture2_X=current_vulture_X;
            end
        end
%% 第二阶段:秃鹫的饥饿率
        a=unifrnd(-2,2,1,1)*((sin((pi/2)*(current_iter/max_iter))^gamma)+cos((pi/2)*(current_iter/max_iter))-1);% eq(3)
        
        P1=(2*rand+1)*(1-(current_iter/max_iter))+a;% eq(4)

        % 更新位置
        for i=1:size(X,1)
            current_vulture_X = X(i,:);  % 将当前的秃鹫挑回种群
            F=P1*(2*rand()-1);  
            
            random_vulture_X=random_select(Best_vulture1_X,Best_vulture2_X,alpha,betha);
%% 第三阶段:探索     
            if abs(F) >= 1 % 探索
                current_vulture_X = exploration(current_vulture_X, random_vulture_X, F, p1, upper_bound, lower_bound);
%% 第四阶段:开发
            elseif abs(F) < 1 % 开发
                current_vulture_X = exploitation(current_vulture_X, Best_vulture1_X, Best_vulture2_X, random_vulture_X, F, p2, p3, variables_no, upper_bound, lower_bound);
            end

            X(i,:) = current_vulture_X; % 将目前的秃鹫放回种群
        end

        current_iter=current_iter+1;

        convergence_curve(current_iter)=Best_vulture1_F;

        X = boundaryCheck(X, lower_bound, upper_bound);
    end
end

轮盘赌策略代码:

%%  轮盘选择
function [random_vulture_X]=random_select(Best_vulture1_X,Best_vulture2_X,alpha,betha)
    probabilities=[alpha, betha ];
    A=rouletteWheelSelection( probabilities );
    if (A == 1)
            random_vulture_X=Best_vulture1_X;
    else
            random_vulture_X=Best_vulture2_X;
    end
end

探索策略代码:

%% 探索
function [current_vulture_X] = exploration(current_vulture_X, random_vulture_X, F, p1, upper_bound, lower_bound)
    if rand<p1
        current_vulture_X=random_vulture_X-(abs((2*rand)*random_vulture_X-current_vulture_X))*F;
    else
        current_vulture_X=(random_vulture_X-(F)+rand()*((upper_bound-lower_bound)*rand+lower_bound));
    end
    
end

开发策略代码:

%% 开发
function [current_vulture_X] = exploitation(current_vulture_X, Best_vulture1_X, Best_vulture2_X,random_vulture_X, F, p2, p3, variables_no, upper_bound, lower_bound)
    
if  abs(F)<0.5  
    if rand<p2
        A=Best_vulture1_X-((Best_vulture1_X.*current_vulture_X)./(Best_vulture1_X-current_vulture_X.^2))*F;
        B=Best_vulture2_X-((Best_vulture2_X.*current_vulture_X)./(Best_vulture2_X-current_vulture_X.^2))*F;
        current_vulture_X=(A+B)/2;
        
    else
        current_vulture_X=random_vulture_X-abs(random_vulture_X-current_vulture_X)*F.*levyFlight(variables_no);
    end
end

if  abs(F)>=0.5
    if rand<p3
        current_vulture_X=(abs((2*rand)*random_vulture_X-current_vulture_X))*(F+rand)-(random_vulture_X-current_vulture_X);
    else
        s1=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*cos(current_vulture_X);
        s2=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*sin(current_vulture_X);    
        current_vulture_X=random_vulture_X-(s1+s2);
        
    end
    
end

end

3.3 AVOA-BP

1)单输出回归预测:单输出回归预测:非洲秃鹫算法优化BP神经网络模型(AVOA-BP)

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

3)分类模型:私信

4)时间序列:私信

4 视频讲解

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

标签:秃鹫,AVOV,vulture,bound,current,BP,Matlab,Best
From: https://blog.csdn.net/m0_74389201/article/details/141473285

相关文章