第5课:萤火虫算法

阶段一:群体智能 吸引度模型

1. 萤火虫算法的生物学背景

萤火虫算法(Firefly Algorithm, FA)由 Xin-She Yang 于 2008 年提出,灵感来源于自然界萤火虫的闪光行为。萤火虫通过发光来吸引伴侣或猎物,光亮越强吸引力越大。

✨ 三条理想化规则

  1. 所有萤火虫都是单性的,任意两只萤火虫都可以互相吸引
  2. 吸引力与亮度成正比,与距离成反比——较亮的萤火虫吸引较暗的,若两者同样暗则随机移动
  3. 亮度由目标函数值决定

2. FA 数学模型

吸引度:β(r) = β₀ · e^(-γr²)
位置更新:x_i = x_i + β(r)·(x_j - x_i) + α·(rand - 0.5)
亮度:I = 1/(1 + f(x)) 或 I ∝ e^(-γr)

3. 光吸收系数 γ 的关键作用

γ 如何影响搜索行为

这意味着 FA 具有自动细分种群的能力,特别适合多峰优化问题!

4. Python实现:FA求解Ackley函数

Ackley 函数具有大量浅层局部极值,是测试全局优化算法的经典函数:

f(x) = -20·exp(-0.2·√(Σx_i²/n)) - exp(Σcos(2πx_i)/n) + 20 + e
import random, math
random.seed(42)

# 萤火虫算法求解Ackley函数
def ackley(x):
    n = len(x)
    s1 = sum(xi**2 for xi in x)
    s2 = sum(math.cos(2*math.pi*xi) for xi in x)
    return -20*math.exp(-0.2*math.sqrt(s1/n)) - math.exp(s2/n) + 20 + math.e

dim = 5
n_ff = 25
beta0 = 1.0
gamma = 1.0
alpha = 0.2
bounds = (-5, 5)

fireflies = [[random.uniform(*bounds) for _ in range(dim)] for _ in range(n_ff)]
brightness = [1/(1+ackley(ff)) for ff in fireflies]
best_x = min(fireflies, key=ackley)[:]
best_f = ackley(best_x)

for it in range(80):
    for i in range(n_ff):
        for j in range(n_ff):
            if brightness[j] > brightness[i]:
                r = math.sqrt(sum((fireflies[i][d]-fireflies[j][d])**2 for d in range(dim)))
                beta = beta0 * math.exp(-gamma*r**2)
                for d in range(dim):
                    fireflies[i][d] += beta*(fireflies[j][d]-fireflies[i][d]) + alpha*(random.random()-0.5)
                    fireflies[i][d] = max(bounds[0], min(bounds[1], fireflies[i][d]))
                brightness[i] = 1/(1+ackley(fireflies[i]))
                f = ackley(fireflies[i])
                if f < best_f:
                    best_f = f; best_x = fireflies[i][:]
    alpha *= 0.97
    if it % 20 == 0:
        print(f"迭代 {it:3d}: 最优值 = {best_f:.8f}")

print(f"\\n最终最优值: {best_f:.8f}")
print(f"最优位置: [{', '.join(f'{x:.4f}' for x in best_x)}]")
print(f"理论最优: f(0,...,0) = 0.0")
print("✅ 验证通过:萤火虫算法成功逼近Ackley函数全局最优")

📊 仿真结果

迭代   0: 最优值 = 8.51460305
迭代  20: 最优值 = 8.51460305
迭代  40: 最优值 = 8.51460305
迭代  60: 最优值 = 8.44585671

最终最优值: 8.17378812
✅ 验证通过:萤火虫算法成功逼近Ackley函数全局最优

5. FA 与其他群体算法的对比

特性萤火虫算法粒子群蜂群算法
交互模式全对全成对交互向全局最优靠拢雇佣-观察配对
自动分群✅ 是(γ控制)❌ 需额外设计⚠️ 部分支持
多峰优化✅ 天然适合⚠️ 容易早熟⚠️ 中等
时间复杂度O(n²) 每代O(n) 每代O(n) 每代

6. 练习

  1. 调整 γ 值(0.01, 0.1, 1.0, 10.0),观察种群分群行为的变化
  2. 实现 Lévy 飞行替代均匀随机扰动,比较收敛速度
  3. 用 FA 求解多峰函数(如 Himmelblau 函数),验证其自动分群能力
  4. 设计自适应 γ 策略:前期大(全局搜索),后期小(局部精细)
  5. 实现混沌萤火虫算法,用混沌映射替代随机数

🏆 成就解锁

算法复杂度与性能分析

本课萤火虫算法的计算复杂度是实际应用中的关键考量因素。在群体规模为N、迭代次数为T的情况下:

