首页 > 编程语言 >海马优化算法(SHO)优化BP神经网络原理及MATLAB代码复现

海马优化算法(SHO)优化BP神经网络原理及MATLAB代码复现

时间:2024-11-19 17:50:19浏览次数:3  
标签:horses 海马 BP MATLAB Sea new1 优化 SHO

目录

0 引言

1 数学模型

2 优化方式

3 MATLAB代码

3.1 伪代码

3.2 SHO主函数代码

3.3 SHO-BP

0 引言

海马优化算法(Sea-horse optimizer,SHO)是Shijie Zhao等人于2023年提出群智能算法,该算法模拟了海马的运动、捕食和繁殖行为。在前两个阶段,SHO分别模拟了海马的不同运动模式和概率捕食机制。此外由于海马妊娠的独特特点,有利于增加种群多样性。

1 数学模型

SHO的数学模型主要模拟海马的运动、捕食和繁殖行为。其中运动阶段主要分为受海洋涡旋作用影响的浮动螺旋模式和沿当前波的漂移模式。捕食策略以一定的概率捕获猎物的成败,繁殖阶段则保持男亲正信息的同时繁殖后代,有利于增加种群多样性。具体模型如下:

1)初始化:SHO为群智能算法,该算法种群初始化为随机生成,具体如下。

式中Xi为第i个个体的海马种群位置,UB,LB为问题维度边界,Dim问题维度,Pop为种群数量,Xeite为精英个体,f为适应度函数。

2)海马的运动:海马的运动主要模拟受海洋涡旋作用影响的浮动螺旋模式和沿当前波的漂移模式,前者为海马正跟随螺旋运动向精英精英移动,避免了局部对SHO的过度利用;后者则是利用布朗运动模拟海马的另一个运动长度,以确保其在搜索空间中更好的探索,提高全局搜索性能。

2.1)螺旋运动:该运动中海马正跟随螺旋运动向精英精英移动,采用Levy飞行来模拟海马的运动步长,有利于海马在早期迭代中高概率穿越到其他位置。具体模型如下:

式中levy为莱维飞行分布函数,x = ρ×cos (θ)、y = ρ×sin (θ)和z = ρ×θ分别表示螺旋运动下的坐标(x、y、z)的三维分量,其中ρ = u × e^(θv),uv为螺旋常数。入为0到2随机数,s为固定常数,w和k为0到1之间的随机数,Γ为阶乘。

2.2)布朗运动:海马随海浪变化时的运动,在漂移作用下,利用布朗运动模拟海马的另一个运动长度,以确保其在搜索空间中更好的探索。具体模型如下:

式中l为系数常量,βt为布朗运动的随机游走系数,服从正态分布。

3)捕食行为:海马捕食浮游动物和小型甲壳类动物有两种结果:成功和失败。考虑到海马成功捕获食物的概率超过90%,我们设计了SHO的随机数r2来区分这两个结果,这种捕食行为的数学表达式是:

式中α为随迭代次数减少系数,t为当前迭代次数,T为最大迭代次数。

4)繁殖行为:根据适合度值将其分为雄性和雌性组。值得强调的是,由于雄性海马负责繁殖,SHO算法将健康值最好的个体的一半作为父亲,另一半作为母亲。这种划分将促进父母之间的良好的遗传特征,以产生下一代,并避免新的解决方案的过度定位。海马角色分配的简明数学表达式为:

式中Xsort为适应度排列的种群位置,r3为0到1的随机数。

2 优化方式

