在这里插入图片描述

【智能优化】萤火虫算法(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)=I0eγr2

吸引度:
β(r)=β0⋅e−γr2\beta(r) = \beta_0 \cdot e^{-\gamma r^{2}}β(r)=β0eγ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+β0eγrij2(xjxi)+αϵ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的特点:

  • 基于萤火虫发光的自然启发
  • 亮度和吸引度机制引导搜索
  • 参数调节相对简单
  • 全局搜索能力较强

您的点赞是我创作的动力!

更多推荐