夏夜的湖边,草丛里千万只萤火虫明灭闪烁,像一场永不落幕的星光派对。你一定见过那画面:单只萤火虫的光微弱得转瞬即逝,可当成百上千的光点同时呼吸、闪动、彼此追逐时,整片湖岸就活了过来。生物学家告诉你,那光是求偶的信号;而剑桥学者杨新社(Xin-She Yang)在2008年从中提炼出一种算法——萤火虫算法(Firefly Algorithm,FA),它把“发光—吸引—靠近”的自然规则翻译成数学语言,成为群体智能家族中最浪漫的一员。本文就以“夏夜萤火虫派对”为线索,从灵感起源、核心机制到应用实战,带你一步步看懂这场光之舞。

岗位关联

掌握萤火虫算法,等于拥有一个即插即用的优化工具包。无论是调深度学习超参数、做图像分割,还是规划无人机路径,你都能用这套“光的语言”快速找到靠谱的解——这是AI工程师最实用的看家本领之一。

目录
  1. 可视化演示
  2. 灵感起源
  3. 核心机制
  4. 移动规则
  5. 参数调优
  6. 流程步骤
  7. 改进策略
  8. 应用领域
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示萤火虫算法FA的核心机制,包括光强吸引移动、光强衰减模型及优化收敛过程,通过交互控件调节吸收系数观察搜索行为变化。

本节配有交互动效(进入视口后自动加载,约 3KB)。

萤火虫吸引移动 亮萤火虫 暗萤火虫 β=β₀e^(-γr²) 暗虫向亮虫移动,吸引力随距离指数衰减

灵感起源

夏天的夜晚,湖边草丛里萤火虫明灭闪烁,像一场永不落幕的星光派对。生物学家告诉我们,那光不是装饰,而是生命最古老的情书——雄虫用光说“我很强壮”,雌虫用光应答“我看见你了”。2008年,剑桥学者杨新社(Xin-She Yang)把这场求偶派对翻译成了数学语言,萤火虫算法(Firefly Algorithm, FA)就此诞生,成为群体智能家族中又一颗闪亮的星。

群体智能家族早有先例:蚁群算法模拟蚂蚁觅食,粒子群算法模仿鸟群迁徙。FA的加入带来了一种全新的“社交方式”——个体之间没有命令,只有吸引。每只萤火虫都是一个候选解,它不需要完整的地图,只需要向身边更亮的那只靠拢。这种“就近跟随”的朴素智慧,恰恰是群体智能的精髓:复杂行为可以由简单规则涌现出来。

FA建立了三条理想化假设:其一,所有萤火虫不分性别,任何一只都会被更亮的同伴吸引;其二,吸引力与亮度成正比、与距离成反比,因为光在传播中会衰减;其三,若眼前没有更亮的萤火虫,它就随机漫步,等待灵感的降临。这三条假设把“求偶”抽象成纯粹的数值关系,让算法能以极少的参数完成搜索——这很像派对中不需要主持人,光线本身就是组织者。

派对开场时,舞者们散落各处,光影杂乱。但不用多久,亮光仿佛一种无声的指挥,人群开始聚拢、旋转、碰撞。没有主持人,每一束光都是主持人。这就是FA的底层逻辑:最朴素的光,组成了最迷人的秩序。

核心机制

派对上,你凭什么决定向谁靠近?答案写在亮度里。在FA中,“亮度”不是玄学,而是目标函数值的化身。求解一个优化问题,就是在一群萤火虫中找到最亮的那只——把抽象的数学目标翻译成肉眼可见的光。

如何把目标函数映射成亮度?对最大化问题,亮度 \(I(\mathbf{x}) = f(\mathbf{x})\),函数值越大越耀眼;对最小化问题,则取倒数或负号,函数值越小越亮。经过这一“打光”操作,“找最优解”就变成了“追最亮的光”。而吸引力并非恒定不变——它随两只萤火虫之间的距离指数衰减:

β(r)=β0⋅e−γr2\beta(r) = \beta_0 \cdot e^{-\gamma r^2}

再耀眼的舞者,站在舞台另一端也会显得模糊。\(\beta_0\) 决定你第一眼的惊艳,γ 决定这份惊艳能传多远,而 \(r\) 是你们之间真实的社交距离。算法把“社交距离感”编进了数学规则,每只萤火虫都因此拥有了对远近不同的光源差别的感知力。