前篇对BP神经网络原理讲解(BP神经网络原理及Matlab代码复现-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述SHO原理介绍,可以将BP神经网络权值和阈值作为海马种群位置,每一个种群位置对应BP神经网络的预测值,将这个预测值作为适应度更新海马精英个体及雄雌性,进行算法的运动、捕食及繁殖等社会运动,更新更优的下一代个体位置向量。

3 MATLAB代码

3.1 伪代码

3.2 SHO主函数代码

while t<Max_iter+1
    beta=randn(pop,Dim);%布朗运动的随机游走系数
    Elite=repmat(Position,pop,1);% 精英海马

    %海马的运动行为
    r1=randn(1,pop);
    omega = 1.5; 
    Step_length=levy(pop,Dim,omega);%levy飞行模拟海马的运动步长
    for i=1:pop
        for j=1:Dim
            if r1(i)>0  
                r=rand();
                theta=r*2*pi;%[0,2π]之间的随机值
                row=u*exp(theta*v);%螺旋常数u,v定义的长度
                x=row*cos(theta);%
                y=row*sin(theta);%
                z=row*theta;%三维分量
                %螺旋运动模式
                Sea_horses_new1(i,j)=Sea_horses(i,j)+Step_length(i,j)*((Elite(i,j)-Sea_horses(i,j)).*x.*y.*z+Elite(i,j));%Eq.(4)
            else
                %布朗运动模式
                Sea_horses_new1(i,j)=Sea_horses(i,j)+rand()*l*beta(i,j)*(Sea_horses(i,j)-beta(i,j)* Elite(i,j));%Eq.(7)
            end
        end
    end

     for i=1:pop

        %边界检测
        Tp=Sea_horses_new1(i,:)>UB;
        Tm=Sea_horses_new1(i,:)<LB;
        Sea_horses_new1(i,:)=(Sea_horses_new1(i,:).*(~(Tp+Tm)))+UB.*Tp+LB.*Tm;    
     end

    % 海马的捕食行为,90%成功率
    for i=1:pop
        for j=1:Dim
            r1=rand();
            r2(i)=rand();
            alpha=(1-t/Max_iter)^(2*t/Max_iter);%Eq(11)随着迭代而线性减小

            if r2(i)>0.1
                Sea_horses_new2(i,j)=alpha*(Elite(i,j)-rand()*Sea_horses_new1(i,j))+(1-alpha)*Elite(i,j);  %Eq.(10)
            else
                Sea_horses_new2(i,j)=(1-alpha)*(Sea_horses_new1(i,j)-rand()*Elite(i,j))+alpha*Sea_horses_new1(i,j);  %Eq.(10)
            end
        end
    end

    for i=1:pop
        %边界检查
        Tp=Sea_horses_new2(i,:)>UB;
        Tm=Sea_horses_new2(i,:)<LB;
        Sea_horses_new2(i,:)=(Sea_horses_new2(i,:).*(~(Tp+Tm)))+UB.*Tp+LB.*Tm;
        %计算所有海马的体能
        Sea_horsesFitness1(1,i)=SYD(Sea_horses_new2(i,:),net);
        net.trainParam.showWindow = 0;
    end

    [~,index]=sort(Sea_horsesFitness1);
    
    %海马的繁殖行为
    Sea_horses_father=Sea_horses_new2(index(1:pop/2),:);    %Eq.(12)雄性
    Sea_horses_mother=Sea_horses_new2(index(pop/2+1:pop),:);  %Eq.(12)雌性

    for k=1:pop/2
        r3=rand();
        Si(k,:)=r3*Sea_horses_father(k,:)+(1-r3)*Sea_horses_mother(k,:);  %Eq.(13)
    end

    Sea_horses_offspring=Si;%后代

    for i=1:pop*0.5
        %边界检查
        Tp=Sea_horses_offspring(i,:)>UB;
        Tm=Sea_horses_offspring(i,:)<LB;
        Sea_horses_offspring(i,:)=(Sea_horses_offspring(i,:).*(~(Tp+Tm)))+UB.*Tp+LB.*Tm;
        
        Sea_horsesFitness2(1,i)=SYD(Sea_horses_offspring(i,:),net);
        net.trainParam.showWindow = 0;
    end

    %海马对比
    Sea_horsesFitness=[Sea_horsesFitness1,Sea_horsesFitness2];
    Sea_horses_new=[Sea_horses_new2;Sea_horses_offspring];
    
    [~,sorted_indexes]=sort(Sea_horsesFitness);
    
    Sea_horses=Sea_horses_new(sorted_indexes(1:pop),:);
    
    SortfitbestN = Sea_horsesFitness(sorted_indexes(1:pop));
    fitness_history(:,t)=SortfitbestN';
    population_history(:,:,t)=Sea_horses;
    Trajectories(:,t)=Sea_horses(:,1);

    %更新最优解
    if SortfitbestN(1)<Fitness
        Position=Sea_horses(1,:);
        Fitness=SortfitbestN(1);
    end
    
    Convergence_curve(t)=Fitness;
    t = t + 1;
    
    
end

3.3 SHO-BP

单输出回归预测模型、多输出回归预测模型、分类模型和时间序列模型代码复现:

海马优化算法优化BP神经网络-CSDN博客

标签:horses,海马,BP,MATLAB,Sea,new1,优化,SHO
From: https://blog.csdn.net/2403_88401503/article/details/143868704

相关文章

  • 海马优化算法(SHO)优化支持向量机网络原理及MATLAB代码复现
    目录0引言1数学模型2优化方式3MATLAB代码3.1伪代码3.2SHO主函数代码3.3SHO-SVR、SHO-SVM0引言海马优化算法(Sea-horseoptimizer,SHO)是ShijieZhao等人于2023年提出群智能算法,该算法模拟了海马的运动、捕食和繁殖行为。在前两个阶段,SHO分别模拟了海马的不同运......
  • 非洲秃鹫算法(AVOA)优化支持向量机原理及MATLAB代码复现
    目录0引言1数学模型2优化方式3MATLAB代码3.1伪代码3.2AVOA主函数代码3.3AVOA-SVR,AVOA-SVM0引言非洲秃鹫算法(Africanvulturesoptimizationalgorithm,AVOA)是由BenyaminAbdollahzadeh等人于2021年基于非洲秃鹫的领导者-追随者模型捕食提出的群智能算法,AVOA通......
  • Abp.VNext-拆分查询
    Abp默认采用的是拆分查询,优点是提高性能,缺点是使用Linq进行多表关联操作时打印查询字符串得到的SQL语句是单表查询语句。而实际上代码执行的是多表关联查询,容易误导开发人员。例如下列LINQ查询是多表关联,但是得到的查询字符串是单表操作。varquery=(await_blogRepository.G......
  • Abp.VNext-显示加载实体导航属性
    方式一:为实体配置默认导航并设置includeDetails属性为true[DependsOn(typeof(AbpEntityFrameworkCoreMySQLModule))]publicclassEntityFrameworkCoreModule:AbpModule{publicoverridevoidConfigureServices(ServiceConfigurationContextcontext){Co......
  • Abp.VNext-数据过滤
    如何实现软删除数据查询过滤实体类继承ISoftDelete接口后,查询获取到的返回结果将不包含已删除的数据。如何关闭软删除数据过滤全局方式关闭软删除数据过滤EntityFrameworkCoreModule模块类中使用。[DependsOn(typeof(AbpEntityFrameworkCoreMySQLModule))]publicclassEnti......
  • Abp.VNext-统一配置UTC时区时间
    PreConfigureServices方法重载并添加如下代码[DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule),)]publicclassApiHostModule:AbpModule{publicoverridevoidPreConfigureServices(ServiceConfigurationContextcontext)......
  • C++编程:通过多线程与协程优化阻塞型任务的调度性能
    文章目录0.引言1.多线程VS多线程+协程1.1示例1:使用传统的多线程进行矩阵乘法1.2.示例2:使用协程优化阻塞型任务3.分析与对比0.引言我们知道:多线程:适用于处理计算密集型任务或IO操作较少的场景,但会因为线程切换和创建销毁的开销而影响性能。协程:适用于处......
  • 博客园-awescnb插件-geek皮肤优化-logo添加
    ......
  • cmu15545笔记-查询优化(Query Optimization)
    目录概述Heuristics/RulesCost-basedSearchSinglerelationMutiplerelationGenertive/Bottom-UpTransformation/Top-DownNestedsub-queriesDecomposingQueriesExpression/QueriesRewritingStatistics概述数据库系统的执行流程:从优化器到磁盘所设计的步骤:查询......
  • 网格简化-QEM 顶点二次度量的优化
    QEM顶点二次度量的优化理论QEM(QuadricErrorMetrics,四元数误差度量)是一种常用的网格简化技术,它通过计算几何代价来评估边的简化。通过使用QEM,您可以在简化过程中保留重要的几何特性。边折叠的基本思想在QEM中,边折叠的目的是将两个顶点合并成一个新顶点,以减少网格的复杂性......