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

news2024/12/23 1:21:30

在这里插入图片描述

目录

    • 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: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.

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

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

相关文章

新智元 | Stable Diffusion 3技术报告流出,Sora构架再立大功!生图圈开源暴打Midjourney和DALL·E 3?

本文来源公众号“新智元”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Stable Diffusion 3技术报告流出&#xff0c;Sora构架再立大功&#xff01;生图圈开源暴打Midjourney和DALLE 3&#xff1f; 【新智元导读】Stability AI放…

chrome浏览器插件content.js和background.js还有popup都是什么,怎么通讯

popup 在用户点击扩展程序图标时&#xff08;下图中的下载图标&#xff09;&#xff0c;都可以设置弹出一个popup页面。而这个页面中自然是可以包含运行的js脚本的&#xff08;比如就叫popup.js&#xff09;。它会在每次点击插件图标——popup页面弹出时&#xff0c;重新载入。…

如何阅读“计算机界三大神书”之一 ——SICP

《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算机科学技术教育的发展和成熟产生了很大影响。…

plantUML使用指南之序列图

文章目录 前言一、序列图1.1 语法规则1.1.1 参与者1.1.2 生命线1.1.3 消息1.1.4 自动编号1.1.5 注释1.1.6 其它1.1.7 例子 1.2 如何画好 参考 前言 在软件开发、系统设计和架构文档编写过程中&#xff0c;图形化建模工具扮演着重要的角色。而 PlantUML 作为一种强大且简洁的开…

springboot265基于Spring Boot的库存管理系统

基于Spring Boot库存管理系统 Inventory Meanagement System based on Spring Boot 摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮…

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (3 / 5)

3.8 演员几何 我们已经看到了光照属性如何控制演员的外观&#xff0c;以及相机如何结合变换矩阵将演员投影到图像平面上。剩下的是定义演员的几何形状&#xff0c;以及如何将其定位在世界坐标系中。 建模 计算机图形学研究中的一个重要主题是建模或表示物体的几何形状。…

二分查找【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;二分查找的简单思路&#xff0c;为什么必须在有序的前提下才能使用二分查找&#xff0c;该怎么用C程序来实现二分查找&#xff0c;二分查找的局限性&#x1f440;。 文章目录 1. 题目2. 思路3. 前提条件4. 编写程序 1. 题目 在一个有…

Android Studio开发项目——记账簿应用

项目资源&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1zN9lrIypi1t_QpuoBcdBNQ?pwdxj5h 提取码&#xff1a;xj5h 项目设计内容 1.基本功能描述 电子记账本是一种在线财务管理工具&#xff0c;用于帮助用户记录和管理他们的收入与支出。以下是电…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果新鲜程度检测系统(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;开发水果新鲜程度检测系统对于提高农业产量和食品加工效率具有重大意义。本篇博客详细介绍了如何利用深度学习构建一个水果新鲜程度检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5的对比…

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling

ChatGPT 结合实际地图实现问答式地图检索功能基于Function calling ChatGPT结合实际业务&#xff0c;主要是研发多函数调用&#xff08;Function Calling&#xff09;功能模块&#xff0c;将自定义函数通过ChatGPT 问答结果&#xff0c;实现对应函数执行&#xff0c;再次将结果…

打卡学习kubernetes——了解kubernetes组成及架构

目录 1 什么是kubernetes 2 kubernetes组件 3 kubernetes架构 1 什么是kubernetes kubernetes是一个旨在自动部署、扩展和运行应用容器的开源平台。目标是构建一个生态系统&#xff0c;提供组件和工具以减轻在公共和私有云中运行应用程序的负担。 kubernetes是&#xff1a…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的跌倒检测系统详解(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;本研究介绍了一个基于深度学习和YOLOv8算法的跌倒检测系统&#xff0c;并对比分析了包括YOLOv7、YOLOv6、YOLOv5在内的早期版本性能。该系统可在多种媒介如图像、视频文件、实时视频流中准确识别跌倒事件。文内详解了YOLOv8的工作机制&#xff0c;并提供了相应…

一套plm系统大约多少钱?彩虹PLM系统

一套PLM&#xff08;产品生命周期管理&#xff09;系统的价格因多个因素而异&#xff0c;包括企业规模、需求复杂性、系统功能、技术支持和厂商选择等。一般来说&#xff0c;面向小型和微型企业的PLM产品&#xff0c;其价位在5万元~15万元左右&#xff1b;面向中型企业的中端PL…

STM32---通用定时器(二)相关实验

写在前面&#xff1a;前面我们学习了基本定时器、通用定时器的相关理论部分&#xff0c;了解到通用定时器的结构框图&#xff0c;总共包含六大模块&#xff1a;时钟源、控制器、时基单元、输入捕获、公共部分以及输出捕获。对相关模块的使用也做详细的讲解。本节我们主要是对上…

力扣刷题日记——L724. 寻找数组的中心下标

1. 前言 今天是力扣刷题日记的第二天&#xff0c;今天依旧是一道简单题啊&#xff0c;慢慢来&#xff0c;先看看题目是什么吧。 2. 题目描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和…

数据结构入门(3)顺序表和链表

1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

汤唯短发造型:保留经典和适合自己的风格,也许才是最重要的

汤唯短发造型&#xff1a;保留经典和适合自己的风格&#xff0c;也许才是最重要的 汤唯短发造型登上Vogue四月刊封面&#xff0c;引发网友热议。#李秘书讲写作#说说是怎么回事&#xff1f; 这次Vogue四月刊的封面大片&#xff0c;汤唯以一头短发亮相&#xff0c;身穿五颜六色的…

Python笔记:函数

Python函数定义规则&#xff1a; 函数代码块以def关键词开头&#xff0c;后接函数标识符名称和圆括号()。任何传入参数和自变量必须放在圆括号中间&#xff0c;圆括号之间可以用于定义参数。return [表达式] 结束函数&#xff0c;选择性地返回一个值给调用方&#xff0c;不带表…

力扣(LeetCode)142.环形链表 II

本博客讲解一道以前大厂面试常考的链表oj题 ——————————————————————— 题目介绍&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通…

【C语言】操作符相关知识点

移位操作符 << 左移操作符 >>右移操作符 左移操作符 移位规则&#xff1a; 左边抛弃、右边补0 右移操作符 移位规则&#xff1a; 首先右移运算分两种&#xff1a; 1.逻辑移位 左边用0填充&#xff0c;右边丢弃 2.算术移位 左边用原该值的符号位填充&#xff0c;…