I(x)=f(x)(最大化)或I(x)=1f(x)(最小化)I(\mathbf{x}) = f(\mathbf{x}) \quad \text{(最大化)} \quad \text{或} \quad I(\mathbf{x}) = \frac{1}{f(\mathbf{x})} \quad \text{(最小化)}
吸引力公式的通俗解释:两只萤火虫靠得越近,吸引力越接近最大值 \(\beta_0\);离得越远,光就越模糊,吸引力按指数缩水。
  1. 直接映射亮度最大化问题中,目标函数值 \(f(\mathbf{x})\) 越大,亮度越高,搜索方向就是“追大值”。
    I(x)=f(x) = 最大化时目标函数值越大亮度越高I(\mathbf{x}) = f(\mathbf{x}) \text{ = 最大化时目标函数值越大亮度越高}
  2. 倒数映射亮度最小化问题中,目标函数值越小,亮度越高,搜索方向被“掰”成“追小值”。
    I(x)=1f(x) = 最小化时目标函数值越小亮度越高I(\mathbf{x}) = \frac{1}{f(\mathbf{x})} \text{ = 最小化时目标函数值越小亮度越高}
  3. 最大吸引力基准当两只萤火虫距离为 0 时,吸引力达到上限 \(\beta_0\),相当于舞伴就在眼前时的心动满分。
    β0=距离 r=0 时的吸引力上限\beta_0 = \text{距离 } r = 0 \text{ 时的吸引力上限}
  4. 指数衰减因子\(e^{-\gamma r^2}\) 让吸引力随距离增大而急剧衰减,就像再亮的光穿过雾也会逐渐看不清。
    e−γr2=随距离 r 增大按指数规律衰减e^{-\gamma r^2} = \text{随距离 } r \text{ 增大按指数规律衰减}
  5. γ光吸收系数γ 控制衰减快慢,类似空气的浑浊度——越“浑浊”,光传得越近。
    γ=控制吸引力衰减速度的光吸收系数\gamma = \text{控制吸引力衰减速度的光吸收系数}

移动规则

现在舞者看到了目标,问题是怎么走。走太快会错过沿途的风景(跳过了可能更好的位置),走太慢又跟不上节奏。FA给出了一套聪明的“舞步”:既朝着更亮的舞伴移动,又保留一点随机发挥的自由——这和人类在派对中边聊天边移动、偶尔被旁边的人吸引偏转方向,是同样的道理。

假设第 \(i\) 只萤火虫被第 \(j\) 只吸引(\(j\) 比 \(i\) 亮),那么 \(i\) 的下一轮位置由三部分组成:当前位置、指向 \(j\) 的吸引项、以及随机扰动。用公式表达就是:

这支舞既有目标又有自由:离得远时,光弱、步子小,主要靠随机扰动探索未知;离得近时,光强、步子大,快速逼近舞伴完成局部精调。整个种群就这样在“跟随”与“探索”的平衡间跳完一整场舞——这正是FA区别于确定性算法的灵魂所在。

xi(t+1)=xi(t)+β0e−γrij2(xj(t)−xi(t))+αεi\mathbf{x}_i^{(t+1)} = \mathbf{x}_i^{(t)} + \beta_0 e^{-\gamma r_{ij}^2}(\mathbf{x}_j^{(t)} - \mathbf{x}_i^{(t)}) + \alpha \boldsymbol{\varepsilon}_i
位置更新公式的通俗解释:萤火虫 i 的新位置 = 旧位置 + 向更亮同伴 j 迈出的一步 + 一点随机“醉步”。三步合起来,既保证走向光明,又不至于走出“复制粘贴”的死板轨迹。
  1. 当前位置第 \(t\) 代时第 \(i\) 只萤火虫在解空间中的坐标向量,是移动的起点。
    xi(t)=第 i 只萤火虫在第 t 代的位置向量\mathbf{x}_i^{(t)} = \text{第 } i \text{ 只萤火虫在第 } t \text{ 代的位置向量}
  2. 吸引项由亮度差驱动的定向移动,方向指向 \(j\),步长正比于当前吸引力 \(\beta\)。离得越近,步子迈得越大。
    β0e−γrij2(xj(t)−xi(t))=向更亮者 j 的定向移动分量\beta_0 e^{-\gamma r_{ij}^2}(\mathbf{x}_j^{(t)} - \mathbf{x}_i^{(t)}) = \text{向更亮者 } j \text{ 的定向移动分量}
  3. 随机扰动项\(\alpha\) 控制振幅,\(\boldsymbol{\varepsilon}_i\) 是随机向量(通常取均匀分布或高斯分布),让萤火虫偶尔偏离直行道,探索新区域。
    αεi=振幅为 α 的随机噪声,维持种群的探索多样性\alpha \boldsymbol{\varepsilon}_i = \text{振幅为 } \alpha \text{ 的随机噪声,维持种群的探索多样性}

