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

在这里插入图片描述

目录

    • 1.背景
    • 2.算法原理
      • 2.1算法思想
      • 2.2算法过程
    • 3.代码实现
    • 4.参考文献


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:dimX(:,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<maxIterfor 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_fitnessBest_fitness=fitness;Best_pos=X(i,:);endendE1=2*(1-(t/maxIter)); for i=1:size(X,1)E0=2*rand()-1; %-1<E0<1Escaping_Energy=E1*(E0);  if abs(Escaping_Energy)>=1q=rand();rand_Hawk_index = floor(pop*rand()+1);X_rand = X(rand_Hawk_index, :);if q<0.5X(i,:)=X_rand-rand()*abs(X_rand-2*rand()*X(i,:));elseif q>=0.5X(i,:)=(Best_pos(1,:)-mean(X))-rand()*((ub-lb)*rand+lb);endelseif abs(Escaping_Energy)<1r=rand();if r>=0.5 && abs(Escaping_Energy)<0.5 X(i,:)=(Best_pos)-Escaping_Energy*abs(Best_pos-X(i,:));endif 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,:));endif 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;elseX2=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;endendendif 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;endendendendendt=t+1;Iter_curve(t)=Best_fitness;History_best{t} = Best_pos;History_pos{t} = X;
endend%% 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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android】 ClassLoader 知识点提炼

1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型&#xff0c;即系统类加载器和自定义类加载器。其中系统类 加载器包括3种&#xff0c;分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…

鸿蒙原生应用元服务开发-WebGL网页图形库开发无着色器绘制2D图形

无着色器绘制2D图形 使用WebGL开发时&#xff0c;为保证界面图形显示效果&#xff0c;请使用真机运行。 此场景为未使用WebGL绘制的2D图形&#xff08;CPU绘制非GPU绘制&#xff09;。开发示例如下&#xff1a; 1.创建页面布局。index.hml示例如下&#xff1a; <div class…

算法学习---栈和队列算法学习

一、用栈去实现队列 1.整理思路 栈的特点&#xff1a;先进后出 队列的特点&#xff1a;先进先出 我们要用栈的先进后出&#xff0c;来模拟实现队列的先进后出。我们需要借助两个栈去实现&#xff0c;分别叫做栈1和栈2。 栈1主要是用来存储数据的&#xff0c;我们将要插入的数据…

树莓派Python环境配置:删除Python 2、默认使用Python 3及配置Python镜像源指南

树莓派Python环境配置&#xff1a;优化升级三部曲 文章目录 树莓派Python环境配置&#xff1a;优化升级三部曲前言一、查看系统预装的python版本二、卸载python2并默认python3三、删除默认python3.7并升级到python3.9四、更换树莓派上的pip系统镜像源一键更换清华源&#xff08…

LoadRunner学习:RuntimeSetting、参数化、关联、(unfinished

LoadRunner RuntimeSetting 运行时设置 在Vuser中设置Run-time Settings RunLogic&#xff1a;运行逻辑&#xff0c;决定了脚本真正执行逻辑&#xff0c; Init和End部分代码只能执行一次。决定脚本真正执行逻辑的意思是&#xff0c;在Run中的代码和Number of Iteration决定了…

灵魂指针,教给(三)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、 字符指针变量 二、数组指针变量 2.1 数组指针变量是什么 2.2 数组指针变量如何初始化 三、二维数组传参本质 四、函数…

Redis + Caffeine = 王炸!!

在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。 随着不断的发展,这一架构也产生了改进,在…

Selenium控制已运行的Edge和Chrome浏览器(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器 3. 爬取效果3. 完整代码共享3.1 包含Excel部分的…

【数据结构】初识二叉搜索树(Binary Search Tree)

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的操作1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它可能是一棵空树&#xff0c;也可能是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&am…

力扣L5----- 58. 最后一个单词的长度(2024年3月11日)

1.题目 2.知识点 注1&#xff1a; lastIndexOf()它用于查找指定字符或子字符串在当前字符串中最后一次出现的位置。它的作用是从字符串的末尾向前搜索指定字符或子字符串&#xff0c;并返回其最后一次出现的位置的索引。 &#xff08;1&#xff09;例如&#xff0c;在字符串 …

Rust入门:C++和Rust动态库(dll)的相互调用

无论是C调用Rust动态库还是Rust调用C动态库&#xff0c;其操作基本都是一样地简单&#xff0c;基本和C调用C的动态库没什么区别&#xff0c;只需要列出所需要导入的函数&#xff0c;并链接到相应的lib文件即可。 这里&#xff0c;在windows中&#xff0c;我们以dll动态库为例说…

OpenCV学习笔记(一)——Anaconda下载和OpenCV的下载

OpenCV是图象识别中有巨大的应用场景&#xff0c;本篇文章以Python为基础。当初学OpenCV的时候&#xff0c;推使用在Anaconda编写代码&#xff0c;原因比较方便&#xff0c;下面我们对于Anaconda的下载过程进行演示。 Anaconda的下载 首先打开官网www.anaconda.com/download找…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

设计模式-行为型模式-模版方法模式

模板方法模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[DP] 模板方法模式是通过把不变行为搬移到超类&#xff0c;去除子类中的重复代码来体现它的优势。 //首…

【Leetcode每日一题】 位运算 - 面试题 01.01. 判定字符是否唯一(难度⭐)(33)

1.题目解析 题目链接&#xff1a;面试题 01.01. 判定字符是否唯一 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于判断题目所给字符串是否存在相同字母&#xff0c;存在返回false即可&#xff0c;不存在返回true即可。 …

Caffeine缓存

本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远程缓存间的数据交互&#xff0c;减少网络 I/O 开销&#xff0c;降低这…

08 聚合函数

聚合函数 我们上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类&#xff0c;叫做聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1.聚合函数介绍 什么是聚合函…

for、while、do...while循环的使用

本篇文章只记录for、while、do...while循环的使用&#xff0c;由于java循环较为简单&#xff0c;所以直接上代码。 1、for循环 需求&#xff1a;循环遍历求和 1-100。 public class Demo {public static void main(String[] args) {int sum 0;for (int i 1; i < 100; i…

YOLOv5目标检测学习(4):YOLOV5源码的文件结构解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言①py、cpp、java后缀的文件②md、txt、yml后缀的文件③yaml后缀的文件 一、.github文件夹1.1 workflows文件夹&#xff1a;该文件夹通常包含GitHub Actions 的工…

RHEL9 DNF/YUM仓库管理软件包

DNF/YUM仓库管理软件包 一个基于RPM包的软件包管理器能够从指定的服务器自动下载RPM包并且安装&#xff0c;自动处理依赖性关系&#xff0c;并且一次性安装所有依赖的软件包C/S模式 Server服务端提供RPM软件包与数据库文件repodataClient客户端使用dnf仓库 常用组合 组合参…