蛇优化算法(Snake Optimization,SO)(附Matlab代码,完整,免费)

一、算法灵感

  蛇优化算法(Snake Optimization, SO)是2022年提出的一种元启发式优化算法,其灵感来源于蛇的交配行为。如果温度低,且食物充足,那么蛇就会相互交配,否则,蛇只会去寻找食物或吃现有的食物。依靠这些信息,将整个过程分为探索和开发。探索和开发之间的切换受环境因素影响,即温度和食物。

二、算法介绍

2.1 初始化

  首先,SO会生成一个均匀分布的随机种群。初始种群可由以下公式求得:
X i = X min ⁡ + r a n d × ( X max ⁡ − X min ⁡ ) (1) {X_i} = {X_{\min }} + rand \times \left( {{X_{\max }} - \left. {{X_{\min }}} \right)} \right. \tag{1} Xi=Xmin+rand×(XmaxXmin)(1)其中, X i {X_i} Xi 表示第 i i i 个个体的位置, r a n d rand rand [ 0 , 1 ] [0,1] [0,1] 之间的随机数, X m i n {X_{min}} Xmin X m a x {X_{max}} Xmax 分别是问题的下界和上界。

2.2 划分种群

  假设种群分为两组:雄性种群和雌性种群,其数量各占一半。用下面的两个公式(2)和(3)来划分群体。
N m ≈ N / 2 (2) {N_m} \approx N/2 \tag{2} NmN/2(2) N f = N − N m (3) {N_f} = N - {N_m} \tag{3} Nf=NNm(3)其中, N N N 是种群中个体的数量, N m N_m Nm 指的是雄蛇数量, N f N_f Nf 指的是雌蛇数量。

2.3 定义温度和食物

  温度 T e m p Temp Temp 可以用下式定义。
T e m p = exp ⁡ ( − t T ) (4) Temp = \exp \left( {{{ - t} \over T}} \right) \tag{4} Temp=exp(Tt)(4)其中, t t t 为当前迭代次数, T T T 为最大迭代次数。
  食物量 Q Q Q 可用下式得到。
Q = c 1 ∗ exp ⁡ ( t − T T ) (5) Q = {c_1} * \exp \left( {{{t - T} \over T}} \right) \tag{5} Q=c1exp(TtT)(5)其中, c 1 c_1 c1 是常数,值为0.5。

2.4 食物不足时(探索阶段)

  如果食物不足(阈值为0.25),即 Q < 0.25 Q<0.25 Q<0.25 时,蛇通过选择任意随机的位置来寻找食物,并更新它们的位置。对探索阶段进行建模,如下:
X i , m ( t + 1 ) = X r a n d , m ( t ) ± c 2 × A m × ( ( X max ⁡ − X min ⁡ ) × r a n d + X min ⁡ ) (6) {X_{i,m}}\left( {t + 1} \right) = {X_{rand,m}}\left( t \right) \pm {c_2} \times {A_m} \times \left( {\left( {{X_{\max }} - {X_{\min }}} \right) \times rand + {X_{\min }}} \right) \tag{6} Xi,m(t+1)=Xrand,m(t)±c2×Am×((XmaxXmin)×rand+Xmin)(6)其中, X i , m X_{i,m} Xi,m 为第 i i i 条雄蛇的位置, X r a n d , m X_{rand,m} Xrand,m 为随机一条雄蛇的位置, A m A_m Am 为雄蛇寻找食物的能力,其计算公式如下:
A m = exp ⁡ ( − f r a n d , m f i , m ) (7) {A_m} = \exp \left( {{{ - {f_{rand,m}}} \over {{f_{i,m}}}}} \right) \tag{7} Am=exp(fi,mfrand,m)(7)其中, f r a n d , m f_{rand,m} frand,m X r a n d , m X_{rand,m} Xrand,m 的适应度值, f i , m f_{i,m} fi,m 是雄性种群中第 i i i 条蛇的适应度值, c 2 c_2 c2 是常数,值为0.05。
X i , f = X r a n d , f ( t + 1 ) ± c 2 × A f × ( ( X max ⁡ − X min ⁡ ) × r a n d + X min ⁡ ) (8) {X_{i,f}} = {X_{rand,f}}\left( {t + 1} \right) \pm {c_2} \times {A_f} \times \left( {\left( {{X_{\max }} - {X_{\min }}} \right) \times rand + {X_{\min }}} \right) \tag{8} Xi,f=Xrand,f(t+1)±c2×Af×((XmaxXmin)×rand+Xmin)(8)其中, X i , f X_{i,f} Xi,f 是第 i i i 条雌蛇的位置, X r a n d , f X_{rand,f} Xrand,f 是随机一条雌蛇的位置, A f A_f Af 为雌蛇寻找食物的能力,其计算公式如下:
A f = exp ⁡ ( − f r a n d , f f i , f ) (9) {A_f} = \exp \left( {{{ - {f_{rand,f}}} \over {{f_{i,f}}}}} \right) \tag{9} Af=exp(fi,ffrand,f)(9)其中, f r a n d , f f_{rand,f} frand,f X r a n d , f X_{rand,f} Xrand,f 的适应度值, f i , f f_{i,f} fi,f 是雌性种群中第 i i i 条蛇的适应度值

