蜜獾算法(HBA,Honey Badger Algorithm)

2021年由Hashim等人提出(论文:Honey Badger Algorithm: A New Metaheuristic Algorithm for Solving Optimization Problems)。模拟蜜獾在自然界中的智能捕食行为,属于群体智能优化算法(与粒子群PSO、遗传算法GA同属一类),适用于连续优化问题

一 行为模型

蜜獾的两种主要行为驱动算法设计:

(1)挖掘模式:

针对地下猎物:通过嗅觉定位 + 动态挖掘路径。

(2)采蜜模式:

跟随导蜜鸟定位蜂巢 → 直接奔袭蜜源。

二  数学模型与迭代步骤

2.1关键变量定义:

蜜獾位置:候选解向量 $x_i$

猎物强度(I)

$ I_i = \frac{​{F(x_i) - \min(F)}}{\max(F) - \min(F)} + \epsilon $

$F(x_i)$:个体 $x_i$ 的目标函数值(如适应度)

$F_{\min},F_{\max}$​:当前种群中最小和最大函数值,两者做差可以将I进行归一化处理

$\epsilon$:极小常数(防止分母为零)

上述公式代标强度的范围最大是1+$\epsilon$,最小是 $\epsilon$

函数值 $F(x_i)$ 反映解的质量。优化问题中,$F(x_i)$ 越小(化最小问题)表示解越优,更优解代表更接近全局最优解,代表与“猎物”的隐含距离更小,因此隐含距离越小,强度越小,接近程度越大。

个体函数值 F(x)F(x)F(x)与最优解距离计算强度 IiI_iIi​强度 vs 距离关系
A(最优)$F_{\min}=5$最近$I_A=\frac{5-5}{20-5}+0.01=0.01$强度最小
B$F=15$中等$I_B=\frac{15-5}{20-5}+0.01\approx 0.67$强度中等
C(最差)$F_{\max}=20$最远$I_C=\frac{20-5}{20-5}+0.01=1.01$强度最大

强度越小越好。

距离大 ⇒ F(xi)差 ⇒ (F(xi)−Fmin⁡) ↑ ⇒ I_{i}↑ ⇒ 算法反馈:加大搜索步长

这种设计以极低计算代价实现了蜜獾“嗅到远距离猎物时采取更大动作”的生物智能模拟。

为什么不用几何距离?

避免高维距离计算、函数值差距能推广到离散/非几何空间,泛用性高、算法运行中已计算 $F(x_i)$,复用数据无需额外开销,效率高。

2.2探索阶段(Exploration)- 气味扩散

基于猎物强度的全局搜索:

$ \vec{x}_{new} = \vec{x}_{prey} + F \cdot \vec{r}_1 \cdot \alpha \cdot I \cdot | \cos(2\pi r_2) \cdot [1 - \cos(2\pi r_3)] | $

$\vec{x}_{prey}$:当前最佳猎物位置

$F$:控制搜索方向(±1随机切换)

$r_1, r_2, r_3$​:随机向量

$\alpha$:密度因子(随迭代递减)

强度I的作用

I_{i} (解质量差、距离远)→ 乘以 I_{i}​ 后步长增大 → 加强全局探索

I_{i} (解质量好、距离近)→ 乘以 I_{i}步长减小 → 精细局部开发

2.3开发阶段(Exploitation)- 精确捕食

局部挖掘(模拟蜜獾洞穴内捕猎):

$ \vec{x}_{new} = \vec{x}_{prey} + F \cdot \vec{r}_4 \cdot \mathit{\alpha} \cdot | \vec{x}_{prey} - \vec{x}_{i} | $

$\vec{r}_4$​:随机向量

$| \vec{x}_{prey} - \vec{x}_{i} |$:个体到猎物的距离

通过密度因子 $\alpha$ 动态平衡探索与开发:

$ \alpha = C \cdot \exp\left(-\frac{t}{T_{max}}\right) $

$C$ 为常数,$t$ 为当前迭代,$T_{max}$​ 为最大迭代)

