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.