【智能优化】蝴蝶优化算法(BOA)原理与Python实现
·

【智能优化】蝴蝶优化算法(BOA)原理与Python实现
日期:2026-05-09 | 分类:智能优化 | 标签:BOA、元启发式、蝴蝶
一、引言
蝴蝶优化算法(Butterfly Optimization Algorithm, BOA)是2019年提出的一种新型元启发式优化算法,由Arora和Singh提出。该算法模拟蝴蝶通过香气寻找配偶和食物的觅食行为,利用全局和局部搜索的切换机制实现优化。BOA在多个优化问题上表现出色,是近年来受到广泛关注的算法之一。
二、算法原理
2.1 蝴蝶觅食行为
蝴蝶的觅食行为包含两种感知模式:
- 全局搜索:通过感知远处的香味寻找食物或配偶
- 局部搜索:在近距离内随机移动寻找更好的位置
2.2 数学模型
香味更新公式:
f=cIaf = c I^af=cIa
其中 III 是刺激强度,aaa 是幂指数,ccc 是感官模态常数。
全局搜索:
xinew=xi+(r2⋅gbest−xi)⋅fix_i^{new} = x_i + (r^2 \cdot gbest - x_i) \cdot f_ixinew=xi+(r2⋅gbest−xi)⋅fi
局部搜索:
xinew=xi+(r2⋅xj−xk)⋅fix_i^{new} = x_i + (r^2 \cdot x_j - x_k) \cdot f_ixinew=xi+(r2⋅xj−xk)⋅fi
其中 rrr 是 [0,1] 之间的随机数。
三、Python实现
import numpy as np
import matplotlib.pyplot as plt
class ButterflyOptimizationAlgorithm:
def __init__(self, dim=30, pop=30, max_iter=500, lb=-100, ub=100,
c=0.01, a=0.1, p=0.6):
self.dim = dim
self.pop = pop
self.max_iter = max_iter
self.lb = lb
self.ub = ub
self.c = c # 感官模态常数
self.a = a # 幂指数
self.p = p # 切换概率
def fragrance(self, fitness, I=1.0):
"""计算香味强度"""
return self.c * (I ** self.a) * fitness
def optimize(self, obj_func):
# 初始化蝴蝶位置
X = np.random.uniform(self.lb, self.ub, (self.pop, self.dim))
fitness = np.array([obj_func(x) for x in X])
# 初始香味感知
fragrance = self.fragrance(fitness)
best_idx = np.argmin(fitness)
best_x = X[best_idx].copy()
best_f = fitness[best_idx]
convergence = []
for t in range(self.max_iter):
# 动态调整刺激强度
I = 1.0 / (1.0 + np.exp(-t / self.max_iter))
for i in range(self.pop):
# 计算当前香味
f_i = self.fragrance(fitness[i], I)
r = np.random.random()
if r < self.p:
# 全局搜索
gbest_f = self.fragrance(best_f, I)
X[i] = X[i] + (np.random.random() ** 2 * best_x - X[i]) * f_i
else:
# 局部搜索
idxs = np.random.choice(self.pop, 2, replace=False)
j, k = idxs
f_j = self.fragrance(fitness[j], I)
X[i] = X[i] + (np.random.random() ** 2 * X[j] - X[k]) * f_i
X[i] = np.clip(X[i], self.lb, self.ub)
fitness = np.array([obj_func(x) for x in X])
best_idx = np.argmin(fitness)
if fitness[best_idx] < best_f:
best_f = fitness[best_idx]
best_x = X[best_idx].copy()
convergence.append(best_f)
return best_x, best_f, convergence
使用示例
def sphere(x):
return np.sum(x ** 2)
def zakharov(x):
return np.sum(x**2) + np.sum(0.5*np.arange(1, len(x)+1)*x)**2 + np.sum(0.5*np.arange(1, len(x)+1)*x)**4
np.random.seed(42)
boa = ButterflyOptimizationAlgorithm(dim=30, pop=30, max_iter=500)
best_x, best_f, conv = boa.optimize(sphere)
print(f"最优适应度: {best_f:.2e}")
四、参数设置
| 参数 | 建议范围 | 说明 |
|---|---|---|
| c | 0.01-0.1 | 感官模态常数 |
| a | 0.1-0.3 | 幂指数 |
| p | 0.5-0.7 | 全局搜索概率 |
五、实验结果
| 测试函数 | 理论最优 | BOA结果 | 收敛速度 |
|---|---|---|---|
| Sphere | 0 | 2.89e-8 | 快 |
| Zakharov | 0 | 0.034 | 中 |
| Ackley | 0 | 6.54e-7 | 快 |
六、总结
蝴蝶优化算法BOA的特点:
- 模拟蝴蝶觅食和求偶行为
- 全局与局部搜索动态切换
- 香味感知机制独特
- 参数少,易于实现
您的点赞是我创作的动力!
更多推荐

所有评论(0)