2.5 食物充足时(开发阶段)

  如果食物充足,且温度充足(阈值为0.6),即 Q > 0.25 Q>0.25 Q>0.25 T e m p > 0.6 Temp>0.6 Temp>0.6 时,蛇只会向食物移动。
X i , j ( t + 1 ) = X f o o d ± c 3 × T e m p × r a n d × ( X f o o d − X i , j ( t ) ) (10) {X_{i,j}}\left( {t + 1} \right) = {X_{food}} \pm {c_3} \times Temp \times rand \times \left( {{X_{food}} - {X_{i,j}}\left( t \right)} \right) \tag{10} Xi,j(t+1)=Xfood±c3×Temp×rand×(XfoodXi,j(t))(10)其中, X i , j X_{i,j} Xi,j 是个体(雄蛇或雌蛇)的位置, X f o o d X_{food} Xfood 是最优个体的位置, c 3 c_3 c3 是常数,值为2。
  如果食物充足,但温度不足,即 Q > 0.25 Q>0.25 Q>0.25 T e m p < 0.6 Temp<0.6 Temp<0.6 时,蛇将处于斗争模式或交配模式。

2.5.1 斗争模式

X i , m ( t + 1 ) = X i , m ( t ) ± c 3 × F M × r a n d × ( X b e s t , f − X i , m ( t ) ) (11) {X_{i,m}}\left( {t + 1} \right) = {X_{i,m}}\left( t \right) \pm {c_3} \times FM \times rand \times \left( {{X_{best,f}} - {X_{i,m}}\left( t \right)} \right) \tag{11} Xi,m(t+1)=Xi,m(t)±c3×FM×rand×(Xbest,fXi,m(t))(11)其中, X b e s t , f {X_{best,f}} Xbest,f 为雌性种群中最优个体的位置, F M FM FM 为雄蛇的战斗能力
X i , f ( t + 1 ) = X i , f ( t + 1 ) ± c 3 × F F × r a n d × ( X b e s t , m − X i , F ( t + 1 ) ) (12) {X_{i,f}}\left( {t + 1} \right) = {X_{i,f}}\left( {t + 1} \right) \pm {c_3} \times FF \times rand \times \left( {{X_{best,m}} - {X_{i,F}}\left( {t + 1} \right)} \right) \tag{12} Xi,f(t+1)=Xi,f(t+1)±c3×FF×rand×(Xbest,mXi,F(t+1))(12)其中, X b e s t , m {X_{best,m}} Xbest,m 为雄性种群中最优个体的位置, F F FF FF 为雌蛇的战斗能力。
   F M FM FM F F FF FF 的计算公式如下:
F M = exp ⁡ ( − f b e s t , f f i ) (13) FM = \exp \left( {{{ - {f_{best,f}}} \over {{f_i}}}} \right) \tag{13} FM=exp(fifbest,f)(13) F F = exp ⁡ ( − f b e s t , m f i ) (14) FF = \exp \left( {{{ - {f_{best,m}}} \over {{f_i}}}} \right) \tag{14} FF=exp(fifbest,m)(14)其中, f b e s t , f f_{best,f} fbest,f 为雌性种群中最优个体的适应度值, f b e s t , m f_{best,m} fbest,m 为雄性种群中最优个体的适应度值, f i f_i fi 为个体的适应度值

2.5.2 交配模式