决策规则:若 $rand < \delta$$\delta$ 为切换阈值),使用挖掘模式;否则使用采蜜模式。

三 实现方法

3.1过程示例

初始化种群位置 x_i, i=1,2,...,N
计算适应度值 F(x_i)
while t < T_max:更新密度因子 α计算猎物强度 I_ifor each 蜜獾个体:if rand < δ:执行探索阶段(气味扩散)else:执行开发阶段(挖掘捕食)更新当前位置 x_i计算新适应度 F(x_i)更新全局最优解 x_preyt = t + 1
返回最优解 x_prey

3.2参数设置

参数意义推荐值
$N$种群规模30~50
$\delta$模式切换阈值0.8
$C$密度衰减常数2.0
$T_{max}$最大迭代次数100~500

3.3优势和局限性

优势局限性
全局探索能力强(气味机制)对高维问题敏感
局部开发高效(动态密度因子)参数需经验调整(如δ)
收敛速度快于传统算法(PSO等)易陷局部最优的改进变体
代码实现简单

四 应用场景 

工程优化:结构设计、PID控制器调参

人工智能:神经网络超参数优化

能源管理:光伏阵列最大功率点跟踪(MPPT)

研究方向:离散化改进(如HBA-TSP)、多目标版本(MO-HBA)

