Skip to content Skip to footer

【智能算法】蝗虫优化算法(GOA)原理及实现

目录

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∑N​s(dij​)dij​

​dij​

​=dij​xj​−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∑N​c2ubd​−lbd​​s(

​xjd​−xid​

​)dij​xj​−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.

Copyright © 2088 世界杯八强_2018年世界杯亚洲区预选赛 - nprny.com All Rights Reserved.
友情链接