X i , m ( t + 1 ) = X i , m ( t ) ± c 3 × M m × r a n d × ( Q × X i , f ( t ) − X i , m ( t ) ) (15) {X_{i,m}}\left( {t + 1} \right) = {X_{i,m}}\left( t \right) \pm {c_3} \times {M_m} \times rand \times \left( {Q \times {X_{i,f}}\left( t \right) - {X_{i,m}}\left( t \right)} \right) \tag{15} Xi,m(t+1)=Xi,m(t)±c3×Mm×rand×(Q×Xi,f(t)Xi,m(t))(15) X i , f ( t + 1 ) = X i , f ( t ) ± c 3 × M f × r a n d × ( Q × X i , m ( t ) − X i , f ( t ) ) (16) {X_{i,f}}\left( {t + 1} \right) = {X_{i,f}}\left( t \right) \pm {c_3} \times {M_f} \times rand \times \left( {Q \times {X_{i,m}}\left( t \right) - {X_{i,f}}\left( t \right)} \right) \tag{16} Xi,f(t+1)=Xi,f(t)±c3×Mf×rand×(Q×Xi,m(t)Xi,f(t))(16)其中, M m M_m Mm M f M_f Mf 分别为雄蛇和雌蛇的交配能力,其计算公式如下:
M m = exp ⁡ ( − f i , f f i , m ) (17) {M_m} = \exp \left( {{{ - {f_{i,f}}} \over {{f_{i,m}}}}} \right) \tag{17} Mm=exp(fi,mfi,f)(17) M f = exp ⁡ ( − f i , m f i , f ) (18) {M_f} = \exp \left( {{{ - {f_{i,m}}} \over {{f_{i,f}}}}} \right) \tag{18} Mf=exp(fi,ffi,m)(18)  如果蛋孵化,就用它们替换最差的雄蛇和雌蛇。
X w o r s t , m = X min ⁡ + r a n d × ( X max ⁡ − X min ⁡ ) (19) {X_{worst,m}} = {X_{\min }} + rand \times \left( {{X_{\max }} - {X_{\min }}} \right) \tag{19} Xworst,m=Xmin+rand×(XmaxXmin)(19) X w o r s t , f = X min ⁡ + r a n d × ( X max ⁡ − X min ⁡ ) (20) {X_{worst,f}} = {X_{\min }} + rand \times \left( {{X_{\max }} - {X_{\min }}} \right) \tag{20} Xworst,f=Xmin+rand×(XmaxXmin)(20)其中, X w o r s t , m X_{worst,m} Xworst,m 为雄性种群中的最差个体, X w o r s t , m X_{worst,m} Xworst,m 为雌性种群中的最差个体。

2.4 算法伪代码

  1. 初始化种群规模 N N N,迭代次数 T T T,等
  2. 随机初始化种群: X i ( i = 1 , 2 , . . . , N ) X_i(i=1,2,...,N) Xi(i=1,2,...,N)
  3. 通过公式(2)和(3)将种群 N N N 划分为2个数量相等的组 N m N_m Nm N f N_f Nf
  4. While t < T t<T t<T do
  5.   For(i=1 to N)do
  6.     For(j=1 to Dim)do
  7.       计算每组的适应度值 f i f_i fi
  8.       找到适应度最好的雄蛇 X b e s t , m X_{best,m} Xbest,m
  9.       找到适应度最好的雌蛇 X b e s t , f X_{best,f} Xbest,f
  10.       计算由公式(4)定义的温度 T e m p Temp Temp
  11.       计算由公式(5)定义的食物 Q Q Q
  12.       If Q < 0.25 Q<0.25 Q<0.25 then
  13.         使用公式(6)和(8)进行探索
  14.       Else If T e m p > 0.6 Temp>0.6 Temp>0.6 then
  15.         使用公式(10)进行开发
  16.       Else
  17.         If r a n d > 0.6 rand>0.6 rand>0.6 then
  18.           使用公式(11)和(12)进行斗争
  19.         Else
  20.           使用公式(15)和(16)进行交配
  21.           使用公式(19)和(20)替换掉位置最差的雄蛇 X w o r s t , m X_{worst,m} Xworst,m 和雌蛇 X w o r s t , f X_{worst,f} Xworst,f
  22.         End If
  23.       End If
  24.     End For
  25.   End For
  26.    t = t + 1 t=t+1 t=t+1
  27. End While
  28. 返回最优解( X f o o d X_{food} Xfood)

三、实验结果

SO在23个经典测试函数(设置维度 d i m = 30 dim=30 dim=30)的F2、F8、F16中的收敛曲线,测试函数公式如下:

