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

在这里插入图片描述


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=1Ns(dij)dij dij =dijxjxi
社会函数为:
s ( r ) = f e − r T − e − r s(r)=fe^{\frac{-r}{T}}-e^{-r} s(r)=feTrer
在这里插入图片描述
作者给出了一个示例,当距离小于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=1Nc2ubdlbds( xjdxid )dijxjxi)+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=cmaxlLcmaxcmin
伪代码
在这里插入图片描述

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.

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
蝗虫优化算法(Grasshopper Optimization Algorithm,简称GOA)是一种模拟自然界蝗虫觅食行为的启发式优化算法。它通过模拟蝗虫的个体行为和群体交互来求解问题的最优解。 GOA的基本思想是通过模拟蝗虫的觅食行为,使得蝗虫在全局搜索和局部搜索之间平衡,从而寻找到最优解。 算法的具体步骤如下: 1. 初始化蝗虫个体的位置和速度,并设置一些算法参数,如种群大小、进化代数等。 2. 计算蝗虫个体的适应度函数值。适应度函数是根据问题的具体情况来定义的,可以是目标函数值或问题的某种评价指标。 3. 根据蝗虫的适应度函数值来选择一定数量的蝗虫作为“领导者”,用于指导其他蝗虫的搜索行为。 4. 根据“领导者”和个体位置之间的距离和速度差异,更新蝗虫的速度和位置。 5. 判断是否满足停止算法的条件,如果满足则输出最优解,否则返回第2步。 6. 重复第2-5步,直到满足停止条件。 在Matlab中实现蝗虫优化算法的代码可以参考以下步骤: 1. 首先,定义问题的适应度函数,即目标函数或评价指标函数。 2. 定义算法的初始参数,包括种群大小、进化代数等。 3. 初始化蝗虫个体的位置和速度。 4. 计算个体的适应度函数值。 5. 根据适应度函数值选择“领导者”。 6. 根据“领导者”和个体位置之间的距离和速度差异,更新个体的速度和位置。 7. 判断是否满足停止算法的条件,如果满足则输出最优解,否则返回第4步。 具体的算法代码实现会依赖于具体的问题和问题的数学模型,对于不同的问题,Matlab的具体代码写法也会有所不同。在实际的应用中,可以根据具体问题的需求进行相应的改进和扩展,以提高算法的效果和适用性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小O的算法实验室

谢谢大佬的肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值