参数调优

每场派对都有音量旋钮、灯光旋钮和空调旋钮。FA也有三个关键旋钮:\(\alpha\)、\(\beta_0\)、\(\gamma\)。把它们调好,算法事半功倍;调歪了,全场舞者可能原地打转,或是像无头苍蝇一样乱撞。

\(\alpha\) 是随机步长,控制探索强度。\(\alpha\) 太大,萤火虫像喝醉的舞者到处乱窜,明明看到亮光也走不过去;\(\alpha\) 太小,舞步过于拘谨,早早停下脚步陷入局部最优。经验做法是让 \(\alpha\) 随迭代逐步衰减:派对前半场尽情探索,后半场专注收敛。一个经典的自适应策略是:

再说另外两个旋钮:\(\beta_0\) 一般取 1,把最大吸引力归一化,方便对比;\(\gamma\) 取值范围常在 \([0.01, 100]\) 之间,\(\gamma\) 越小,吸引力越“长手”,全局搜索能力强;\(\gamma\) 越大,只在近处产生吸引,局部搜索精细但容易迷失。种群规模通常取 20~40,足以保证多样性,又不至于让每轮比较的计算量过大。再好的舞者也需要合适的舞台:\(\alpha\) 是舞步的自由度,\(\beta_0\) 是初见的心动值,\(\gamma\) 是空气的透明度——三者协同,整场派对才能既热闹又有序。

α(t)=α0×0.95t\alpha(t) = \alpha_0 \times 0.95^t
自适应步长的通俗解释:每跳一轮舞,把随机步长缩小到原来的 95%,相当于越到派对尾声,舞者越认真、越少分心。
  1. 初始步长\(\alpha_0\) 是第一轮的随机扰动幅度,通常设为搜索空间宽度的 1%~10%。
    α0=初始随机扰动幅度\alpha_0 = \text{初始随机扰动幅度}
  2. 指数冷却\(0.95^t\) 让扰动每轮缩至 95%,迭代 20 轮后只剩约 36%,探索强度平滑下降。
    0.95t=第 t 轮将步长缩放至初始的 95%t0.95^t = \text{第 } t \text{ 轮将步长缩放至初始的 } 95\%^t
  3. 当前步长\(\alpha(t)\) 是第 \(t\) 代实际使用的随机扰动幅度,实现了“先广搜、后精调”的节奏。
    α(t)=第 t 代的随机扰动幅度\alpha(t) = \text{第 } t \text{ 代的随机扰动幅度}

流程步骤

派对要按照节目单进行。FA从开场到散场,一共五步,每一步都像一种社交动作:登场、亮相、寻找、靠近、谢幕。这五步听起来简单,执行起来却有条不紊。

第一步,初始化:在搜索空间里随机撒下 \(N\) 只萤火虫,设定各自的初始位置,就像舞者们刚入场时散落在舞池各处。第二步,计算亮度:用目标函数给每只萤火虫“打光”,确定谁的舞姿更耀眼。第三步,比较与移动:每只萤火虫依次查看其他同伴,若对方更亮,就朝对方迈出一步。第四步,更新最优:记录全场最亮的那只萤火虫的位置。第五步,判断终止:达到最大迭代次数、精度阈值或最优值不再明显改善,就散场;否则返回第二步继续跳。

其中第三步反复用到一个核心运算——距离计算。两只萤火虫相距多远,直接决定吸引力的大小,而高维空间中这个“多远”就是欧氏距离:

节目单虽简单,但执行上有个明显代价:每只萤火虫都要和其他 \(N-1\) 只逐一比较,所以总复杂度是 \(O(N^2)\)——派对规模越大,社交成本越高,这也是FA最常被吐槽的软肋。不过换个角度看,正是这种“逐一打量”让每只萤火虫都获得了全局视野,而不是只盯着一个领队。

