【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码

1 简介

由于影响岩爆因素的复杂性,以及岩爆的极强灾害性.本文通过选择影响岩爆程度的四项物理力学指标,最后运算组合以后变成三项输入因子.应用BP神经网络对16组国内外岩爆实际工程案例进行训练,得到最优隐含层数.然后利用猫群群算法(CSO)优化网络的初始权值和闻值,避免了单独使用BP网络时说存茌的不足.利用Matlab及其神经网络工具箱来实现网络的运算和预测.将训练好的网路应用到三组实际的案例中,最终结果表明利用CSO-BP神经网络算法所预测出来的结果和实际岩爆烈度一致,且结果明显优于单因素判据和BP网络预测的结果.

猫群算法(CSO)是 2006 年由台湾学者 Chu 等人通过观察猫群在日常生活中的行为提出来的一种新型群体智能算法。猫群算法与遗传算法类似,是基于迭代的优化方法,但是没有遗传算法的交叉算子,易实现,且拥有全局搜索、较快收敛速度等优点。

猫群算法是研究人员通过观察自然界猫群的生活习性提出来的一种智能算法。该算法把猫群分成跟踪和搜寻两种模式。每只猫即对应问题的一个解。每只猫的属性由猫的速度、猫的适应值、猫处于跟踪或搜寻模式的标志值(通常为 0 或 1)组成。每只猫处于初始位置,然后通过每只猫的标志值判断猫处于搜寻还是跟踪模式。若猫处于跟踪模式,则执行跟踪算子;若猫处于搜寻模式,则执行搜寻算子。最后使得猫处于一个新的位置,并保留最优猫直至算法满足结束条件。猫群算法的基本流程分为以下五步:

a)初始化猫群。

b)根据分组率将猫群随机划分为跟踪和搜寻两种模式。

c)根据猫的标志值对猫执行相应的算子进行位置更新。

d)计算每只猫的适应度,记录并保留适应度最优的猫。

e)若满足结束条件则终止算法,否则再返回步骤 b)。猫群算法的基本流程如图 1 所示。

【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码_第1张图片

主要参数介绍如下:

a)猫群规模 N,即猫的初始数量,由具体问题来确定。较大的猫群可以扩大搜索空间,但也增加了算法的复杂度,较小的猫群能较快收敛,但也容易陷入局部最优。b)分组率 mr。将猫群随机分成两组,模拟现实生活中大部分猫处在搜寻状态,少量的猫处于跟踪模式,通常该参数取一个较小的值。

c)个体猫上每个基因的改变范围 srd。类似于遗传算法的变异概率,进行基因改变是为了增加解的多样性防止算法陷入局部最优。改变范围太小则不容易产生新解,范围太大则容易使算法变成随机搜索。

d)最大迭代次数 maxiter。由实验的具体问题而定,若迭代次数过大,可能算法已经收敛,会增加不必要的运算时间,若迭代次数过小,则容易出现早熟现象。

【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码_第2张图片

【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码_第3张图片

【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码_第4张图片

​2 部分代码

