目录
1.背景2.算法原理2.1算法思想2.2算法过程
3.代码实现4.参考文献
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 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,:) 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_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.