rij=∥xi−xj∥=∑k=1d(xi,k−xj,k)2r_{ij} = \|\mathbf{x}_i - \mathbf{x}_j\| = \sqrt{\sum_{k=1}^{d}(x_{i,k} - x_{j,k})^2}
距离公式的通俗解释:把两只萤火虫的位置想象成地图上的两个点,距离就是把每个方向上的差距平方后加起来再开根号——一条直线上的实际间隔。
  1. 坐标差第 \(i\) 只与第 \(j\) 只在第 \(k\) 个维度上的位置差,反映了该方向上的“脚步差距”。
    xi,k−xj,k=第 k 个维度上的位置差x_{i,k} - x_{j,k} = \text{第 } k \text{ 个维度上的位置差}
  2. 平方求和把所有维度上的差值平方后累加,避免正负方向相互抵消,同时放大大差距的影响。
    ∑k=1d(xi,k−xj,k)2=各维度差值平方之和\sum_{k=1}^{d}(x_{i,k} - x_{j,k})^2 = \text{各维度差值平方之和}
  3. 欧氏距离对平方和取算术平方根,得到两萤火虫在 \(d\) 维空间中的直线距离,是吸引力公式的“输入值”。
    rij=∑k=1d(xi,k−xj,k)2=两只萤火虫在 d 维空间中的直线距离r_{ij} = \sqrt{\sum_{k=1}^{d}(x_{i,k} - x_{j,k})^2} = \text{两只萤火虫在 } d \text{ 维空间中的直线距离}

改进策略

原版FA像一位有天赋但固执的舞者:参数固定、步调单一、缺了点随机应变的本事。因此研究者们不断给它“加课”,催生了许多改进方案——这些方案不是为了颠覆,而是让萤火虫跑得更稳、更远。

最常用的改进是自适应参数策略:让 \(\alpha\)、\(\beta_0\)、\(\gamma\) 随迭代动态变化。比如 \(\alpha\) 从 0.5 逐步降到 0.01,前期大范围探索、后期精细搜索,省去手动调参的烦恼。第二种思路是引入变异算子——借鉴遗传算法,在种群中随机挑选个体施加扰动,相当于派对中突然混入一位跳新舞步的陌生舞者,逼着大家走出舒适区,防止整个种群过早“抱团”在同一片小区域。

第三种是面向多目标优化问题的扩展:把亮度定义成向量,用帕累托(Pareto)支配关系代替简单的“谁更亮”排序。此时一只萤火虫不再只追逐单一强光,而是不断更新一组体现多目标权衡的非劣解前沿。还有混合策略,让FA先找到有希望的区域,再用爬山法或梯度法进行局部精雕细琢——相当于先靠直觉锁定舞伴,再用专业舞步完成收尾。

改良之后,派对变得更加精彩:自适应参数像DJ根据气氛随时切换音乐,变异算子像突然加进来的新面孔带来新舞步,多目标扩展让一场派对同时服务多个心愿。萤火虫舞蹈的内核没有变,但它的舞台已经比夏夜湖岸宽阔得多。

应用领域

这只算法的萤火虫早已飞出夏夜,落到工控机、服务器和自动驾驶汽车上。凡是“搜索空间大、目标函数不光滑、人工调参费时”的问题,都可以试着放一群萤火虫进去,让光来引路。

在AI领域,FA最常见的落地是超参数自动调优:深度学习模型的 learning rate、batch size、网络层数等参数组合多如星辰,网格搜索逐点试探耗费数日,FA则把一组超参数编码成一只萤火虫的位置,亮度设为验证集准确率,几十轮内就能找到近乎最优的配置。图像分割中的阈值搜索也常用FA——把多个分割阈值当作萤火虫的坐标,用类间方差或熵函数打光,快速定位最佳分割点。除此之外,电力系统的经济调度、供应链的路径优化、无线传感器网络的节点部署,都有FA活跃的身影。

FA尤其适合中等规模、非凸、多峰值的优化问题。由于亮度吸引机制天然是并行的,多只“亮虫”可以同时锁定多个峰值,避免像梯度下降那样一头扎进最近的坑里——这正是“派对分散注意力”的意外好处。

从湖边的夏夜到芯片上的电路,萤火虫没有被现代科技遗忘。它提醒我们:最古老的答案往往藏在最简单的自然里。只要有光,就有方向。

AI 应用场景

深度学习超参数自动调优

阶段:模型训练与调优阶段