clc;close all;num=2;     MaxIt=200;  % Maximum Number of IterationsnPop=50; %% Algorithm Parameters BINARY CAT 2013    tb=10;bitt=20;nVar=bitt*tb; BestCost1_cat=zeros(num,MaxIt);  CostFunction=@(x,tb,bitt) cost_function(x,tb,bitt);   % Cost Functionc2_cat=1;for ittt=1:num    for ta=1:1             %  Number of Decision Variables            alpha=0.3;            VarSize=[1 nVar];   % Decision Variables Matrix Size            %% PSO Parameters            SMP=3;%0.25*nPop;            SRD=0.2;            CDC=0.2;            nb=round(nVar*CDC);                    MR=0.3;            num_seek=round(MR*nPop);            num_track=nPop-num_seek;            cat=randperm(nPop);            w_cat=0.5;            vmax_cat=4;            %********************************            %% Initialization            % Define Empty Structure to Hold Particle Data            empty_cat.Position=[];            empty_cat.flag=[];            empty_cat.Velocity=[];            empty_cat.Cost=[];            pop=repmat(empty_cat,nPop,1);            vel_cat=rand(nPop,nVar)-0.5;            one_vel_cat=rand(nPop,nVar)-0.5;            zero_vel_cat=rand(nPop,nVar)-0.5;            % Initialize Global Best            GlobalBest.Cost=inf;            for i=1:nPop                % Initialize Velocity                pop(i).Position = round(rand(1,nVar));                pop(i).Velocity = rand(1,nVar);                % Evaluate Solution                pop(i).Cost=CostFunction(pop(i).Position,tb,bitt);                 y=find(cat==i);                if(y<=num_seek)                    pop(i).flag=1;                else                    pop(i).flag=0;                end                % Update Global Best                if pop(i).Cost<=GlobalBest.Cost                    GlobalBest=pop(i);                end            end            % Define Array to Hold Best Cost Values            BestCost=zeros(MaxIt,1);            c1=1;            %% PSO Main Loop            for it=1:MaxIt                    oneadd_cat=zeros(nPop,nVar);                    zeroadd_cat=zeros(nPop,nVar);                    dd3_cat=c2_cat*rand;                    %******************************************************                    for t_i=1:nPop                        for g_i=1:nVar                            if(GlobalBest.Position(g_i)==0)                               oneadd_cat(t_i,g_i)=oneadd_cat(t_i,g_i)-dd3_cat;                               zeroadd_cat(t_i,g_i)=zeroadd_cat(t_i,g_i)+dd3_cat;                            else                               oneadd_cat(t_i,g_i)=oneadd_cat(t_i,g_i)+dd3_cat;                                zeroadd_cat(t_i,g_i)=zeroadd_cat(t_i,g_i)-dd3_cat;                            end                        end                    end                    one_vel_cat=w_cat*one_vel_cat+oneadd_cat;                    zero_vel_cat=w_cat*zero_vel_cat+zeroadd_cat;                                        for t_i=1:nPop                        for g_i=1:nVar                            if(abs(vel_cat(t_i,g_i))>vmax_cat)                                one_vel_cat(t_i,g_i)=vmax_cat*sign(one_vel_cat(t_i,g_i));                                zero_vel_cat(t_i,g_i)=vmax_cat*sign(zero_vel_cat(t_i,g_i));                            end                        end                    end                                        for t_i=1:nPop                        for g_i=1:nVar                            if(pop(t_i).Position(g_i)==1)                                vel_cat(t_i,g_i)=zero_vel_cat(t_i,g_i);                            else                                vel_cat(t_i,g_i)=one_vel_cat(t_i,g_i);                            end                        end                    end                    veln_cat=logsig(vel_cat);                    %******************************************************                for i=1:nPop                    if(pop(i).flag==0)                                                for r2=1:nVar                              if(rand                                  pop(i).Position(r2)=GlobalBest.Position(r2);                              else                                  pop(i).Position(r2)=pop(i).Position(r2);                              end                            end                            pop(i).Cost = CostFunction(pop(i).Position,tb,bitt);                     else                                     copy_cat=repmat(pop(i).Position,SMP,1);                             pop(i).Position=mutate(copy_cat,nVar,nb,SRD,tb,bitt);                                        end                    try                    pop(i).Cost = CostFunction(pop(i).Position,tb,bitt);                     catch tt                        disp('ll');                    end                        % Update Global Best                        if pop(i).Cost<=GlobalBest.Cost                            GlobalBest=pop(i);                        end                 end                % Store Best Cost Ever Found                BestCost(it)=GlobalBest.Cost;                  % Show Iteration Information                disp(['Iteration ' num2str(it) ': Best Cost cat= ' num2str(BestCost(it))]);                num_seek=round(MR*nPop);                num_track=nPop-num_seek;                cat=randperm(nPop);                for ii=1:nPop                    y=find(cat==ii);                    if(y<=num_seek)                        pop(ii).flag=1;                    else                        pop(ii).flag=0;                    end                end            end    end % BINARY CAT 2013    BestCost1_cat(ittt,:)=BestCost';end    BestCost_all_cat1=mean(BestCost1_cat);    BestCost1_cat=BestCost1_cat;    %******************************************    std1_cat1=std(BestCost1_cat);    std_cat1=std1_cat1(MaxIt);    %******************************************     mean1_cat1=mean(BestCost1_cat);    mean_cat1=mean1_cat1(MaxIt);    %******************************************    best1_cat1=max(BestCost1_cat);    best_cat1=best1_cat1(MaxIt);    %******************************************    bad1_cat1=min(BestCost1_cat);    bad_cat1=bad1_cat1(MaxIt);    daa=[mean_cat1;std_cat1;bad_cat1;best_cat1]  figure;  semilogy(BestCost_all_cat1,'r','LineWidth',2);  xlabel('Iteration');  ylabel('Cost');  legend('binary cat','Location','NW');img =gcf;  %获取当前画图的句柄print(img, '-dpng', '-r600', './运行结果.png')         %即可得到对应格式和期望dpi的图像

3 仿真结果

【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码_第5张图片

【BP预测】基于猫群算法优化BP神经网络实现数据预测附matlab代码_第6张图片

4 参考文献

[1]王政宇, 王胜辉, 李潇潇, 赵音, & 田巍. (2022). 基于人工鱼群优化bp神经网络的光伏功率预测算法. 沈阳工程学院学报:自然科学版, 18(1), 6.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

你可能感兴趣的:(神经网络预测,matlab)