【数学建模】(智能优化算法)天牛须算法(Beetle Antennae Search, BAS)详解与Python实现

天牛须算法(Beetle Antennae Search, BAS)详解与Python实现

文章目录

  • [天牛须算法(Beetle Antennae Search, BAS)详解与Python实现](#天牛须算法(Beetle Antennae Search, BAS)详解与Python实现)
    • [1. 引言](#1. 引言)
    • [2. 算法原理](#2. 算法原理)
      • [2.1 基本思想](#2.1 基本思想)
      • [2.2 数学模型](#2.2 数学模型)
    • [3. Python实现](#3. Python实现)
    • 4.实测效果
      • [测试1. Michalewicz函数的最小化](#测试1. Michalewicz函数的最小化)
      • [测试2. Goldstein-Price函数的约束最小化](#测试2. Goldstein-Price函数的约束最小化)
    • [5. 算法特点](#5. 算法特点)
      • [5.1 优点](#5.1 优点)
      • [5.2 缺点](#5.2 缺点)
    • [6. 改进方向](#6. 改进方向)
    • [7. 应用场景](#7. 应用场景)
    • [8. 总结](#8. 总结)
    • 参考资料

1. 引言

在众多的智能优化算法 中,天牛须算法 (Beetle Antennae Search, BAS)是一种相对较新的启发式算法,由中国学者于2017年提出。与常见的群体智能算法不同的是,本算法中只涉及一个个体。该算法模拟了天牛通过触角探索环境寻找食物的行为,具有实现简单、参数少、收敛速度快等特点,在函数优化、参数调整、路径规划等领域展现出良好的应用前景。

2. 算法原理

天牛须算法的灵感来源于自然界中天牛利用一对触角感知周围环境的行为。在搜索过程中,算法模拟天牛通过左右触角探测气味强度,并朝着气味更强的方向移动 ,从而找到目标(食物源)。

2.1 基本思想

  1. 随机方向探测:天牛随机选择一个方向进行探测
  2. 双触角感知:在选定方向的两侧各伸出一个"触角"进行探测
  3. 方向判断:比较两侧触角探测到的"气味"(目标函数值)
  4. 位置更新:向气味更浓(函数值更优)的方向移动

2.2 数学模型

天牛须算法的数学模型可以描述如下:

  1. 随机方向生成

    复制代码
    dir = random_unit_vector()  # 生成单位随机方向向量
  2. 左右触角位置

    x l e f t = x + d ⋅ d i r x_{left} = x + d \cdot dir xleft=x+d⋅dir

    x r i g h t = x − d ⋅ d i r x_{right} = x - d \cdot dir xright=x−d⋅dir

    其中, d d d是触角长度,会随着迭代逐渐减小。

  3. 位置更新

    x n e w = { x + s t e p ⋅ d i r , if f ( x l e f t ) < f ( x r i g h t ) x − s t e p ⋅ d i r , otherwise x_{new} = \begin{cases} x + step \cdot dir, & \text{if } f(x_{left}) < f(x_{right}) \\ x - step \cdot dir, & \text{otherwise} \end{cases} xnew={x+step⋅dir,x−step⋅dir,if f(xleft)<f(xright)otherwise

    其中, s t e p step step是步长,也会随着迭代逐渐减小。

    步长可以设置为与触角长度成正比,其意义是"大天牛有大触角,小天牛有小触角"。

    可以在选择新位置时设置一定随机性。

3. Python实现

下面是天牛须算法的Python实现示例:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

class BAS:
    def __init__(self, fitness_func, dim=2, max_iter=100, n_beetles=1, 
                 d0=1.0, d_decay=0.95, step0=1.0, step_decay=0.95):
        """
        初始化天牛须搜索算法
        
        参数:
        fitness_func: 适应度函数(目标函数)
        dim: 问题维度
        max_iter: 最大迭代次数
        n_beetles: 天牛数量
        d0: 初始触角长度
        d_decay: 触角长度衰减率
        step0: 初始步长
        step_decay: 步长衰减率
        """
        self.fitness_func = fitness_func
        self.dim = dim
        self.max_iter = max_iter
        self.n_beetles = n_beetles
        self.d0 = d0
        self.d_decay = d_decay
        self.step0 = step0
        self.step_decay = step_decay
        
        # 初始化天牛位置(在[-5,5]^dim空间内随机)
        self.beetles = np.random.uniform(-5, 5, (n_beetles, dim))
        self.best_position = None
        self.best_fitness = float('inf')
        self.fitness_history = []
    
    def normalize(self, v):
        """将向量归一化为单位向量"""
        norm = np.linalg.norm(v)
        if norm == 0:
            return v
        return v / norm
    
    def optimize(self):
        """执行优化过程"""
        d = self.d0  # 初始触角长度
        step = self.step0  # 初始步长
        
        for t in range(self.max_iter):
            for i in range(self.n_beetles):
                # 当前天牛位置
                x = self.beetles[i]
                
                # 生成随机方向(单位向量)
                direction = np.random.randn(self.dim)
                direction = self.normalize(direction)
                
                # 计算左右触角位置
                x_left = x + d * direction
                x_right = x - d * direction
                
                # 计算左右触角处的适应度
                f_left = self.fitness_func(x_left)
                f_right = self.fitness_func(x_right)
                
                # 更新位置
                if f_left < f_right:  # 假设是最小化问题
                    self.beetles[i] = x + step * direction
                else:
                    self.beetles[i] = x - step * direction
                
                # 边界处理
                self.beetles[i] = np.clip(self.beetles[i], -5, 5)
                
                # 评估新位置
                fitness = self.fitness_func(self.beetles[i])
                
                # 更新全局最优
                if fitness < self.best_fitness:
                    self.best_fitness = fitness
                    self.best_position = self.beetles[i].copy()
            
            # 记录当前最优适应度
            self.fitness_history.append(self.best_fitness)
            
            # 更新参数
            d *= self.d_decay
            step *= self.step_decay
            
        return self.best_position, self.best_fitness

# 测试函数:Sphere函数
def sphere(x):
    return np.sum(x**2)

# 运行算法
bas = BAS(sphere, dim=10, max_iter=200)
best_pos, best_fit = bas.optimize()

# 绘制收敛曲线
plt.figure(figsize=(10, 6))
plt.plot(bas.fitness_history)
plt.xlabel('迭代次数')
plt.ylabel('最优适应度值')
plt.title('天牛须算法收敛曲线')
plt.yscale('log')
plt.grid(True)
plt.show()

print(f"最优解: {best_pos}")
print(f"最优值: {best_fit}")

4.实测效果

测试1. Michalewicz函数的最小化

测试2. Goldstein-Price函数的约束最小化

5. 算法特点

5.1 优点

  1. 实现简单:算法结构简单,易于理解和实现
  2. 参数少:相比粒子群、遗传算法等,参数更少
  3. 计算效率高:每次迭代只需少量函数评估
  4. 收敛速度快:在许多问题上表现出较快的收敛速度

5.2 缺点

  1. 易陷入局部最优:基础版本容易早熟收敛
  2. 参数敏感:算法性能对参数设置较为敏感
  3. 维度扩展性:在高维问题上效果可能不如其他成熟算法

6. 改进方向

为了克服基础天牛须算法的一些缺点,研究人员提出了多种改进方案:

  1. 自适应步长:根据搜索过程动态调整步长和触角长度,可表示为:

    d t = d 0 ⋅ δ t d_t = d_0 \cdot \delta^t dt=d0⋅δt

    s t e p t = s t e p 0 ⋅ δ t step_t = step_0 \cdot \delta^t stept=step0⋅δt

    其中, δ \delta δ是衰减系数, t t t是当前迭代次数。

  2. 多天牛协同:引入多个天牛并设计信息交互机制

  3. 混合算法:与其他优化算法(如PSO、DE等)结合

  4. 精英保留:引入精英保留策略避免最优解丢失

  5. 混沌映射:使用混沌映射增强搜索的多样性

7. 应用场景

天牛须算法已在多个领域得到应用:

  1. 参数优化:如神经网络、控制系统参数调优
  2. 路径规划:无人机、机器人路径规划
  3. 图像处理:图像分割、特征提取
  4. 调度优化:生产调度、资源分配
  5. 特征选择:机器学习中的特征选择

8. 总结

天牛须算法作为一种新兴的优化算法,凭借其简单高效的特点,在各类优化问题中展现出良好的应用前景。虽然还存在一些局限性,但通过不断的改进和与其他算法的结合,天牛须算法有望在更多领域发挥重要作用。

例如,我们可以用以下公式来表示天牛须算法的整体迭代过程:

X t + 1 = X t ± η t ⋅ d t ∣ ∣ d t ∣ ∣ ⋅ sign [ f ( X t + d t ) − f ( X t − d t ) ] X_{t+1} = X_t \pm \eta_t \cdot \frac{d_t}{||d_t||} \cdot \text{sign}[f(X_t + d_t) - f(X_t - d_t)] Xt+1=Xt±ηt⋅∣∣dt∣∣dt⋅sign[f(Xt+dt)−f(Xt−dt)]

其中, X t X_t Xt是当前位置, η t \eta_t ηt是步长, d t d_t dt是随机方向向量, f f f是目标函数, sign \text{sign} sign是符号函数。

参考资料

  1. Jiang X, Li S. BAS: Beetle Antennae Search Algorithm for Optimization Problems[J]. arXiv preprint arXiv:1710.10724, 2017.
  2. Wu Q, Shen X, Jin Y, et al. Intelligent beetle antennae search for UAV sensing and avoidance of obstacles[J]. Sensors, 2019, 19(8): 1758.
  3. Lin A, Sun W, Yu H, et al. BSAS: Beetle swarm antennae search algorithm for optimization problems[J]. IEEE Access, 2019, 7: 105467-105482.
  4. 天牛须搜索算法(BAS)

希望这篇文章能帮助您了解天牛须算法的基本原理、实现方法和应用场景。如有任何问题,欢迎在评论区留言讨论!

相关推荐
前端付豪1 小时前
微信视频号推荐系统揭秘:兴趣建模、多模态分析与亿级流控架构实战
前端·后端·算法
木杉苑1 小时前
快速幂算法
算法
-qOVOp-3 小时前
408第一季 - 数据结构 - 排序II
数据结构·算法·排序算法
小胖同学~3 小时前
快速入门数据结构--栈
算法
C++ 老炮儿的技术栈3 小时前
VSCode -配置为中文界面
大数据·c语言·c++·ide·vscode·算法·编辑器
刃神太酷啦4 小时前
聚焦 string:C++ 文本处理的核心利器--《Hello C++ Wrold!》(10)--(C/C++)
java·c语言·c++·qt·算法·leetcode·github
CoovallyAIHub4 小时前
云南电网实战:YOLOv8m改进模型攻克输电线路异物检测难题技术详解
深度学习·算法·计算机视觉
蜗牛的旷野4 小时前
华为OD机试_2025 B卷_磁盘容量排序(Python,100分)(附详细解题思路)
python·算法·华为od
Sun_light4 小时前
链表 --- 高效离散存储的线性数据结构
前端·javascript·算法
西西弗Sisyphus4 小时前
低秩分解的本质是通过基矩阵和系数矩阵的线性组合,以最小的存储和计算代价近似表示复杂矩阵
线性代数·算法·矩阵