目录
0 引言
海马算法(Sea Horse Optimizer,SHO)是Shijie Zhao于2023年基于自然界中海马的运动、捕食和繁殖行为提出的群体智能算法。SHO算法两个阶段,SHO分别模拟了海马的不同运动模式和概率捕食机制。此外算法设计为在保持雌雄较好信息的同时繁殖后代,有利于增加种群多样性。
1 数学模型
SOS数学模型主要对海马的运动、捕食和繁殖进行构建模型。而海马的运动模式分为受海洋涡旋作用影响的浮动螺旋模式和沿当前波的漂移模式。对于捕食策略模拟了海马以一定的概率捕获猎物的成败。繁殖阶段保持正信息的情况下进行后代繁殖。
1)初始化:SHO作为群智能算法,也是从总体初始化开始,采用随机参数进行产生种群位置。
式中Xi为海马种群位置,pop为种群数量,Dim为问题维度,LB,UB为问题维度边界,Xelite为精英海马个体,为适应度最小海马,f(*)为海马*对应的适应度。
2)海马的运动行为:海马运动行为主要有俩种:受海洋涡旋作用影响的浮动螺旋模式和沿当前波的漂移模式,数学模型分别以加入莱维飞行策略和布朗运动来模拟,其数学模型如下:
2.1)受海洋涡旋作用影响的浮动螺旋模式:式中Levy为莱维飞行分布函数,s为固定常数0.001,w,k为0到1的随机数,入为0到2的随机数,Γ为阶乘,xyz为三维搜索向量,分别为x=ρ×cos(θ), y=ρ×sin(θ) 和z=ρ×θ。
2.2)沿当前波的漂移模式:式中l为常数系数0.05,β为布朗运动的随机游走系数,符合正态分布。
下图是二者运动趋势:
3)海马捕食行为:海马捕食浮游动物和小型甲壳类动物有两种结果:成功和失败。考虑到海马成功捕获食物的概率超过90%,我们设计了SHO的随机数r2来区分这两个结果,如下:
式中α随迭代而线性减少,以调整海马的移动步长,t为当前迭代,T为最大迭代,r2为0到1的随机数
4)海马的繁殖行为:海马通过适合度值将其分为男性和女性组。雄性和雌性被随机交配以产生新的后代,如下:
2 优化方式
前篇对BP神经网络原理讲解(BP神经网络原理及matlab代码-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述SHO原理介绍,可以将BP神经网络权值和阈值作为海马种群位置,每一个种群位置对应BP神经网络的预测值,将这个预测值作为适应度更新上述海马进行运动,捕食和繁殖行为,产生更多优势个体位置。
3 Maltab代码
3.1 伪代码
3.2 SHO主函数代码
%% 参数
% initialization 初始化函数
% pop 种群大小
% Dim 问题维度
% UB,LB 问题维度边界
% Max_iter 最大迭代次数
% levy 飞行策略函数
% SYD 适应度函数
% 初始化
Sea_horses=initialization(pop,Dim,UB,LB);%海马种群
Sea_horsesFitness = zeros(1,pop);
fitness_history=zeros(pop,Max_iter);
population_history=zeros(pop,Dim,Max_iter);
Convergence_curve=zeros(1,Max_iter);
Trajectories=zeros(pop,Max_iter);
%计算初始海马的体能(适应度)
for i=1:pop
Sea_horsesFitness(1,i)=SYD(Sea_horses(i,:),net);
net.trainParam.showWindow = 0;
fitness_history(i,1)=Sea_horsesFitness(1,i);
population_history(i,:,1)=Sea_horses(i,:);
Trajectories(:,1)=Sea_horses(:,1);
end
%找出初始种群中最优秀的海马
[~,sorted_indexes]=sort(Sea_horsesFitness);
Position=Sea_horses(sorted_indexes(1),:);
Fitness = Sea_horsesFitness(sorted_indexes(1));
Convergence_curve(1)=Fitness;
% 参数
t=1;
u=0.05;%螺旋常数
v=0.05;%螺旋常数
l=0.05;%常数系数
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
1)单输出回归预测:单输出回归预测:海马算法优化BP神经网络模型(SHO-BP)
2)多输出回归预测:私信
3)分类模型:私信
4)时间序列:私信
4 视频讲解
B站搜索:‘ 不想学习的陈成 ’