五 在CEC2017测试函数集上使用HBA的python代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocatorclass HBA:def __init__(self, obj_func, dim=30, pop_size=100, max_iter=1000, lb=-100, ub=100, C=2, delta=0.8):"""蜜獾算法 (Honey Badger Algorithm)参数:obj_func -- 目标函数dim -- 问题维度pop_size -- 种群大小max_iter -- 最大迭代次数lb -- 变量下界ub -- 变量上界C -- 密度因子常数delta -- 模式切换阈值"""self.obj_func = obj_funcself.dim = dimself.pop_size = pop_sizeself.max_iter = max_iterself.lb = lbself.ub = ubself.C = Cself.delta = delta# 初始化种群self.positions = np.random.uniform(lb, ub, (pop_size, dim))self.fitness = np.zeros(pop_size)self.best_position = np.zeros(dim)self.best_fitness = np.infself.convergence_curve = np.zeros(max_iter)def evaluate(self):"""评估所有个体适应度"""for i in range(self.pop_size):self.fitness[i] = self.obj_func(self.positions[i])if self.fitness[i] < self.best_fitness:self.best_fitness = self.fitness[i]self.best_position = self.positions[i].copy()def optimize(self):"""执行优化过程"""self.evaluate()  # 初始评估for t in range(self.max_iter):# 1. 计算猎物强度f_min = np.min(self.fitness)f_max = np.max(self.fitness)I = (self.fitness - f_min) / (f_max - f_min + 1e-25)  # 避免除零I = 1 + I  # 确保强度至少为1# 2. 更新密度因子alpha = self.C * np.exp(-t / self.max_iter)# 3. 更新每个个体位置for i in range(self.pop_size):# 为每个个体生成随机方向因子F = 1 if np.random.rand() < 0.5 else -1  # 随机方向(在循环内部重新定义)if np.random.rand() < self.delta:  # 挖掘模式(探索)r1, r2, r3 = np.random.rand(3)  # 只需要3个随机数# 气味导向的位置更新new_pos = self.best_position + F * r1 * alpha * I[i] * \np.abs(np.cos(2 * np.pi * r2) * (1 - np.cos(2 * np.pi * r3)))else:  # 采蜜模式(开发)r4 = np.random.rand()# 动态挖掘的位置更新new_pos = self.best_position + F * r4 * alpha * np.abs(self.best_position - self.positions[i])# 越界处理new_pos = np.clip(new_pos, self.lb, self.ub)# 计算新位置适应度new_fitness = self.obj_func(new_pos)# 更新个体位置和适应度if new_fitness < self.fitness[i]:self.positions[i] = new_posself.fitness[i] = new_fitnessif new_fitness < self.best_fitness:self.best_position = new_pos.copy()self.best_fitness = new_fitness# 记录当前最优解self.convergence_curve[t] = self.best_fitnessprint(f"Iteration {t + 1}/{self.max_iter} - Best Fitness: {self.best_fitness:.6e}")return self.best_position, self.best_fitness, self.convergence_curve# ===================== CEC2017测试函数集实现 ========================
def cec17_f1(x):"""Shifted and Rotated Bent Cigar Function (Function 1)"""d = len(x)z = x - 100  # Shift to new optimumrotated_z = z @ rot_matrix[d] if d in rot_matrix else z  # Rotationreturn rotated_z[0] ** 2 + 1e6 * np.sum(rotated_z[1:] ** 2) + 100def cec17_f3(x):"""Shifted and Rotated Rosenbrock's Function (Function 3)"""d = len(x)z = 0.5 * (x - 40)  # Shift and scalerotated_z = z @ rot_matrix[d] if d in rot_matrix else z  # Rotationsum_val = 0for i in range(d - 1):sum_val += 100 * (rotated_z[i] ** 2 - rotated_z[i + 1]) ** 2 + (rotated_z[i] - 1) ** 2return sum_val + 300def cec17_f5(x):"""Shifted and Rotated Ackley's Function (Function 5)"""d = len(x)z = x + 50  # Shift to new optimumrotated_z = (z @ rot_matrix[d]) if d in rot_matrix else z  # Rotationsum1 = np.sum(rotated_z ** 2)sum2 = np.sum(np.cos(2 * np.pi * rotated_z))return -20 * np.exp(-0.2 * np.sqrt(sum1 / d)) - np.exp(sum2 / d) + 20 + np.e + 500# ===================== 辅助函数 ========================
def generate_rotation_matrix(dim):"""生成随机旋转矩阵(模拟CEC2017的旋转特性)"""H = np.random.randn(dim, dim)Q, R = np.linalg.qr(H)return Qdef plot_results(convergence, func_name, dim):"""绘制收敛曲线"""plt.figure(figsize=(10, 6))plt.semilogy(convergence, 'b-', linewidth=2)plt.title(f'HBA on {func_name} - Dimension {dim}\nFinal Fitness: {convergence[-1]:.4e}', fontsize=12)plt.xlabel('Iteration', fontsize=12)plt.ylabel('Fitness (log scale)', fontsize=12)plt.grid(True, which='both', linestyle='--')plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))plt.tight_layout()plt.show()# ===================== 主程序 ========================
if __name__ == "__main__":# 实验参数dim = 30  # 问题维度max_iter = 1000  # 最大迭代次数pop_size = 100  # 种群大小# 预生成旋转矩阵 (模拟CEC2017特性)np.random.seed(42)rot_matrix = {dim: generate_rotation_matrix(dim)}# 定义要测试的函数test_functions = {"CEC2017 F1 (Bent Cigar)": cec17_f1,"CEC2017 F3 (Rosenbrock)": cec17_f3,"CEC2017 F5 (Ackley)": cec17_f5}# 对每个测试函数运行HBAresults = {}for name, func in test_functions.items():print(f"\n{'=' * 80}")print(f"Optimizing Function: {name}")print(f"{'=' * 80}")# 初始化并运行HBAoptimizer = HBA(obj_func=func,dim=dim,pop_size=pop_size,max_iter=max_iter,lb=-100,ub=100)best_sol, best_fit, convergence = optimizer.optimize()results[name] = convergence# 打印最终结果print(f"\n{'*' * 80}")print(f"{name} Optimization Result:")print(f"Best Solution: {best_sol[:5]}...")  # 只打印前5维print(f"Best Fitness: {best_fit:.6e}")print(f"Optimal Value Found: {func(best_sol):.6e}")print(f"{'*' * 80}\n")# 绘制收敛曲线plot_results(convergence, name, dim)# 比较所有函数的收敛曲线plt.figure(figsize=(12, 8))for name, conv in results.items():plt.semilogy(conv, label=name, linewidth=2)plt.title(f'HBA Performance on CEC2017 Functions (Dim={dim})', fontsize=16)plt.xlabel('Iteration', fontsize=12)plt.ylabel('Fitness (log scale)', fontsize=12)plt.legend(fontsize=12)plt.grid(True, which='both', linestyle='--')plt.tight_layout()plt.savefig('hba_cec2017_convergence.png', dpi=300)plt.show()

