1.背景
2019年,Gaurav等人受到海鸥迁徙-捕食自然行为影响,提出了海鸥优化算法(Seagull Optimization Algorithm,SOA)。
2.算法原理
2.1算法思想
海鸥具有两个最重要特点迁徙与捕食,迁徙被定义为海鸥季节性地从一个地方移动到另一个地方,以寻找最丰富、最充足的食物来源,以提供足够的能量。迁徙行为描述如下:
- 在迁徙过程中,它们成群结队旅行。海鸥的初始位置不同,以避免彼此碰撞
- 在群体中,海鸥可以朝着适应能力最强的方向前进(适应度函数度量)
- 基于适应能力最强的海鸥,其他海鸥可以更新它们的初始位置
海鸥经常在迁徙过程中从一处迁徙到另一处时袭击海上的迁徙鸟类,它们在攻击时可以做出螺旋自然形状的运动。
2.2算法过程
群体位置初始化:
x
=
l
b
+
r
a
n
d
∗
(
u
b
−
l
b
)
x=lb+rand*(ub-lb)
x=lb+rand∗(ub−lb)
其中,
u
b
,
l
b
ub,lb
ub,lb分别代表海鸥上下位置边界。
迁徙阶段:
C
s
⃗
=
A
×
P
s
⃗
(
x
)
A
=
f
c
−
(
t
∗
(
f
c
/
M
a
x
i
t
e
r
a
t
i
o
n
)
)
\vec{C_s}=A\times\vec{P_s}(x) \\ A=f_c-(t*(f_c/Max_{iteration}))
Cs=A×Ps(x)A=fc−(t∗(fc/Maxiteration))
其中,
C
s
⃗
,
A
\vec{C_s},A
Cs,A分别表示表示不与其他海鸥存在位置冲突的新位置和海鸥在搜索空间中的移动行为(线性递减,控制算法收敛)。
满足与其他海鸥碰撞同时,海鸥受最优海鸥位置影响:
M
s
⃗
=
B
×
(
P
b
s
⃗
(
x
)
−
P
s
⃗
(
x
)
)
\vec{M_s}=B\times(\vec{P_{bs}}(x)-\vec{P_{s}}(x))
Ms=B×(Pbs(x)−Ps(x))
这里参数
B
B
B平衡全局与局部搜索:
B
=
2
×
A
2
×
r
d
B=2\times A^{2}\times rd
B=2×A2×rd
最终,迁徙方向可以描述为:
D
s
⃗
=
∣
C
s
⃗
+
M
s
⃗
∣
\vec{D_s}=\mid\vec{C_s}+\vec{M_s}\mid
Ds=∣Cs+Ms∣
捕食阶段:
捕食阶段旨在利用搜索过程的历史和经验,海鸥可以在迁徙过程中持续改变攻击角度以及速度。在攻击猎物时,它们在空中展开螺旋运动行为:
{
x
=
r
c
o
s
(
θ
)
y
=
r
s
i
n
(
θ
)
z
=
r
θ
r
=
u
×
e
θ
v
\left.\left\{\begin{aligned}x&=rcos(\theta)\\y&=rsin(\theta)\\z&=r\theta\\r&=u\times e^{\theta v}\end{aligned}\right.\right.
⎩
⎨
⎧xyzr=rcos(θ)=rsin(θ)=rθ=u×eθv
捕食位置更新:
P
s
⃗
(
x
)
=
(
D
s
⃗
×
x
×
y
×
z
)
+
P
b
s
⃗
(
x
)
\vec{P_s}(x)=(\vec{D_s}\times x\times y\times z)+\vec{P_{bs}}(x)
Ps(x)=(Ds×x×y×z)+Pbs(x)
伪代码:
3.代码实现
% 海鸥优化算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = SOA(pop, dim, ub, lb, fobj, maxIter)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优位置
%% 初始化种群
Positions = zeros(pop,dim);
for i = 1:pop
for j = 1:dim
Positions(i,j) = rand * (ub(j) - lb(j)) + lb(j);
end
end
%% 记录
Iter_curve=zeros(1,maxIter);
Best_pos=zeros(1,dim);
Best_fitness=inf;
%% 迭代
l=0;
while l<maxIter
for i=1:size(Positions,1)
% 边界检查
Flag4Upper_bound=Positions(i,:)>ub;
Flag4Lower_bound=Positions(i,:)<lb;
Positions(i,:)=(Positions(i,:).*(~(Flag4Upper_bound+Flag4Lower_bound)))+ub.*Flag4Upper_bound+lb.*Flag4Lower_bound;
fitness=fobj(Positions(i,:));
if fitness<Best_fitness
Best_fitness=fitness;
Best_pos=Positions(i,:);
end
end
Fc=2-l*((2)/maxIter);
for i=1:size(Positions,1)
for j=1:size(Positions,2)
r1=rand();
r2=rand();
A1=2*Fc*r1-Fc;
C1=2*r2;
b=1;
ll=(Fc-1)*rand()+1;
D_alphs=Fc*Positions(i,j)+A1*((Best_pos(j)-Positions(i,j)));
X1=D_alphs*exp(b.*ll).*cos(ll.*2*pi)+Best_pos(j);
Positions(i,j)=X1;
end
end
l=l+1;
Iter_curve(l)=Best_fitness;
History_pos{l} = Positions;
History_best{l} = Best_pos;
end
4.参考文献
[1] Dhiman G, Kumar V. Seagull optimization algorithm: Theory and its applications for large-scale industrial engineering problems[J]. Knowledge-based systems, 2019, 165: 169-196.