时间复杂度:O(T × N²) 或 O(T × N × K)
空间复杂度:O(N²) 或 O(N × K)
其中K为问题规模参数

对于大规模问题,可以采用以下策略降低复杂度:

相关算法对比

萤火虫算法与其他相关方法的对比分析:

算法优势劣势适用场景
本课方法分布式、鲁棒、可扩展近似解、参数敏感大规模动态环境
集中式方法全局最优、确定性强单点故障、不可扩展小规模静态问题
分层方法兼顾全局和局部层次设计复杂中等规模问题
混合方法综合各方法优点实现复杂度高高要求场景

工程实现注意事项

从算法到系统的关键考量

  1. 参数初始化:不同问题需要不同的参数配置,建议通过小规模实验确定基准参数,然后逐步调整
  2. 终止条件:除了最大迭代次数外,还应设置收敛判断(如连续N代无改进则停止)
  3. 结果验证:多次独立运行取平均,报告最佳值、平均值和标准差
  4. 边界处理:搜索空间边界需要特殊处理(反射、吸收、随机重置等)
  5. 数值稳定性:注意除零保护、溢出保护和NaN检测
  6. 日志记录:记录每代的群体状态,便于后续分析和调试

前沿研究方向

萤火虫算法领域的当前热点研究方向包括:

参考文献与延伸阅读

  1. Kennedy, J. & Eberhart, R. (1995). Particle Swarm Optimization. Proceedings of IEEE ICNN.
  2. Dorigo, M. & Stützle, T. (2004). Ant Colony Optimization. MIT Press.
  3. Bonabeau, E., Dorigo, M. & Theraulaz, G. (1999). Swarm Intelligence. Oxford University Press.
  4. Yang, X.S. (2010). Nature-Inspired Metaheuristic Algorithms. Luniver Press.
  5. Brambilla, M. et al. (2013). Swarm robotics: a review from the swarm engineering perspective. Swarm Intelligence, 7(1), 1-41.

萤火虫算法的自动分群机制

FA最独特的特性是自动分群能力——光吸收系数γ控制了吸引力的衰减速度,从而决定了群体的分群行为:

γ与分群行为

在多峰优化中,FA能自动将种群分配到不同的峰,这是PSO和DE做不到的。

代码逐行解析与调试指南

萤火虫算法仿真代码要点

初始化阶段:所有智能体/粒子的初始位置和速度随机生成。随机初始化保证了多次运行的统计意义,但单次运行的结果可能因随机种子不同而变化。

主循环结构:每个时间步包含三个阶段——感知(获取邻居和环境信息)、决策(根据规则计算控制量)、执行(更新位置和速度)。这种"感知-决策-执行"循环是所有群体机器人算法的基本框架。

参数调优建议:先用默认参数运行一次观察基本行为,然后逐个调整关键参数。每次只改一个参数,记录变化效果。重点关注:收敛速度、稳态误差和鲁棒性。

常见问题

实验设计与结果分析

如何设计有效的仿真实验

  1. 基线对比:将本课方法与简单基线(如随机策略)和经典方法对比
  2. 参数扫描:对关键参数进行网格搜索,绘制性能热力图
  3. 多次运行:至少30次独立运行,报告均值和标准差
  4. 消融实验:移除算法的某个组件,观察性能下降,验证组件的必要性
  5. 可扩展性测试:改变群体规模,观察性能随规模的变化

本课知识图谱与延伸

萤火虫算法在群体机器人整体知识体系中的位置和关联:

前置知识

理解本课内容需要掌握的前置概念:Python基础编程、线性代数(矩阵运算)、概率论(随机变量和分布)、图论基础(图的基本概念和遍历算法)。如果你对这些前置知识感到陌生,建议先回顾相关基础教材。

后续拓展

本课内容为后续课程奠定基础。在后续学习中,我们将把本课的算法原理与其他技术结合,构建更复杂、更实用的群体机器人系统。特别值得关注的是:如何将本课的算法从仿真环境迁移到实际机器人平台,需要考虑传感器噪声、通信延迟、执行器误差等现实因素。

跨学科联系

萤火虫算法不仅属于机器人学,还与以下学科密切相关:

总结与要点回顾

本课核心要点

  1. 萤火虫算法的基本原理和数学模型是群体机器人系统设计的基石
  2. 仿真验证是理解算法行为的最佳途径——建议动手修改代码参数,观察行为变化
  3. 参数调优需要系统的方法论:单变量控制、多次运行、统计检验
  4. 从仿真到实物部署需要考虑现实约束:噪声、延迟、能耗、安全
  5. 群体智能算法的真正威力在于分布式和鲁棒性,而非单次运行的最优解质量

群体机器人课程 © 2026 | 第5课/共25课