【智能算法】哈里斯鹰算法(HHO)原理及实现

在这里插入图片描述


1.背景

2019年,Heidari 等人受到哈里斯鹰捕食行为启发,提出了哈里斯鹰算法(Harris Hawk Optimization, HHO)。

2.算法原理

2.1算法思想

在这里插入图片描述

根据哈里斯鹰特性,HHO分为探索-过渡-开发三个阶段。

2.2算法过程

探索
哈里斯鹰以其强大的视力追踪和检测猎物,但有时猎物不易察觉。它们会在沙漠地区等待、观察和监视,可能需要几个小时才能发现猎物。哈里斯鹰会随机停歇在某些位置,并等待检测猎物,使用两种策略:当 q < 0.5 q<0.5 q<0.5时根据其他家庭成员和猎物的位置进行停歇;当 q ≥ 0.5 q \ge 0.5 q0.5时停歇在随机的高树上。
X ( t + 1 ) = { X r a n d ( t ) − r 1 ∣ X r a n d ( t ) − 2 r 2 X ( t ) ∣ q ≥ 0.5 ( X r a b b i t ( t ) − X m ( t ) ) − r 3 ( L B + r 4 ( U B − L B ) ) q < 0.5 X(t+1)=\begin{cases}X_{rand}(t)-r_1|X_{rand}(t)-2r_2X(t)|&q\ge0.5\\(X_{rabbit}(t)-X_m(t))-r_3(LB+r_4(UB-LB))&q<0.5\end{cases} X(t+1)={Xrand(t)r1Xrand(t)2r2X(t)(Xrabbit(t)Xm(t))r3(LB+r4(UBLB))q0.5q<0.5
其中, X r a n d ( t ) , X r a b b i t ( t ) , X m ( t ) X_{rand}(t),X_{rabbit}(t),X_m(t) Xrand(t),Xrabbit(t),Xm(t)分别为随机个体位置,猎物位置(当前适应度最优)和群体平均位置。
过渡
过渡阶段根据猎物的逃逸能量之间切换不同的开发利用行为。在猎物逃逸行为期间,猎物的能量会大幅下降,表述为:
E = 2 E 0 ( 1 − t T ) E=2E_{0}(1-\frac{t}{T}) E=2E0(1Tt)
在迭代过程中,动态逃逸能量 E E E呈下降趋势。当逃逸能量 E ≥ 1 E \ge 1 E1时,哈里斯鹰会搜索不同的区域中的猎物(全局探索);当 E < 1 E<1 E<1时,哈里斯鹰搜索猎物周围(局部探索)。
开发
开发阶段较为复杂,文章中提出了四种捕食策略。首先,根据猎物是否逃脱这里由参数 r r r判定;哈里斯鹰采取软、硬进攻方式这里根据参数 E E E判定。
猎物未成功逃脱,软进攻方式
X ( t + 1 ) = ( X r a b b i t ( t ) − X ( t ) ) − E ∣ J X r a b b i t ( t ) − X ( t ) ∣ , 0.5 ≤ ∣ E ∣ < 1 , r ≥ 0.5 X(t+1)=(X_{rabbit}(t)-X(t))-E|JX_{rabbit}(t)-X(t)|,0.5\leq|E|<1,r\geq0.5 X(t+1)=(Xrabbit(t)X(t))EJXrabbit(t)X(t),0.5E<1,r0.5
猎物未成功逃脱,硬进攻方式
X ( t + 1 ) = X r a b b i t ( t ) − E ∣ Δ X ( t ) ∣ , ∣ E ∣ < 0.5 , r ≥ 0.5 X(t+1)=X_{rabbit}(t)-E|\Delta X(t)|,|E|<0.5,r\geq0.5 X(t+1)=Xrabbit(t)E∣ΔX(t),E<0.5,r0.5
猎物成功逃脱,软进攻方式
X ( t + 1 ) = { Y , f ( Y ) < f ( X ( t ) ) Z , f ( Z ) < f ( X ( t ) ) Y = X r a b b i t ( t ) − E ∣ J X r a b b i t ( t ) − X ( t ) ∣ Z = Y + S ∗ L F ( D ) , 0.5 ≤ ∣ E ∣ < 1 , r > 0.5 X(t+1)=\begin{cases}Y,f(Y)<f(X(t))\\Z,f(Z)<f(X(t))\end{cases} \\ Y=X_{rabbit}\left(t\right)-E|JX_{rabbit}\left(t\right)-X(t)|\\Z=Y+S*LF(D),0.5\leq|E|<1,r>0.5 X(t+1)={Y,f(Y)<f(X(t))Z,f(Z)<f(X(t))Y=Xrabbit(t)EJXrabbit(t)X(t)Z=Y+SLF(D),0.5E<1,r>0.5
猎物成功逃脱,软进攻方式
X ( t + 1 ) = { Y , f ( Y ) < f ( X ( t ) ) Z , f ( Z ) < f ( X ( t ) ) Y = X r a b b i t ( t ) − E ∣ J X r a b b i t ( t ) − X m ( t ) ∣ Z = Y + S ∗ L F ( D ) , ∣ E ∣ < 0.5 , r > 0.5 X(t+1)=\begin{cases}Y,f(Y)<f(X(t))\\Z,f(Z)<f(X(t))\end{cases} \\ Y=X_{rabbit}\left(t\right)-E|JX_{rabbit}\left(t\right)-X_m(t)|\\Z=Y+S*LF(D),|E|<0.5,r>0.5 X(t+1)={Y,f(Y)<f(X(t))Z,f(Z)<f(X(t))Y=Xrabbit(t)EJXrabbit(t)Xm(t)Z=Y+SLF(D),E<0.5,r>0.5
其中, L F LF LF表示莱维飞行。
伪代码
在这里插入图片描述

3.代码实现

% 哈里斯鹰算法
function [Best_pos, Best_fitness, Iter_curve, History_pos, History_best] = HHO(pop, maxIter,lb,ub,dim,fobj)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优位置
%% 初始化种群
X = zeros(pop, dim);
for i = 1:dim
    X(:,i) = rand(pop,1) * (ub(i) - lb(i)) + lb(i);
end
%% 记录
Best_pos=zeros(1,dim);
Best_fitness=inf;
Iter_curve=zeros(1,maxIter);
%% 迭代
t=0; 
while t<maxIter
    for i=1:size(X,1)
        % 边界检查
        FU=X(i,:)>ub;FL=X(i,:)<lb;X(i,:)=(X(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;
        fitness=fobj(X(i,:));
        if fitness<Best_fitness
            Best_fitness=fitness;
            Best_pos=X(i,:);
        end
    end
    
    E1=2*(1-(t/maxIter)); 
    for i=1:size(X,1)
        E0=2*rand()-1; %-1<E0<1
        Escaping_Energy=E1*(E0);  
        
        if abs(Escaping_Energy)>=1
            q=rand();
            rand_Hawk_index = floor(pop*rand()+1);
            X_rand = X(rand_Hawk_index, :);
            if q<0.5
                X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*X(i,:));
            elseif q>=0.5
                X(i,:)=(Best_pos(1,:)-mean(X))-rand()*((ub-lb)*rand+lb);
            end
            
        elseif abs(Escaping_Energy)<1
            r=rand();
            
            if r>=0.5 && abs(Escaping_Energy)<0.5 
                X(i,:)=(Best_pos)-Escaping_Energy*abs(Best_pos-X(i,:));
            end
            
            if r>=0.5 && abs(Escaping_Energy)>=0.5  
                Jump_strength=2*(1-rand()); 
                X(i,:)=(Best_pos-X(i,:))-Escaping_Energy*abs(Jump_strength*Best_pos-X(i,:));
            end
            
            if r<0.5 && abs(Escaping_Energy)>=0.5 
                
                Jump_strength=2*(1-rand());
                X1=Best_pos-Escaping_Energy*abs(Jump_strength*Best_pos-X(i,:));
                
                if fobj(X1)<fobj(X(i,:)) 
                    X(i,:)=X1;
                else
                    X2=Best_pos-Escaping_Energy*abs(Jump_strength*Best_pos-X(i,:))+rand(1,dim).*Levy(dim);
                    if (fobj(X2)<fobj(X(i,:))) 
                        X(i,:)=X2;
                    end
                end
            end
            
            if r<0.5 && abs(Escaping_Energy)<0.5 
                Jump_strength=2*(1-rand());
                X1=Best_pos-Escaping_Energy*abs(Jump_strength*Best_pos-mean(X));
                
                if fobj(X1)<fobj(X(i,:)) 
                    X(i,:)=X1;
                else 
                    X2=Best_pos-Escaping_Energy*abs(Jump_strength*Best_pos-mean(X))+rand(1,dim).*Levy(dim);
                    if (fobj(X2)<fobj(X(i,:))) 
                        X(i,:)=X2;
                    end
                end
            end
        end
    end
    t=t+1;
    Iter_curve(t)=Best_fitness;
    History_best{t} = Best_pos;
    History_pos{t} = X;
end

end

%% Levy飞行
function o=Levy(d)
    beta=1.5;
    sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
    u=randn(1,d)*sigma;v=randn(1,d);step=u./abs(v).^(1/beta);
    o=step;
end

在这里插入图片描述

4.参考文献

[1] Heidari A A, Mirjalili S, Faris H, et al. Harris hawks optimization: Algorithm and applications[J]. Future generation computer systems, 2019, 97: 849-872.

  • 52
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小O的算法实验室

谢谢大佬的肯定!

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

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

打赏作者

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

抵扣说明:

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

余额充值