蛇优化算法(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×(Xmax−Xmin)(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}
Nm≈N/2(2)
N
f
=
N
−
N
m
(3)
{N_f} = N - {N_m} \tag{3}
Nf=N−Nm(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(T−t)(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=c1∗exp(Tt−T)(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×((Xmax−Xmin)×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,m−frand,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×((Xmax−Xmin)×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,f−frand,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×(Xfood−Xi,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,f−Xi,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,m−Xi,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(fi−fbest,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(fi−fbest,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,m−fi,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,f−fi,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×(Xmax−Xmin)(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×(Xmax−Xmin)(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 算法伪代码
- 初始化种群规模 N N N,迭代次数 T T T,等
- 随机初始化种群: X i ( i = 1 , 2 , . . . , N ) X_i(i=1,2,...,N) Xi(i=1,2,...,N)
- 通过公式(2)和(3)将种群 N N N 划分为2个数量相等的组 N m N_m Nm 和 N f N_f Nf
- While t < T t<T t<T do
- For(i=1 to N)do
- For(j=1 to Dim)do
- 计算每组的适应度值 f i f_i fi
- 找到适应度最好的雄蛇 X b e s t , m X_{best,m} Xbest,m
- 找到适应度最好的雌蛇 X b e s t , f X_{best,f} Xbest,f
- 计算由公式(4)定义的温度 T e m p Temp Temp
- 计算由公式(5)定义的食物 Q Q Q
- If Q < 0.25 Q<0.25 Q<0.25 then
- 使用公式(6)和(8)进行探索
- Else If T e m p > 0.6 Temp>0.6 Temp>0.6 then
- 使用公式(10)进行开发
- Else
- If r a n d > 0.6 rand>0.6 rand>0.6 then
- 使用公式(11)和(12)进行斗争
- Else
- 使用公式(15)和(16)进行交配
- 使用公式(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
- End If
- End If
- End For
- End For
- t = t + 1 t=t+1 t=t+1
- End While
- 返回最优解( 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=1n∣xi∣+i=1∏n∣xi∣ | 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=1n−xisin(∣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)=4x12−2.1x14+31x16+x1x2−4x22+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