【预测模型】基于蝗虫算法优化BP神经网络实现数据预测matlab代码

1 简介

随着现代居民居住地愈发集中,供水管网规模不断扩大,水资源供给面临着新的困难和挑战.其中包括水资源调度时的动态变化,管网的突发故障,水资源的不可控流失以及多目标和计算量庞大等问题.BP神经网络因拥有较强的自学习能力和泛化能力而被广泛应用于水资源预测问题中,但其也存在收敛速度慢,容易陷入局部极值的问题.群智能算法作为一种寻优算法,具有操作简单,收敛速度快,全局寻优能力强等优点.为提高BP神经网络在水资源预测方面的收敛速度和预测精度,提出一种基于蝗虫算法优化的BP神经网络水资源需求预测模型,,再通过BP神经网络采用GOA算法输出的最优权值,阈值作为初始参数值训练模型.实验验证GOA-BP神经网络方法相比传统BP方法在预测精度方面有更优的表现.

具体模型参考底下文献。

2 部分代码

function [TargetFitness, TargetPosition, Convergence_curve] = SC_MGOA(N, Max_iter, lb,ub, dim, fobj)

UB = ub;
LB = lb;
D = dim;
flag = 0;
if size(ub, 1)==1
   ub = ones(dim,1)*ub;
   lb = ones(dim,1)*lb;
end

if (rem(dim,2)~=0)      % 此算法应使用偶数个变量运行。这一行用来处理奇数个变量
   dim = dim+1;
   ub = [ub; 100];
   lb = [lb; -100];
   flag = 1;
end

%% 初始化蝗虫种群
GrassHopperPositions = initialization(N, dim, ub, lb);
GrassHopperFitness = zeros(1, N);

fitness_history = zeros(N, Max_iter);
position_history = zeros(N, Max_iter, dim);
Convergence_curve = zeros(1, Max_iter);
Trajectories = zeros(N, Max_iter);

mu = 0.01;
a = 2;
cMax = 1;
cMin = 0.00004;
% 计算初始种群的适应度值
for i = 1:size(GrassHopperPositions, 1)
   if flag == 1        % 奇数个变量,最后一维变量不参加计算
       GrassHopperFitness(i)=fobj(GrassHopperPositions(i, 1:end-1));
   else
       GrassHopperFitness(i) = fobj(GrassHopperPositions(i, :));
   end
end

[sorted_fitness, sorted_indexes] = sort(GrassHopperFitness);

% 找到第一代最优个体
for newindex = 1:N
   Sorted_grasshopper(newindex, :) = GrassHopperPositions(sorted_indexes(newindex),:);
end

TargetPosition = Sorted_grasshopper(1, :);
TargetFitness = sorted_fitness(1);

%% 迭代寻优
l = 2; 
while l < Max_iter+1
   Pv = exp(mu*(l/Max_iter)^3);
   R1 = a*l/Max_iter*cos((pi*l)^3);
   beta = exp(1-l/Max_iter)^(-exprnd(N)*l);
   
   c = cMax-l*((cMax-cMin)/Max_iter);      % Eq. (2.8) in the paper
   
   if rand < Pv
       %% 融入正弦余弦算法
       for i = 1:N
           for j = 1:dim
               % 由Eq. (3.3)更新r2,r3,r4
               r2 = (2*pi)*rand();
               r3 = 2*rand;
               r4 = rand();
               
               % Eq. (3.3)
               if r4 < 0.5
                   % Eq. (3.1)
                   GrassHopperPositions(i, j) =  beta*GrassHopperPositions(i, j)+(R1*sin(r2)*abs(r3*TargetPosition(j)-GrassHopperPositions(i, j)));
               else
                   % Eq. (3.2)
                   GrassHopperPositions(i, j) = beta*GrassHopperPositions(i, j)+(R1*cos(r2)*abs(r3*TargetPosition(j)-GrassHopperPositions(i, j)));
               end
           end
       end
   else
       for i = 1:size(GrassHopperPositions,1)
           temp = GrassHopperPositions';
           for k = 1:2:dim
               S_i = zeros(2, 1);
               for j = 1:N
                   if i ~= j
                       Dist = distance(temp(k:k+1, j), temp(k:k+1, i));        % 计算两蝗虫个体位置的距离
                       
                       r_ij_vec = (temp(k:k+1, j)-temp(k:k+1, i))/(Dist+eps);    % (xj-xi)/dij in Eq. (2.7)
                       xj_xi = 2+rem(Dist, 2);        % |xjd - xid| in Eq. (2.7)
                       
                       s_ij = ((ub(k:k+1) - lb(k:k+1))*c/2)*S_func(xj_xi).*r_ij_vec;   % The first part inside the big bracket in Eq. (2.7)
                       S_i = S_i+s_ij;
                   end
               end
               S_i_total(k:k+1, :) = S_i;
           end
           X_new = c * S_i_total'+ (TargetPosition);       % Eq. (2.7) in the paper
           GrassHopperPositions_temp(i, :) = X_new';
       end
       % 蝗虫位置
       GrassHopperPositions = GrassHopperPositions_temp;
   end
   for i = 1:size(GrassHopperPositions,1)
       % 边界处理
       Tp = GrassHopperPositions(i, :)>ub';
       Tm = GrassHopperPositions(i, :)<lb';
       GrassHopperPositions(i, :) = (GrassHopperPositions(i, :).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;
       
       % 计算适应度值
       if flag == 1
           GrassHopperFitness(i) = fobj(GrassHopperPositions(i, 1:end-1));
       else
           GrassHopperFitness(i) = fobj(GrassHopperPositions(i, :));
       end       
       % 更新目标值
       if GrassHopperFitness(i) < TargetFitness
           TargetPosition = GrassHopperPositions(i, :);
           TargetFitness = GrassHopperFitness(i);
       end
   end
   %% 目标位置的变异选择
   Pm = TargetFitness-log10(l/Max_iter)^3;
   if rand < Pm
       for j = 1:D
           r = randperm(N);
           TargetPosition_new(j) = TargetPosition(j)+rand*GrassHopperPositions(r(1), j);
       end
       % 边界处理
       TargetPosition_new = max(TargetPosition_new, LB);
       TargetPosition_new = min(TargetPosition_new, UB);
       % 贪婪选择最优解
       if fobj(TargetPosition_new) < TargetFitness
           TargetFitness = fobj(TargetPosition_new);
           TargetPosition = TargetPosition_new;
       end
   end
   Convergence_curve(l) = TargetFitness;
   %% 显示每代优化结果
   display(['SC-MGOA:At iteration ', num2str(l), ' the best fitness is ', num2str(TargetFitness)]);
   
   l = l + 1;
end


if (flag == 1)
   TargetPosition = TargetPosition(1:dim-1);
end


3 仿真结果

4 参考文献

[1]苑严伟, 张小超, & 毛文华. (2009). 基于bp模型的蝗虫密度预测系统的研究. 农机化研究(5), 5.

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab科研辅导帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值