解决的问题:深度学习模型的超参数组合空间巨大,人工调参依赖经验和运气,网格搜索随参数维度增加呈指数级爆炸。FA将每组超参数(学习率、批大小、层数等)编码为一只萤火虫的位置,亮度设为验证集准确率,用“亮度吸引”机制自动搜索优秀组合,省去成千上万次手动试训。

具体案例:某视觉团队训练图像分类模型时,用FA在约40轮迭代内评估了50组超参数组合,找到比人工配置验证集准确率高1.8%的方案,全程仅2小时;而同样的搜索空间用网格扫描需要约3天。

医学图像多阈值分割

阶段:图像预处理与特征提取阶段

解决的问题:图像分割中经典的Otsu法对噪声敏感,多阈值分割需要穷举全部阈值组合,计算量随阈值个数指数增长。FA把阈值向量(如三个分割点)当作萤火虫位置,用类间方差或信息熵作亮度函数,自动搜索使类间差异最大的最优阈值组合。

具体案例:在肺部CT影像分割任务中,用FA搜索3个最佳分割阈值,将肿瘤区域分割的Dice系数从0.82提升到0.89,且对引入高斯噪声后的图像仍保持稳定,显著优于固定阈值方案。

无人机编队路径规划

阶段:规划与决策阶段

解决的问题:多无人机协同巡检要在满足避障、续航约束下规划最短总路径,传统A\*算法难以处理多机同时调度的组合爆炸。FA将整个编队的航点序列编码为多只萤火虫,亮度定义为路径总长度与碰撞风险的加权和目标,通过种群迭代逼近最优编队路线。

具体案例:某物流企业用FA规划5架无人机在城区20个投递点的编队巡航路线,仿真验证总飞行距离比人工规划减少12%,同时将各机到达时间差控制在30秒以内,保障了协同投递效率。

Python 演示

python51 行
import mathimport random  def objective(x):    """Sphere 函数: 最小值 0, 位于原点"""    return sum(v * v for v in x)  def firefly_algorithm(dim=2, pop_size=20, alpha=0.5, beta0=1.0,                      gamma=1.0, max_iter=50, bounds=(-10.0, 10.0)):    # 初始化萤火虫种群    fireflies = []    for _ in range(pop_size):        pos = [random.uniform(bounds[0], bounds[1]) for _ in range(dim)]        fireflies.append([pos, objective(pos)])     best = min(fireflies, key=lambda f: f[1])    history = [best[1]]     for _ in range(max_iter):        for i in range(pop_size):            for j in range(pop_size):                if fireflies[j][1] < fireflies[i][1]:                    # 计算欧氏距离                    dist = math.sqrt(sum(                        (fireflies[i][0][k] - fireflies[j][0][k]) ** 2                        for k in range(dim)                    ))                    # 吸引力: 随距离指数衰减                    beta = beta0 * math.exp(-gamma * dist * dist)                    # 位置更新: 吸引项 + 随机扰动                    for k in range(dim):                        fireflies[i][0][k] += beta * (                            fireflies[j][0][k] - fireflies[i][0][k]                        ) + alpha * (random.random() - 0.5)                    # 重新计算亮度                    fireflies[i][1] = objective(fireflies[i][0])                    # 更新全局最优                    if fireflies[i][1] < best[1]:                        best = [fireflies[i][0][:], fireflies[i][1]]        history.append(best[1])     return best, history  if __name__ == "__main__":    best, history = firefly_algorithm()    print("最优位置:", [round(v, 4) for v in best[0]])    print("最优值:", round(best[1], 6))    print("前10代收敛曲线:", [round(h, 4) for h in history[:10]])
目的:用Python实现一个完整的萤火虫算法,求解Sphere函数的最小值,并输出每代最优值的收敛曲线。这份代码稍加修改即可用于任何目标函数的优化。
  1. fireflies.append([pos, objective(pos)])每只萤火虫用 [位置,亮度] 二元组表示,亮度就是目标函数值。
  2. best = min(fireflies, key=lambda f: f[1])找出当前全场最亮(目标值最小)的萤火虫作为全局最优。
  3. if fireflies[j][1] < fireflies[i][1]:核心比较逻辑:只要对方更亮,第 i 只萤火虫就朝它移动。
  4. dist = math.sqrt(sum(...))计算两只萤火虫的欧氏距离,这是吸引力公式的输入。
  5. beta = beta0 * math.exp(-gamma * dist * dist)吸引力随距离指数衰减,距离越远越“看不见”。
  6. fireflies[i][0][k] += beta * (...) + alpha * (random.random() - 0.5)位置更新 = 定向吸引 + 随机扰动,保持探索能力。
  7. best = [fireflies[i][0][:], fireflies[i][1]]用切片复制位置,避免后续修改污染最优记录。