函数公式理论值
F2 F 2 ( x ) = ∑ i = 1 n ∣ x i ∣ + ∏ i = 1 n ∣ x i ∣ {F_2}(x) = \sum\nolimits_{i = 1}^n {\left| {{x_i}} \right|} + \prod _{i = 1}^n\left| {{x_i}} \right| F2(x)=i=1nxi+i=1nxi 0.00 0.00 0.00
F8 F 8 ( x ) = ∑ i = 1 n − x i sin ⁡ ( ∣ x i ∣ ) {F_8}(x) = \sum\nolimits_{i = 1}^n { - {x_i}\sin (\sqrt {|{x_i}|} )} F8(x)=i=1nxisin(xi ) − 418.9829 × d i m -418.9829×dim 418.9829×dim
F16 F 16 ( x ) = 4 x 1 2 − 2.1 x 1 4 + 1 3 x 1 6 + x 1 x 2 − 4 x 2 2 + x 2 4 {F_{16}}(x) = 4x_1^2 - 2.1x_1^4 + {1 \over 3}x_1^6 + {x_1}{x_2} - 4x_2^2 + x_2^4 F16(x)=4x122.1x14+31x16+x1x24x22+x24 − 1.0316 -1.0316 1.0316

3.1 F2收敛曲线

在这里插入图片描述

3.2 F8收敛曲线

在这里插入图片描述

3.3 F16收敛曲线

在这里插入图片描述

四、Matlab代码

代码在资源中,可自行免费下载。
快速跳转:RSA源代码
     SO源代码
     SCSO源代码

五、参考文献

[1] 贾鹤鸣, 智能优化算法及 MATLAB 实现[M], 清华大学出版社, 2024。
[2] Hashim F,Hussien A. Snake optimizer: a novel meta-heuristic optimization algorithm[J]. Knowledge-Based Systems, 2022, 242, 108-320

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
双层优化算法是一种用于解决多目标优化问题的方法,它将优化问题划分成两个层次:上层和下层。 在上层,我们定义一个目标函数来最小化或最大化一些参数,这些参数是在下层的子问题中定义的。在下层的子问题中,我们通过优化一组约束条件来获得结果,这些约束条件来自于上层定义的优化目标函数。 双层优化算法的优点是能够同时考虑多个目标函数,且在解决高维问题时表现出色。在实现过程中,可以使用各种方法来构建优化函数和约束条件,并采用不同的求解技术来获得最优解。 下面是一个基于双层优化算法的多目标优化问题的MATLAB代码: %Step 1: Set up the upper level optimization problem x0 = [0.5; 0.5]; %Initial guess for x variable options = optimoptions('fmincon','Display','iter','Algorithm','sqp'); %Set options for optimizer [obj_upper, obj_lower] = evalUpperLevelObj(x0); %Evaluate objective function for upper level lower_level = @(y)evalLowerLevelObj(y,obj_upper); %Define lower level objective function nonlcon_lower = @(y)evalLowerLevelConstraints(y,obj_upper); %Define lower level constraint function %Step 2: Solve the lower level optimization problem Y = fmincon(lower_level,[0;0],[],[],[],[],[],[],nonlcon_lower,options); %Solve the lower level problem using fmincon %Step 3: Evaluate the upper level objective function using results of lower level problem [obj_upper,obj_lower] = evalUpperLevelObj(Y); %Evaluate the upper level objective function %Step 4: Repeat steps 2-3 until convergence is achieved while abs(obj_upper-obj_upper_prev)>0.01 %Convergence criterion obj_upper_prev = obj_upper; %Save previous upper level objective function value Y = fmincon(lower_level,[0;0],[],[],[],[],[],[],nonlcon_lower,options); %Solve lower level problem again [obj_upper,obj_lower] = evalUpperLevelObj(Y); %Evaluate upper level objective function again end function [obj_upper,obj_lower] = evalUpperLevelObj(x) %Upper level objective function obj_upper = [x(1).^2+x(2).^2; (x(1)-1).^2+x(2).^2]; %Two objectives (minimize both) obj_lower = []; %No lower level objective function end function [obj_lower] = evalLowerLevelObj(y,obj_upper) %Lower level objective function obj_lower = [y(1).^2+y(2).^2-obj_upper(1); (y(1)-1).^2+y(2).^2-obj_upper(2)]; %Two constraints (less than zero) end function [c,ceq] = evalLowerLevelConstraints(y,obj_upper) %Lower level constraint function c = []; %No inequality constraints ceq = [y(1)+y(2)-obj_upper(1); y(1)*y(2)-obj_upper(2)]; %Two equality constraints (equal to zero) end 以上是一段简单的实现,可以根据实际问题和具体的优化目标进行修改和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值