输出值为:

 通过增加迭代次数和种群大小可以更加接近最优解。

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

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

相关文章

Duix.HeyGem:以“离线+开源”重构数字人创作生态

在AI技术快速演进的今天,虚拟数字人正从高成本、高门槛的专业领域走向大众化应用。Duix.HeyGem 数字人项目正是这一趋势下的杰出代表。该项目由一支拥有七年AI研发经验的团队打造,通过放弃传统3D建模路径,转向真人视频驱动的AI训练模型,成功实现了低成本、高质量、本地化的…

HTTP常见的请求方法、响应状态码、接口规范介绍

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是Web通信的基础协议&#xff0c;用于客户端和服务器之间的请求和响应。本文将详细介绍HTTP常见的请求方法、响应状态码以及接口规范&#xff0c;帮助开发者更好地理解和使用HTTP协议。 一、HTTP请求方法 HTTP请求方…

基于Matlab实现LDA算法

线性判别分析&#xff08;Linear Discriminant Analysis, LDA&#xff09;是一种经典的统计方法&#xff0c;常用于特征降维和分类问题。在机器学习领域&#xff0c; 一、LDA基本原理 LDA的目标是寻找一个投影空间&#xff0c;使得类间距离最大化&#xff0c;同时保持类内距离…

matlab基于GUI实现水果识别

基于GUI实现水果识别系统&#xff0c;限一个图片内存在一种水果 图像处理是一种利用计算机分析图像以达到预期结果的技术。图像处理一般指数字图像处理&#xff0c;而数字图像指由工业相机、摄像机、扫描仪等设备捕捉到的二维数组&#xff0c;数组中的元素称为像素&#xff0c…

XML 编码:结构化数据的基石

XML 编码:结构化数据的基石 引言 XML(可扩展标记语言)作为互联网上广泛使用的数据交换格式,已经成为结构化数据存储和传输的重要工具。本文旨在深入探讨XML编码的原理、应用场景以及编码规范,帮助读者更好地理解和运用XML。 XML编码概述 1. XML的起源 XML诞生于1998年…

虚拟机无法开启-关掉虚拟化

这个问题我之前解决过&#xff0c;没做笔记&#xff0c;这次记录下&#xff0c;最常见都上开启bois的cpu虚拟化。 其次是启动或关闭功能页面也需要选择&#xff0c;再就是和wsl都冲突问题&#xff0c;就是今天这个问题 您的主机不满足在启用 Hyper-V 或 Device/Credential Gua…

Python数据可视化科技图表绘制系列教程(二)

目录 表格风格图 使用Seaborn函数绘图 设置图表风格 设置颜色主题 图表分面 绘图过程 使用绘图函数绘图 定义主题 分面1 分面2 【声明】&#xff1a;未经版权人书面许可&#xff0c;任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博…

LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++

https://leetcode.cn/problems/search-a-2d-matrix/description/ 一、题目分析 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 ta…

猎板硬金镀层厚度:新能源汽车高压系统的可靠性基石

在新能源汽车的电池管理系统&#xff08;BMS&#xff09;和电机控制器中&#xff0c;硬金镀层厚度直接关系到高压环境下的电气稳定性与使用寿命。猎板针对车载场景开发的耐电迁移方案&#xff08;金层 2.5μm&#xff0c;镍层 8μm&#xff09;&#xff0c;经 150℃/85% RH 高压…

亚马逊站内信规则2025年重大更新:避坑指南与合规策略

亚马逊近期对Buyer-Seller Messaging&#xff08;买家-卖家站内信&#xff09;规则进行了显著收紧&#xff0c;明确将一些曾经的“灰色操作”列为违规。违规操作轻则收到警告&#xff0c;重则导致账户暂停或绩效受限。本文为您全面解析本次规则更新的核心要点、背后逻辑&#x…

