一、鲸鱼优化算法WOA(代码获取:底部公众号)
鲸鱼优化算法(Whale Optimization Algorithm,WOA)是由Mirjalili等人于2016年提出的一种新型启发式优化算法。WOA算法的灵感来源于座头鲸的狩猎行为,作为群居哺乳动物,它们狩猎时会通过相互合作的方式对猎物实行围捕,鲸鱼在群体狩猎中有包围和驱赶两种行为,群体中的鲸鱼通过朝着其它鲸鱼移动以实现包围猎物,通过环形游动并喷出气泡形成气泡网以实现驱赶猎物,这种独特的狩猎方法被称为泡泡网觅食法。WOA算法的核心思想就是源于座头鲸特殊的泡泡网觅食法,通过随机或最佳搜索代理来模拟鲸鱼的围捕行为,通过螺旋来模拟泡泡网觅食的攻击机制,以此进行数学建模达到优化目的。WOA算法具有操作简单、调整参数少以及跳出局部最优能力强的优点。WOA的算法流程为:
(1)初始化WOA参数,包括初始化鲸鱼群体的规模、最大迭代次数、鲸鱼种群位置;
(2)计算鲸鱼群体的适应度,并根据适应度选择初始鲸鱼种群个数;
(3)计算个体适应度并选择当前最优位置;
(4)迭代更新下一代鲸鱼群体位置;
(5)达到终止条件,输出最优个体,即找到全局最优解。
二、WOA-BP预测模型建
WOA算法优化BP神经网络的初始权值阈值,从而建立稳定的WOA-BP预测模型,提高预测精度和泛化能力。具体过程如下:
(1)数据归一化,建立BP神经网络,确定拓扑结构并初始化网络的权值和阈值;
(2)初始化WOA参数,计算WOA算法的决策长度,选取均方误差作为优化的目标函数;
(3)设置算法停止准则,利用WOA优化BP神经网络的权值阈值参数;
(4)WOA算法优化后的最优权值阈值参数赋予BP神经网络,即输出最优的WOA-BP模型,利用WOA-BP进行训练和预测并与优化前的BP网络进行对比分析。
三、关键代码
%% 建立BP模型
net=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');
% 设置BP参数
net.trainParam.epochs=1000; % 训练次数
net.trainParam.lr=0.01; % 学习速率
net.trainParam.goal=0.00001; % 训练目标最小误差
net.trainParam.show=25; % 显示频率
net.trainParam.mc=0.01; % 动量因子
net.trainParam.min_grad=1e-6; % 最小性能梯度
net.trainParam.max_fail=6; % 最高失败次数
%% 设置WOA参数
popsize=30; %初始种群规模
maxgen=50; %最大进化代数
dim=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum; %自变量个数
lb=repmat(-3,1,dim); %自变量下限
ub=repmat(3,1,dim); %自变量上限
%初始化位置向量和领导者得分
Leader_pos=zeros(1,dim);
Leader_score=10^20;
%% 初始化种群
for i=1:dim
ub_i=ub(i);
lb_i=lb(i);
Positions(:,i)=rand(popsize,1).*(ub_i-lb_i)+lb_i;
end
curve=zeros(maxgen,1);%初始化收敛曲线
%% 进化过程
h0=waitbar(0,'WOA优化中...');
for t=1:maxgen
for i=1:size(Positions,1)%对每个个体一个一个检查是否越界
% 返回超出搜索空间边界的搜索代理
Flag4ub=Positions(i,:)>ub;
Flag4lb=Positions(i,:)<lb;
Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
fit(i)=fitness(Positions(i,:),inputnum,hiddennum_best,outputnum,net,inputn,outputn,output_train,inputn_test,outputps,output_test);
% 更新领导者位置
if fit(i)<Leader_score
Leader_score=fit(i);
Leader_pos=Positions(i,:);
end
end
a=2-t*((2)/maxgen);
a2=-1+t*((-1)/maxgen);
%参数更新
for i=1:size(Positions,1)
r1=rand();r2=rand();
A=2*a*r1-a;
C=2*r2;
b=1;
l=(a2-1)*rand+1;
p = rand();
for j=1:size(Positions,2)%对每一个个体地多维度进行循环运算
%收缩包围机制
if p<0.5
if abs(A)>=1
rand_leader_index = floor(popsize*rand()+1);
X_rand = Positions(rand_leader_index, :);
D_X_rand=abs(C*X_rand(j)-Positions(i,j));
Positions(i,j)=X_rand(j)-A*D_X_rand;
elseif abs(A)<1
D_Leader=abs(C*Leader_pos(j)-Positions(i,j));
Positions(i,j)=Leader_pos(j)-A*D_Leader;
end
elseif p>=0.5
distance2Leader=abs(Leader_pos(j)-Positions(i,j));
Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
end
end
end
curve(t)=Leader_score;
waitbar(t/maxgen,h0)
end
close(h0)
setdemorandstream(pi);
%% 权重阈值更新
w1=Leader_pos(1:inputnum*hiddennum_best);
B1=Leader_pos(inputnum*hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best);
w2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum);
B2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum);
% 矩阵重构
net.iw{1,1}=reshape(w1,hiddennum_best,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum_best);
net.b{1}=reshape(B1,hiddennum_best,1);
net.b{2}=reshape(B2,outputnum,1);
四、仿真结果
(1)根据经验公式,通过输入输出节点数量,求得最佳隐含层节点数量:
(2)WOA-BP和BP的预测对比图和误差图
(3)BP和WOA-BP的各项误差指标,预测准确率
(4)鲸鱼优化算法WOA适应度进化曲线
(5)BP和WOA-BP模型的回归图
(6)BP和WOA-BP模型的误差直方图
五、BP算法优化(代码获取:下方公众号)
BP算法优化 | |
遗传算法 GA-BP | 灰狼算法 GWO-BP |
鲸鱼算法 WOA-BP | 粒子群算法 PSO-BP |
麻雀算法 SSA-BP | 布谷鸟算法 CS-BP |