蜜獾算法(HBA,Honey Badger Algorithm)

news2025/6/7 13:57:03

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_i
    for each 蜜獾个体:
        if rand < δ:
            执行探索阶段(气味扩散)
        else:
            执行开发阶段(挖掘捕食)
        更新当前位置 x_i
        计算新适应度 F(x_i)
    更新全局最优解 x_prey
    t = 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 MaxNLocator


class 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_func
        self.dim = dim
        self.pop_size = pop_size
        self.max_iter = max_iter
        self.lb = lb
        self.ub = ub
        self.C = C
        self.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.inf
        self.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_pos
                    self.fitness[i] = new_fitness
                    if new_fitness < self.best_fitness:
                        self.best_position = new_pos.copy()
                        self.best_fitness = new_fitness

            # 记录当前最优解
            self.convergence_curve[t] = self.best_fitness
            print(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 optimum
    rotated_z = z @ rot_matrix[d] if d in rot_matrix else z  # Rotation
    return rotated_z[0] ** 2 + 1e6 * np.sum(rotated_z[1:] ** 2) + 100


def cec17_f3(x):
    """Shifted and Rotated Rosenbrock's Function (Function 3)"""
    d = len(x)
    z = 0.5 * (x - 40)  # Shift and scale
    rotated_z = z @ rot_matrix[d] if d in rot_matrix else z  # Rotation

    sum_val = 0
    for i in range(d - 1):
        sum_val += 100 * (rotated_z[i] ** 2 - rotated_z[i + 1]) ** 2 + (rotated_z[i] - 1) ** 2
    return sum_val + 300


def cec17_f5(x):
    """Shifted and Rotated Ackley's Function (Function 5)"""
    d = len(x)
    z = x + 50  # Shift to new optimum
    rotated_z = (z @ rot_matrix[d]) if d in rot_matrix else z  # Rotation

    sum1 = 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 Q


def 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
    }

    # 对每个测试函数运行HBA
    results = {}

    for name, func in test_functions.items():
        print(f"\n{'=' * 80}")
        print(f"Optimizing Function: {name}")
        print(f"{'=' * 80}")

        # 初始化并运行HBA
        optimizer = 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.coloradmin.cn/o/2401181.html

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

相关文章

Modbus转Ethernet IP网关助力罗克韦尔PLC数据交互

在工业自动化领域&#xff0c;Modbus协议是一种广泛应用的串行通信协议&#xff0c;它定义了主站和从站之间的通信规则和数据格式。罗克韦尔PLC是一种可编程的逻辑控制器&#xff0c;通过Modbus协议实现与其他设备之间的数据交互。然而&#xff0c;随着以太网技术的普及和发展&…

飞算JavaAI 炫技赛重磅回归!用智能编码攻克老项目重构难题

深夜还在排查十年前Hibernate框架埋下的N1查询隐患&#xff1f;跨语言迁移时发现SpringMVC控制器里的业务逻辑像一团乱麻&#xff1f;当企业数字化进入深水区&#xff0c;百万行代码的老系统就像一座随时可能崩塌的"技术债冰山"。近日&#xff0c;飞算科技发布JavaAI…

ToolsSet之:XML工具

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Text菜单下的XML Tool工具是一个Xml工…

keepalived定制日志bug

keepalived定制日志bug 源码安装apt安装endl 源码安装 在/etc/rsyslog.d/目录下创建 keepalived的日志配置文件keepalived.conf [rootubuntu24-13:~]# vim /etc/rsyslog.d/keepalived.conf [rootubuntu24-13:~]# cat /etc/rsyslog.d/keepalived.conf local6.* /var/log/keepa…

数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)

数据库系统概论&#xff08;十三&#xff09;详细讲解SQL中数据更新 前言一、数据插入1. 插入数据是什么&#xff1f;2.插入单条数据&#xff08;插入元组&#xff09;场景 1&#xff1a;指定部分列插入场景 2&#xff1a;不指定列名&#xff08;插入所有列&#xff09;场景 3&…

极客时间-《搞定音频技术》-学习笔记

极客时间-《搞定音频技术》-学习笔记 语音基础知识 https://www.zhangzhenhu.com/audio/feature.html 序章-0 作者说这个语音技术啊&#xff0c;未来肯定前景大好啊&#xff0c;大家都来学习&#xff0c;然后给出了课程的脑图 音频基础 什么是声音 声音的三要素是指响度、…

网络攻防技术十三:网络防火墙

