1.背景
2017年,Saremi 受到蝗虫自然捕食行为启发,提出了蝗虫优化算法(Grasshopper Optimization Algorithm,GOA)。
2.算法原理
2.1算法思想
GOA模拟了蝗虫在自然界中的群体特性和觅食特性,主要分为探索和开发两个阶段。
2.2算法过程
蝗虫位置可以描述为:
X
i
=
S
i
+
G
i
+
A
i
X_i=S_i+G_i+A_i
Xi=Si+Gi+Ai
其中,
S
i
,
G
i
,
A
i
S_i,G_i,A_i
Si,Gi,Ai分别表示作用力,受到重力,受到风阻力。作用力可以表述为:
S
i
=
∑
j
=
1
N
s
(
d
i
j
)
d
i
j
^
d
i
j
^
=
x
j
−
x
i
d
i
j
S_i=\sum_{j=1}^Ns(d_{ij})\widehat{d_{ij}} \\ \widehat{d_{ij}}=\frac{x_{j}-x_{i}}{d_{ij}}
Si=j=1∑Ns(dij)dij
dij
=dijxj−xi
社会函数为:
s
(
r
)
=
f
e
−
r
T
−
e
−
r
s(r)=fe^{\frac{-r}{T}}-e^{-r}
s(r)=feT−r−e−r
作者给出了一个示例,当距离小于2.079时,此时蝗虫间为排斥力;当距离等于2.079时,此时为蝗虫舒适区(不采取动作);当距离大于2.079时,此时蝗虫间为吸引力(随距离增大,先增大后减小,最后趋近于0)。
但是当距离足够大时,作用力趋近于0,这里采取区间映射处理(映射到[1,4])。
重力可以表述为:
G
i
=
−
g
e
^
g
G_{i}=-g\widehat{e}_{g}
Gi=−ge
g
风阻力可以表述为:
A
i
=
u
e
w
^
A_i=u\widehat{e_w}
Ai=uew
通常情况下,当蝗虫群体达到舒适区时,它们仍然没有收敛到一个特定点。为了适应解决优化问题的需求,需要调整全局和局部优化过程,对模型进行修正:
X
i
d
=
c
(
∑
j
=
1
N
c
u
b
d
−
l
b
d
2
s
(
∣
x
j
d
−
x
i
d
∣
)
x
j
−
x
i
d
i
j
)
+
T
^
a
X_i^d=c\left(\sum_{j=1}^Nc\frac{ub_d-lb_d}{2}s(\left|x_j^d-x_i^d\right|)\frac{x_j-x_i}{d_{ij}}\right)+\widehat{T}_a
Xid=c(j=1∑Nc2ubd−lbds(
xjd−xid
)dijxj−xi)+T
a
其中,
c
c
c为控制因子,表述为:
c
=
c
m
a
x
−
l
c
m
a
x
−
c
m
i
n
L
c=cmax-l\frac{cmax-cmin}L
c=cmax−lLcmax−cmin
伪代码:
3.代码实现
% 蝗虫优化算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = GOA(pop, maxIter, lb, ub, dim,fobj)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优个体位置
flag=0;
if size(ub,1)==1
ub=ones(dim,1).*ub;
lb=ones(dim,1).*lb;
end
% 算法需要偶数维
if (rem(dim,2)~=0)
dim = dim+1;
ub(dim)=100;
lb(dim)=100;
flag=1;
end
%% 初始化函数
GrassHopperPositions=initialization(pop,dim,ub,lb);
GrassHopperFitness = zeros(1,pop);
Iter_curve=zeros(1,maxIter);
cMax=1;
cMin=0.00004;
%% 计算适应度函数
for i=1:size(GrassHopperPositions,1)
if flag == 1
GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,1:end-1));
else
GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,:));
end
end
[sorted_fitness,sorted_indexes]=sort(GrassHopperFitness);
for newindex=1:pop
Sorted_grasshopper(newindex,:)=GrassHopperPositions(sorted_indexes(newindex),:);
end
Best_pos=Sorted_grasshopper(1,:);
Best_fitness=sorted_fitness(1);
%% 迭代
l=2;
while l<maxIter+1
c=cMax-l*((cMax-cMin)/maxIter); % Eq.(2.8)
for i=1:size(GrassHopperPositions,1)
temp= GrassHopperPositions';
for k=1:2:dim
S_i=zeros(2,1);
for j=1:pop
if i~=j
Dist=distance(temp(k:k+1,j), temp(k:k+1,i));
r_ij_vec=(temp(k:k+1,j)-temp(k:k+1,i))/(Dist+eps); % xj-xi/dij in Eq.(2.7)
xj_xi=2+rem(Dist,2); % |xjd - xid| in Eq.(2.7)
s_ij=((ub(k:k+1) - lb(k:k+1))*c/2)*S_func(xj_xi).*r_ij_vec; %Eq. (2.7)
S_i=S_i+s_ij;
end
end
S_i_total(k:k+1, :) = S_i;
end
X_new = c * S_i_total'+ (Best_pos); % Eq.(2.7)
GrassHopperPositions_temp(i,:)=X_new';
end
GrassHopperPositions=GrassHopperPositions_temp;
for i=1:size(GrassHopperPositions,1)
% 边界检查
Tp=GrassHopperPositions(i,:)>ub';Tm=GrassHopperPositions(i,:)<lb';GrassHopperPositions(i,:)=(GrassHopperPositions(i,:).*(~(Tp+Tm)))+ub'.*Tp+lb'.*Tm;
if flag == 1
GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,1:end-1));
else
GrassHopperFitness(1,i)=fobj(GrassHopperPositions(i,:));
end
if GrassHopperFitness(1,i)<Best_fitness
Best_pos=GrassHopperPositions(i,:);
Best_fitness=GrassHopperFitness(1,i);
end
end
Iter_curve(l)=Best_fitness;
History_best{l} = Best_pos;
History_pos{l} = GrassHopperPositions;
l = l + 1;
end
if (flag==1)
Best_pos = Best_pos(1:dim-1);
end
end
%%
function d = distance(a,b)
d=sqrt((a(1)-b(1))^2+(a(2)-b(2))^2);
end
%%
function [X]=initialization(N,dim,up,down)
if size(up,1)==1
X=rand(N,dim).*(up-down)+down;
end
if size(up,1)>1
for i=1:dim
high=up(i);low=down(i);
X(:,i)=rand(1,N).*(high-low)+low;
end
end
end
%%
function o=S_func(r)
f=0.5;
l=1.5;
o=f*exp(-r/l)-exp(-r); % Eq. (2.3)
end
4.参考文献
[1] Saremi S, Mirjalili S, Lewis A. Grasshopper optimisation algorithm: theory and application[J]. Advances in engineering software, 2017, 105: 30-47.