天牛须算法(Beetle Antennae Search, BAS)详解与Python实现
文章目录
- 天牛须算法(Beetle Antennae Search, BAS)详解与Python实现
- 1. 引言
- 2. 算法原理
- 2.1 基本思想
- 2.2 数学模型
- 3. Python实现
- 4.实测效果
- 测试1. Michalewicz函数的最小化
- 测试2. Goldstein-Price函数的约束最小化
- 5. 算法特点
- 5.1 优点
- 5.2 缺点
- 6. 改进方向
- 7. 应用场景
- 8. 总结
- 参考资料
1. 引言
在众多的智能优化算法中,天牛须算法(Beetle Antennae Search, BAS)是一种相对较新的启发式算法,由中国学者于2017年提出。与常见的群体智能算法不同的是,本算法中只涉及一个个体。该算法模拟了天牛通过触角探索环境寻找食物的行为,具有实现简单、参数少、收敛速度快等特点,在函数优化、参数调整、路径规划等领域展现出良好的应用前景。
2. 算法原理
天牛须算法的灵感来源于自然界中天牛利用一对触角感知周围环境的行为。在搜索过程中,算法模拟天牛通过左右触角探测气味强度,并朝着气味更强的方向移动,从而找到目标(食物源)。
2.1 基本思想
- 随机方向探测:天牛随机选择一个方向进行探测
- 双触角感知:在选定方向的两侧各伸出一个“触角”进行探测
- 方向判断:比较两侧触角探测到的“气味”(目标函数值)
- 位置更新:向气味更浓(函数值更优)的方向移动
2.2 数学模型
天牛须算法的数学模型可以描述如下:
-
随机方向生成:
dir = random_unit_vector() # 生成单位随机方向向量
-
左右触角位置:
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是触角长度,会随着迭代逐渐减小。
-
位置更新:
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实现示例:
import numpy as np
import matplotlib.pyplot as pltclass 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_funcself.dim = dimself.max_iter = max_iterself.n_beetles = n_beetlesself.d0 = d0self.d_decay = d_decayself.step0 = step0self.step_decay = step_decay# 初始化天牛位置(在[-5,5]^dim空间内随机)self.beetles = np.random.uniform(-5, 5, (n_beetles, dim))self.best_position = Noneself.best_fitness = float('inf')self.fitness_history = []def normalize(self, v):"""将向量归一化为单位向量"""norm = np.linalg.norm(v)if norm == 0:return vreturn v / normdef 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 * directionx_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 * directionelse: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 = fitnessself.best_position = self.beetles[i].copy()# 记录当前最优适应度self.fitness_history.append(self.best_fitness)# 更新参数d *= self.d_decaystep *= self.step_decayreturn 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 优点
- 实现简单:算法结构简单,易于理解和实现
- 参数少:相比粒子群、遗传算法等,参数更少
- 计算效率高:每次迭代只需少量函数评估
- 收敛速度快:在许多问题上表现出较快的收敛速度
5.2 缺点
- 易陷入局部最优:基础版本容易早熟收敛
- 参数敏感:算法性能对参数设置较为敏感
- 维度扩展性:在高维问题上效果可能不如其他成熟算法
6. 改进方向
为了克服基础天牛须算法的一些缺点,研究人员提出了多种改进方案:
-
自适应步长:根据搜索过程动态调整步长和触角长度,可表示为:
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是当前迭代次数。
-
多天牛协同:引入多个天牛并设计信息交互机制
-
混合算法:与其他优化算法(如PSO、DE等)结合
-
精英保留:引入精英保留策略避免最优解丢失
-
混沌映射:使用混沌映射增强搜索的多样性
7. 应用场景
天牛须算法已在多个领域得到应用:
- 参数优化:如神经网络、控制系统参数调优
- 路径规划:无人机、机器人路径规划
- 图像处理:图像分割、特征提取
- 调度优化:生产调度、资源分配
- 特征选择:机器学习中的特征选择
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是符号函数。
参考资料
- Jiang X, Li S. BAS: Beetle Antennae Search Algorithm for Optimization Problems[J]. arXiv preprint arXiv:1710.10724, 2017.
- 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.
- Lin A, Sun W, Yu H, et al. BSAS: Beetle swarm antennae search algorithm for optimization problems[J]. IEEE Access, 2019, 7: 105467-105482.
- 天牛须搜索算法(BAS)
希望这篇文章能帮助您了解天牛须算法的基本原理、实现方法和应用场景。如有任何问题,欢迎在评论区留言讨论!