文章目录 一、网络防火墙概述1、网络型防火墙&#xff08;网络防火墙&#xff09;2、Web应用防火墙3、数据库防火墙4、主机防火墙&#xff08;个人防火墙&#xff09;5、网络防火墙的功能 二、防火墙工作原理1、无状态包过滤防火墙2、有状态包过滤防火墙&#xff08;状态检测/动…

Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件

代码&#xff1a;express-exe: 将Express开发的js打包成exe服务丢给客户端使用 实现目标 Express 集成 Sequelize 操作 Sqlite3 数据库&#xff1b; 启动 Sqlite3 时默认开启 WAL 模式&#xff0c;避免读写互锁&#xff0c;支持并发读&#xff1b; 利用 Conf 实现主进程与 Ex…

2024年认证杯SPSSPRO杯数学建模D题(第二阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型AI工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在AI的另一个分支——绘图领域&#xff0c;一款名为Midjourney&#xff08;MJ&#xff…

DOCKER使用记录

1、拉取镜像 直接使用docker pull <image>&#xff0c;大概率会出现下面的报错信息&#xff1a; (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …

【深度学习相关安装及配环境】Anaconda搭建虚拟环境并安装CUDA、cuDVV和对应版本的Pytorch,并在jupyter notebook上部署

目录 1. 查看自己电脑的cuda版本2.安装cuda关于环境变量的配置测试一下&#xff0c;安装完成 3.安装cuDVV环境变量的配置测试一下&#xff0c;安装完成 4.创建虚拟环境先安装镜像源下载3.11版本py 5.在虚拟环境下&#xff0c;下载pytorch6.验证是否安装成功7.在jupyter noteboo…

web3-区块链基础:从区块添加机制到哈希加密与默克尔树结构

区块链基础&#xff1a;从区块添加机制到哈希加密与默克尔树结构 什么是区块链 抽象的回答: 区块链提供了一种让多个参与方在没有一个唯一可信方的情况下达成合作 若有可信第三方 > 不需要区块链 [金融系统中常常没有可信的参与方] 像股票市场&#xff0c;或者一个国家的…

TCP小结

1. 核心特性 面向连接&#xff1a;通过三次握手建立连接&#xff0c;四次挥手终止连接&#xff0c;确保通信双方状态同步。 TCP连接建立的3次握手 抓包&#xff1a; client发出连接请求&#xff1b; server回应client请求&#xff0c;并且同步发送syn连接&#xff1b; clien…

Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战

在 Python 开发中&#xff0c;创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml&#xff0c;并通过一个实际项目示例&#xff0c;展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。 一、setup.py 与 pyp…

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…

python入门(1)

第一章 第一个python程序 1.1 print函数 print方法的作用 : 把想要输出的内容打印在屏幕上 print("Hello World") 1.2 输出中文 在Python 2.x版本中&#xff0c;默认的编码方式是ASCII编码方式&#xff0c;如果程序中用到了中文&#xff0c;直接输出结果很可能会…

【PDF提取表格】如何提取发票内容文字并导出到Excel表格,并将发票用发票号改名,基于pdf电子发票的应用实现

应用场景 该应用主要用于企业财务部门或个人处理大量电子发票&#xff0c;实现以下功能&#xff1a; 自动从 PDF 电子发票中提取关键信息&#xff08;如发票号码、日期、金额、销售方等&#xff09;将提取的信息整理并导出到 Excel 表格&#xff0c;方便进行财务统计和报销使…

Hugging Face 最新开源 SmolVLA 小模型入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、引言 二、认识 SmolVLA&#xff01; 三、如何使用SmolVLA&#xff1f; 3.1 安装 3.2 微调预训练模型 3.3 从头开始训练 四、方法 五、主要架构 5.1 视觉语言模型&#xff08;VLM&#xff09; 5.2 动作专家&#xff1a;流匹…

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发 零一 vscode1.1 下载 vscode1.2 下载插件1.3 安装 二 anaconda 32.1 下载2.2 新建虚拟环境1 新建快捷方式,启动base2 新建虚拟环境 3 配置Qt designer3.1 designer.exe和uic.exe3.2 设置插件,3.4 ui文件转为py文件 4使用4.1 …

大话软工笔记—组合要素2之逻辑

1. 逻辑的概念 逻辑&#xff0c;指的是思维的规律和规则&#xff0c;是对思维过程的抽象。 结合逻辑的一般定义以及信息系统的设计方法&#xff0c;对逻辑的概念进行抽提、定义为三个核心内涵&#xff0c;即&#xff1a;规律、顺序、规则。 &#xff08;1&#xff09;规律&a…