今天为大家带来的智能算法是:蛇优化算法(Snake Optimizer, SO),该算法是Hashim, F. A.和 Hussien, A. G两位教授于2022年提出的优化算法,其算法灵感来蛇的觅食和繁殖行为和模式。
01 算法原理简述
模拟了蛇在不同温度、不同食物条件下的不同行为模式,进行最优值的寻找。 SO 算法的灵感来源于蛇的交配模式。只有在温度较低且食物可用的条件下,蛇才会发生交配行为;否则蛇只 会寻找食物或者吃现有的食物。基于此,将考虑蛇优化算法的搜索过程分为两个阶段,即勘探和开发。勘探模式发生在食物不足的情况下,在该模式下蛇种 群的每一个个体都会四处勘探寻找食物。如果食物充足,蛇将处于开发模式。在温度较高的情 况下,蛇会关注与吃可用的食物;而在温度下较低的情况 下,就会发生交配过程。在交配过程中,蛇种群可能会发 生战斗,雄性间会相互战斗以获得最佳的雌性,雌性亦然。待交配完成后,雌性就会产卵,并选择是否孵化来替代现 种群中最差的雄性和雌性个体,如下图所示。
算法流程图:
参考文献:[1]李圣涵,叶琳琳.基于蛇优化算法的Otsu图像分割方法[J].国外电子测量技术,2023,42(02):30-37.
02 算法效果展示
在CEC2005函数进行测试,种群个数设置为50,迭代次数为1000次,并与灰狼算法和粒子群算法进行比较。
浅浅分析一下蛇算法的曲线,在F1,F5,F10这种单目标优化的问题上,前期的搜索效果并不好,这个时候大家可以加上混沌映射的方法,增加粒子多样性,增强全局搜索能力,必然会有奇效。对于F10这样的优化问题,可以加一些黄金正弦或者莱维飞行的方式增强跳出局部最优解的能力。
关于莱维飞行,黄金正弦,混沌映射前期的文章已经讲了很多了,这一期就不给大家加了,想自己改进的小伙伴可以参考前期的这几个文章。融合黄金正弦,十种混沌映射,搞定!把把最优值,本文思路可用于所有智能算法的改进,基于改进莱维飞行和混沌映射(10种混沌映射随意切换)的金鹰优化算法,附matlab代码
03 蛇算法的完整代码,可直接复制
function [Xfood, fval,gbest_t] = SO(N,T,fobj, dim,lb,ub)
%initial
vec_flag=[1,-1];
Threshold=0.25;
Thresold2= 0.6;
C1=0.5;
C2=.05;
C3=2;
X=lb+rand(N,dim)*(ub-lb);
for i=1:N
fitness(i)=feval(fobj,X(i,:));
end
[GYbest, gbest] = min(fitness);
Xfood = X(gbest,:);
%Diving the swarm into two equal groups males and females
Nm=round(N/2);%eq.(2&3)
Nf=N-Nm;
Xm=X(1:Nm,:);
Xf=X(Nm+1:N,:);
fitness_m=fitness(1:Nm);
fitness_f=fitness(Nm+1:N);
[fitnessBest_m, gbest1] = min(fitness_m);
Xbest_m = Xm(gbest1,:);
[fitnessBest_f, gbest2] = min(fitness_f);
Xbest_f = Xf(gbest2,:);
for t = 1:T
Temp=exp(-((t)/T)); %eq.(4)
Q=C1*exp(((t-T)/(T)));%eq.(5)
if Q>1 Q=1; end
% Exploration Phase (no Food)
if Q<Threshold
for i=1:Nm
for j=1:1:dim
rand_leader_index = floor(Nm*rand()+1);
X_randm = Xm(rand_leader_index, :);
flag_index = floor(2*rand()+1);
Flag=vec_flag(flag_index);
Am=exp(-fitness_m(rand_leader_index)/(fitness_m(i)+eps));%eq.(7)
Xnewm(i,j)=X_randm(j)+Flag*C2*Am*((ub-lb)*rand+lb);%eq.(6)
end
end
for i=1:Nf
for j=1:1:dim
rand_leader_index = floor(Nf*rand()+1);
X_randf = Xf(rand_leader_index, :);
flag_index = floor(2*rand()+1);
Flag=vec_flag(flag_index);
Af=exp(-fitness_f(rand_leader_index)/(fitness_f(i)+eps));%eq.(9)
Xnewf(i,j)=X_randf(j)+Flag*C2*Af*((ub-lb)*rand+lb);%eq.(8)
end
end
else %Exploitation Phase (Food Exists)
if Temp>Thresold2 %hot
for i=1:Nm
flag_index = floor(2*rand()+1);
Flag=vec_flag(flag_index);
for j=1:1:dim
Xnewm(i,j)=Xfood(j)+C3*Flag*Temp*rand*(Xfood(j)-Xm(i,j));%eq.(10)
end
end
for i=1:Nf
flag_index = floor(2*rand()+1);
Flag=vec_flag(flag_index);
for j=1:1:dim
Xnewf(i,j)=Xfood(j)+Flag*C3*Temp*rand*(Xfood(j)-Xf(i,j));%eq.(10)
end
end
else %cold
if rand>0.6 %fight
for i=1:Nm
for j=1:1:dim
FM=exp(-(fitnessBest_f)/(fitness_m(i)+eps));%eq.(13)
Xnewm(i,j)=Xm(i,j) +C3*FM*rand*(Q*Xbest_f(j)-Xm(i,j));%eq.(11)
end
end
for i=1:Nf
for j=1:1:dim
FF=exp(-(fitnessBest_m)/(fitness_f(i)+eps));%eq.(14)
Xnewf(i,j)=Xf(i,j)+C3*FF*rand*(Q*Xbest_m(j)-Xf(i,j));%eq.(12)
end
end
else%mating
for i=1:Nm
for j=1:1:dim
Mm=exp(-fitness_f(i)/(fitness_m(i)+eps));%eq.(17)
Xnewm(i,j)=Xm(i,j) +C3*rand*Mm*(Q*Xf(i,j)-Xm(i,j));%eq.(15
end
end
for i=1:Nf
for j=1:1:dim
Mf=exp(-fitness_m(i)/(fitness_f(i)+eps));%eq.(18)
Xnewf(i,j)=Xf(i,j) +C3*rand*Mf*(Q*Xm(i,j)-Xf(i,j));%eq.(16)
end
end
flag_index = floor(2*rand()+1);
egg=vec_flag(flag_index);
if egg==1;
[GYworst, gworst] = max(fitness_m);
Xnewm(gworst,:)=lb+rand*(ub-lb);%eq.(19)
[GYworst, gworst] = max(fitness_f);
Xnewf(gworst,:)=lb+rand*(ub-lb);%eq.(20)
end
end
end
end
for j=1:Nm
Flag4ub=Xnewm(j,:)>ub;
Flag4lb=Xnewm(j,:)<lb;
Xnewm(j,:)=(Xnewm(j,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
y = feval(fobj,Xnewm(j,:));
if y<fitness_m(j)
fitness_m(j)=y;
Xm(j,:)= Xnewm(j,:);
end
end
[Ybest1,gbest1] = min(fitness_m);
for j=1:Nf
Flag4ub=Xnewf(j,:)>ub;
Flag4lb=Xnewf(j,:)<lb;
Xnewf(j,:)=(Xnewf(j,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
y = feval(fobj,Xnewf(j,:));
if y<fitness_f(j)
fitness_f(j)=y;
Xf(j,:)= Xnewf(j,:);
end
end
[Ybest2,gbest2] = min(fitness_f);
if Ybest1<fitnessBest_m
Xbest_m = Xm(gbest1,:);
fitnessBest_m=Ybest1;
end
if Ybest2<fitnessBest_f
Xbest_f = Xf(gbest2,:);
fitnessBest_f=Ybest2;
end
if Ybest1<Ybest2
gbest_t(t)=min(Ybest1);
else
gbest_t(t)=min(Ybest2);
end
if fitnessBest_m<fitnessBest_f
GYbest=fitnessBest_m;
Xfood=Xbest_m;
else
GYbest=fitnessBest_f;
Xfood=Xbest_f;
end
end
fval = GYbest;
end
获取完整代码方式:后台回复关键词获取。
关键词:TGDM827