常见误区

误区亮度不就是目标函数值吗?我直接把函数值当亮度用不就行了,折腾那么多干什么。

正解只有求解最大化问题时才能直接取 \(I=f(x)\)。求解最小化问题时必须取倒数 \(I=1/f(x)\) 或负号 \(I=-f(x)\),否则“最亮”和“最优”的方向正好相反,算法会朝着错误方向搜索。此外,工程中常对亮度做归一化,避免函数值跨量级(比如 \(10^3\) 和 \(10^{-3}\))导致吸引失真。这就像测体温:38.5℃ 和 39℃ 差别不大,但用华氏度表示后数字差异会变大,直接用原始读数比较容易误判。

为何常见:初学者看公式时只记住了 \(I=f(x)\) 这一种写法,忽略了“亮的方向”必须与优化方向一致这个前提。

误区\(\beta_0\) 是最大吸引力,那我把它设成 10、100,萤火虫不就能跑得更快、更快收敛了吗?

正解\(\beta_0\) 过大会让远离目标的萤火虫以过大的步长跳跃,直接越过最优点,在附近震荡,反而难以收敛。同时 \(\alpha\) 与 \(\beta_0\) 需要联动:\(\beta_0\) 负责“利用”,\(\alpha\) 负责“探索”,两者失衡都会让性能暴跌。就像追求舞伴用力过猛会扑空摔倒,慢慢靠近反而更稳。

为何常见:直觉上认为“力度大=速度快=效果好”,忽略了搜索地形复杂时超调量会毁掉收敛性。

误区\(\gamma\) 是个物理常数,算法反正能跑,填 1 还是填 100 无所谓。

正解\(\gamma\) 直接决定两只相距较远的萤火虫能否互相感知。\(\gamma=0\) 时吸引力不衰减,所有萤火虫对所有同伴“全亮可见”,算法退化为类似 PSO 的全连接吸引;\(\gamma\) 极大时,只有近在咫尺的萤火虫才看得见对方,种群被割裂成互不相干的几小撮。这两种极端都会严重破坏算法平衡,通常建议 \(\gamma \in [0.01, 100]\) 并按搜索空间尺度调优。就像派对里空气太清新、百米外都能看清舞伴,和满天大雾、贴脸都看不清,氛围完全两回事。

为何常见:\(\gamma\) 名字叫“光吸收系数”,听起来像无关紧要的物理常数,容易被忽略其对搜索行为的关键影响。

误区FA 的位置更新也有吸引项和随机项,这不就是 PSO 换个皮吗?

正解两者机制有本质差异。PSO 中每个粒子只受“自身历史最优”和“全局最优”两个向量引导,方向明确但信息单一;FA 中每只萤火虫会被所有比自己亮的同伴吸引,而且吸引力随距离动态变化,相当于同时有多个引力中心。这使得 FA 能天然地多点并行搜索多个峰,更擅长多峰问题,但代价是 \(O(N^2)\) 的复杂度。可以把 PSO 想象成跟着一个领队走,FA 则是被四面八方所有发光的人牵动。

为何常见:两个算法的公式外形相似(位置+引导项+随机项),初学者容易只看表象而忽略“几个引力源”这一结构性区别。

面试题

Q1. 萤火虫算法属于哪一类算法?

单选题 · easy

  • A.确定性精确算法
  • B.元启发式群体算法← 正确答案
  • C.贪心局部搜索算法
  • D.纯随机游走算法

答案:B。FA 属于元启发式群体智能算法,依赖种群中个体间的吸引规则涌现全局搜索能力。A 错在 FA 含随机性、不保证精确解;C 错在 FA 不局限于局部贪心;D 错在 FA 有吸引项,并非纯随机。

Q2. 在最小化优化问题中,萤火虫的“亮度”应如何定义?

单选题 · easy

  • A.直接取目标函数值
  • B.取目标函数的倒数← 正确答案
  • C.取一个固定常量
  • D.取全部个体均值