WPF可拖拽ListView

1.控件描述 WPF实现一个ListView控件Item子项可删除也可拖拽排序&#xff0c;效果如下图所示 2.实现代码 配合 WrapPanel 实现水平自动换行&#xff0c;并开启拖拽 <ListViewx:Name"listView"Grid.Row"1"Width"300"AllowDrop"True&…

相机--双目立体相机

教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera&#xff0c;属于深度相机。 作用 1&#xff0c;获取图像特征&#xff1b; 2&#xff0c;获取图像深度信息&#xff1b; 原理 原理和标定 …

Unity3D仿星露谷物语开发59之定制角色衬衫

1、目标 自定义角色衬衫、裤子、手臂颜色。 2、概念 在Assets -> Sprites -> Output Textures下&#xff0c;Customised_farmer为目前角色所用的精灵表。 如果上面是输出纹理&#xff0c;那么输入纹理是什么呢&#xff1f;它位于Assets/Sprites/Sprite Textures/Chara…

【HarmonyOS 5】游戏开发教程

一、开发环境搭建 ‌工具配置‌ 安装DevEco Studio 5.1&#xff0c;启用CodeGenie AI助手&#xff08;Settings → Tools → AI Assistant&#xff09;配置游戏模板&#xff1a;选择"Game"类型项目&#xff0c;勾选手机/平板/折叠屏多设备支持 二、游戏引擎核心架构…

深度探索:如何用DeepSeek重构你的工作流

前言:AI时代的工作革命 在人工智能浪潮席卷的今天,DeepSeek作为国产大模型的代表之一,正以其强大的自然语言处理能力、代码生成能力和多模态交互特性,重新定义着人类的工作方式。根据IDC报告显示,2024年企业级AI应用市场规模已突破800亿美元,其中智能办公场景占比达32%,…

Linux 进程调度与管理:从内核管理到调度机制的深度解析

文章目录 引言一、进程基础&#xff1a;概念与核心数据结构1.1 进程的本质&#xff1a;程序的动态化身1.2 进程控制块&#xff08;PCB&#xff09;&#xff1a;内核管理的灵魂1.2.1 链表节点嵌入1.2.2 链表操作宏1.2.3 全局链表管理 1.3 进程查看与系统调用1.3.1 通过系统调用获…

信息学奥赛一本通 1570:【例 2】能量项链 | 1843:【06NOIP提高组】能量项链 | 洛谷 P1063 [NOIP 2006 提高组] 能量项链

【题目链接】 ybt 1570&#xff1a;【例 2】能量项链 ybt 1843&#xff1a;【06NOIP提高组】能量项链 洛谷 P1063 [NOIP 2006 提高组] 能量项链 【题目考点】 1. 动态规划&#xff1a;区间动规 2. 环形序列 解决方法&#xff1a;破环为链 模板题&#xff1a;洛谷 P1880 [N…

旅游微信小程序制作指南

想创建旅游微信小程序吗&#xff1f;知道旅游业企业怎么打造自己的小程序吗&#xff1f;这里有零基础小白也能学会的教程&#xff0c;教你快速制作旅游类微信小程序&#xff01; 旅游行业能不能开发微信小程序呢&#xff1f;答案是肯定的。微信小程序对旅游企业来说可是个宝&am…

Vue3+Vite中lodash-es安装与使用指南

在 Vue 3 Vite 项目中安装和使用 lodash-es 的详细指南如下&#xff1a; 一、为什么选择 lodash-es&#xff1f; ES 模块支持&#xff1a;lodash-es 以原生 ES 模块格式发布&#xff0c;支持现代构建工具的 Tree Shaking 按需加载&#xff1a;只引入需要的函数&#xff0c;显…

法律模型选型

当然可以&#xff0c;以下是关于法律法规相关模型的技术选型调研建议&#xff0c;适合算法实习生从0入手&#xff0c;并能交付有深度的调研报告&#xff1a; 一、调研背景与目标 目标&#xff1a;调研用于处理法律法规类任务的大模型与技术方案&#xff0c;明确适合本团队的模…