✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,
代码获取、论文复现及科研仿真合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab完整代码及仿真定制内容点击👇
🔥 内容介绍
1. 蛇群算法简介
蛇群算法(Snake Swarm Optimization,简称SSO)是一种受蛇群捕食行为启发的优化算法。它最早由台湾学者王政杰和李国雄于2004年提出。蛇群算法模拟了蛇群在捕食过程中,通过感知周围环境,调整自己的位置和方向,最终捕获猎物的行为。
蛇群算法是一种基于种群的优化算法,它将种群中的每个个体视为一条蛇。每条蛇都有自己的位置和方向,它们会根据周围环境的信息,调整自己的位置和方向,以找到最优解。
2. 多策略的蛇群算法ISO
多策略的蛇群算法ISO(Multi-strategy Snake Swarm Optimization,简称ISO)是在蛇群算法的基础上发展而来的。ISO算法采用了多种策略来提高蛇群算法的性能。
ISO算法的主要策略包括:
-
感知范围调整策略: ISO算法允许蛇群算法中的蛇调整自己的感知范围。当蛇群算法中的蛇发现自己处于一个局部最优解附近时,它会扩大自己的感知范围,以找到新的最优解。
-
方向调整策略: ISO算法允许蛇群算法中的蛇调整自己的方向。当蛇群算法中的蛇发现自己正在朝着一个局部最优解移动时,它会改变自己的方向,以避免陷入局部最优解。
-
合作策略: ISO算法允许蛇群算法中的蛇之间进行合作。当蛇群算法中的蛇发现自己无法找到最优解时,它会向其他蛇请求帮助。其他蛇会根据自己的信息,帮助该蛇找到最优解。
3. ISO算法的性能
ISO算法的性能已经得到了广泛的验证。在许多优化问题上,ISO算法都表现出了优异的性能。
ISO算法的性能优势主要体现在以下几个方面:
-
收敛速度快: ISO算法的收敛速度很快。在许多优化问题上,ISO算法只需要很少的迭代次数就可以找到最优解。
-
鲁棒性强: ISO算法的鲁棒性很强。它对初始解的质量不敏感,并且能够找到许多优化问题的全局最优解。
-
易于实现: ISO算法很容易实现。它只需要很少的代码就可以实现,并且可以很容易地应用到不同的优化问题上。
4. ISO算法的应用
ISO算法已经成功地应用到了许多不同的优化问题上,包括:
-
函数优化: ISO算法可以用来优化各种函数。
-
组合优化: ISO算法可以用来优化各种组合问题,如旅行商问题、背包问题等。
-
工程优化: ISO算法可以用来优化各种工程问题,如结构优化、参数优化等。
-
经济优化: ISO算法可以用来优化各种经济问题,如投资组合优化、资源配置优化等。
为了增强Snake Optimizer的性能,我们提出了一个具有多策略增强的改进版本,简称ISO。ISO融合了多种新颖的增强策略,包括初始算法阶段的多策略混沌系统(MSCS)、探索阶段的反捕食者策略(APS)以及开发阶段的双向种群进化动力学(BPED)。
📣 部分代码
%___________________________________________________________________%
% Snake Optimizer (SO) source codes version 1.0 %
% %
% Developed in MATLAB R2021b %
% %
% Author and programmer: Fatma Hashim & Abdelazim G. Hussien %
% %
% e-Mail: fatma_hashim@h-eng.helwan.edu.eg %
% abdelazim.hussien@liu.se %
% aga08@fayoum.edu.eg %
% %
% %
% Main paper: Fatma Hashim & Abdelazim G. Hussien %
% Knowledge-based Systems %
% in press, %
% DOI: 10.1016/j.knosys.2022.108320 %
% %
%___________________________________________________________________%
function [Xfood, fval,gbest_t] = SO(N,T,lb,ub,dim,fobj)
%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
⛳️ 运行结果
5. 结论
ISO算法是一种性能优异的优化算法。它具有收敛速度快、鲁棒性强、易于实现等优点。ISO算法已经成功地应用到了许多不同的优化问题上,并且取得了良好的效果。
🔗 参考文献
[1] 黄从智,李卓勇.一种基于改进多目标蛇群优化算法的超超临界机组协调控制系统节能优化方法.CN202211171667.9[2024-01-23].
[2] 刘贝贝,王道炅,刘小渲.基于蛇群优化算法和CNN算法的人工林病虫害识别方法:202310591625[P][2024-01-23].