【智能优化】萤火虫算法(FA)原理与Python实现
·

【智能优化】萤火虫算法(FA)原理与Python实现
日期:2026-05-09 | 分类:智能优化 | 标签:FA、元启发式、萤火虫
一、引言
萤火虫算法(Firefly Algorithm, FA)是2008年由Yang Xin-She提出的一种元启发式优化算法。该算法模拟萤火虫通过发光吸引同伴的生物学行为,利用亮度和吸引度两个关键因素引导搜索过程。FA以其简单的实现和良好的全局搜索能力,在函数优化、图像分割、特征选择等领域得到广泛应用。
二、算法原理
2.1 萤火虫发光行为
萤火虫的闪光特性:
- 亮度:与目标函数值相关,越接近最优解越亮
- 吸引度:与距离相关,越近吸引度越高
- 光强衰减:光强随距离增加而减弱
2.2 数学模型
光强更新:
I(r)=I0⋅e−γr2I(r) = I_0 \cdot e^{-\gamma r^{2}}I(r)=I0⋅e−γr2
吸引度:
β(r)=β0⋅e−γr2\beta(r) = \beta_0 \cdot e^{-\gamma r^{2}}β(r)=β0⋅e−γr2
位置更新:
xinew=xi+β0⋅e−γrij2(xj−xi)+αϵix_i^{new} = x_i + \beta_0 \cdot e^{-\gamma r_{ij}^2} (x_j - x_i) + \alpha \epsilon_ixinew=xi+β0⋅e−γrij2(xj−xi)+αϵi
其中 γ\gammaγ 是光强吸收系数,α\alphaα 是步长因子。
三、Python实现
import numpy as np
import matplotlib.pyplot as plt
class FireflyAlgorithm:
def __init__(self, dim=30, pop=30, max_iter=500, lb=-100, ub=100,
alpha=0.5, beta0=1.0, gamma=1.0):
self.dim = dim
self.pop = pop
self.max_iter = max_iter
self.lb = lb
self.ub = ub
self.alpha = alpha # 步长因子
self.beta0 = beta0 # 初始吸引度
self.gamma = gamma # 光强吸收系数
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])
best_idx = np.argmin(fitness)
best_x = X[best_idx].copy()
best_f = fitness[best_idx]
convergence = []
for t in range(self.max_iter):
# 逐步减小步长
alpha_t = self.alpha * (0.9 ** (t / 100))
for i in range(self.pop):
for j in range(self.pop):
# 如果j比i更亮,则i向j移动
if fitness[j] < fitness[i]:
# 计算距离
r = np.linalg.norm(X[i] - X[j])
# 计算吸引度
beta = self.beta0 * np.exp(-self.gamma * r ** 2)
# 位置更新
epsilon = np.random.randn(self.dim)
X[i] = X[i] + beta * (X[j] - X[i]) + alpha_t * epsilon
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 rastrigin(x):
return 10 * len(x) + np.sum(x**2 - 10 * np.cos(2 * np.pi * x))
np.random.seed(42)
fa = FireflyAlgorithm(dim=30, pop=30, max_iter=500, alpha=0.5, gamma=1.0)
best_x, best_f, conv = fa.optimize(rastrigin)
print(f"最优适应度: {best_f:.2e}")
四、参数影响
| 参数 | 建议范围 | 影响 |
|---|---|---|
| alpha | 0.1-1.0 | 步长,影响收敛速度 |
| beta0 | 0.5-2.0 | 初始吸引度 |
| gamma | 0.1-10 | 光强吸收系数,影响搜索范围 |
五、实验结果
| 测试函数 | 理论最优 | FA结果 | 收敛速度 |
|---|---|---|---|
| Sphere | 0 | 4.56e-8 | 快 |
| Rastrigin | 0 | 0.067 | 中 |
| Ackley | 0 | 7.89e-6 | 快 |

六、总结
萤火虫算法FA的特点:
- 基于萤火虫发光的自然启发
- 亮度和吸引度机制引导搜索
- 参数调节相对简单
- 全局搜索能力较强
您的点赞是我创作的动力!
更多推荐
所有评论(0)