答案:B。最小化问题中目标值越小越好,而亮度越大越吸引他人,因此要取倒数 \(I=1/f(x)\) 或负号把方向掰过来。A 只适用于最大化问题;C 会使亮度失去区分度;D 与个体优劣无关。

Q3. FA 吸引力公式 β(r)=β0·e^(-γr²) 中,γ=0 时会发生什么?

单选题 · mid

  • A.吸引力不随距离衰减← 正确答案
  • B.萤火虫看不见任何同伴
  • C.吸引力与距离成正比
  • D.随机扰动全部消失

答案:A。γ=0 时指数项 e^0=1,吸引力恒为 β0,任意距离都满额吸引,退化为全连接吸引机制。B 是 γ→∞ 的极端情况;C 与公式不符;D 中 γ 不影响 α 控制的随机项。

Q4. FA 位置更新中,随机扰动项 αε 的主要作用是?

单选题 · mid

  • A.加速向全局最优收敛
  • B.维持种群多样探索能力← 正确答案
  • C.计算两只萤火虫距离
  • D.提升目标函数精度

答案:B。随机项让个体有机会偏离吸引导向的路径,探索未访问区域,防止种群过早陷入局部最优。A 是吸引项的作用;C 是距离公式的职责;D 与随机扰动无直接关系。

Q5. FA 的时间复杂度为 O(N²),最主要原因是?

单选题 · mid

  • A.种群数量 N 呈平方级增长
  • B.每只都需比较全部同伴← 正确答案
  • C.目标函数本身计算量巨大
  • D.迭代次数固定为 N 的平方

答案:B。核心循环中,每只萤火虫都要与其余 N-1 只逐一比较亮度并计算距离,因此是 O(N²)。A 错在种群数量是人为设定;C 与算法结构无关;D 错在迭代次数独立于 N 设置。

Q6. FA 中影响一只萤火虫移动方向的因素有?

多选题 · mid

  • A.比它更亮的同伴位置← 正确答案
  • B.与同伴之间的距离← 正确答案
  • C.随机扰动向量← 正确答案
  • D.个体历史最优记忆

答案:ABC。吸引项由更亮同伴的位置决定,距离通过指数衰减影响吸引力大小,随机向量也参与位置更新。FA 没有“个体历史最优”概念,那是 PSO 的特征,所以 D 错误。

Q7. 与粒子群算法 PSO 相比,FA 最核心的区别是什么?

单选题 · hard

  • A.不需要初始化萤火虫种群
  • B.吸引力多对多且随距离衰减← 正确答案
  • C.不使用目标函数判断亮度
  • D.只能求解单峰优化问题

答案:B。FA 中每只萤火虫受所有更亮者吸引,且吸引力随距离指数衰减,而 PSO 只用个体历史最优和全局最优两个向量引导。A、C、D 均与事实相反,属于干扰项。

Q8. 下列哪些措施能有效改善 FA 的早熟收敛问题?

多选题 · hard

  • A.引入变异算子增加扰动← 正确答案
  • B.使用自适应 alpha 衰减策略← 正确答案
  • C.多只萤火虫合并到局部最优
  • D.动态调整 gamma 扩大感知范围← 正确答案

答案:ABD。变异算子增加种群多样性,自适应 alpha 让前期探索充分、后期精细收敛,动态 gamma 可扩大或缩小感知范围以跳出局部坑。C 把萤火虫合并到局部最优会减少多样性,反而加剧早熟。

Q9. 两只萤火虫距离 r=1,β0=1,γ 从 0.1 增大到 1,则吸引力如何变化?

单选题 · mid

  • A.从约 0.90 降为约 0.37← 正确答案
  • B.从 0.11 升为 1.00
  • C.与 γ 变化保持完全无关
  • D.从 1.00 降为 0.01

答案:A。代入公式:e^(-0.1×1)≈0.905,e^(-1×1)≈0.368,所以吸引力从约 0.90 降到约 0.37。这说明 γ 越大,衰减越剧烈,远端吸引越弱。其余选项数值均不符合计算。

Q10. FA 迭代终止的常见条件有哪些?

单选题 · easy

  • A.达到最大迭代次数
  • B.最优亮度不再提升
  • C.达到设定精度阈值
  • D.以上条件都可以← 正确答案

答案:D。工程实现中三种终止条件都很常用,可单独或叠加使用:迭代次数上限保证最迟收敛时间,亮度停滞判断防止空转,精度阈值保证解的质量。A、B、C 各自都是合法的终止条件,因此选择 D。