正在加载中...

展开本页目录
算法教程FA-萤火虫算法

FA-萤火虫算法

No.184 · 在线教程

萤火虫算法(Firefly Algorithm, FA)是一类模拟萤火虫相互吸引行为的连续优化方法。本项目的实现位于 FA-萤火虫算法/core/facalculator.py,采用经典单目标连续型 FA:按适应度对个体排序,较差个体依次向更优个体靠近,并叠加随机扰动项;同时支…

FA-萤火虫算法

1. 方法概述

萤火虫算法(Firefly Algorithm, FA)是一类模拟萤火虫相互吸引行为的连续优化方法。本项目的实现位于 FA-萤火虫算法/core/fa_calculator.py,采用经典单目标连续型 FA:按适应度对个体排序,较差个体依次向更优个体靠近,并叠加随机扰动项;同时支持最大化问题、自定义表达式目标和上传数据代理优化。

设第 \(i\) 个萤火虫在第 \(t\) 轮迭代时的位置为

$$ \boldsymbol{x}_i^{(t)}=(x_{i1}^{(t)},x_{i2}^{(t)},\ldots,x_{id}^{(t)})^\top\in\Omega \tag{1} $$

其中 \(d\) 为维度,\(\Omega=[\boldsymbol{l},\boldsymbol{u}]\subset\mathbb{R}^d\) 为搜索区间。项目在最小化模式下直接优化目标函数;在最大化模式下则对目标取相反数后再执行内部最小化。

2. 问题定义与代理优化

2.1 基本优化问题

对于基准函数或自定义表达式目标,项目求解

$$ \min_{\boldsymbol{x}\in\Omega} f(\boldsymbol{x}) \tag{2} $$

当用户选择最大化时,程序将其等价转换为

$$ \min_{\boldsymbol{x}\in\Omega} \tilde{f}(\boldsymbol{x}),\qquad \tilde{f}(\boldsymbol{x})=-f(\boldsymbol{x}) \tag{3} $$

2.2 上传数据代理优化

problem_mode=upload_surrogate 时,系统基于上传样本训练随机森林代理模型。设样本集为

$$ \mathcal{D}=\{(\boldsymbol{x}^{(n)},y^{(n)})\}_{n=1}^{N_s} \tag{4} $$

则代理目标函数为

$$ \hat{f}(\boldsymbol{x})=\frac{1}{B}\sum_{b=1}^{B}T_b(\boldsymbol{x}) \tag{5} $$

其中 \(B=300\) 为回归树数量。对应的搜索边界由训练样本特征极值给出:

$$ l_j=\min_{1\le n\le N_s}x_j^{(n)},\qquad u_j=\max_{1\le n\le N_s}x_j^{(n)} \tag{6} $$

3. 核心数学模型

3.1 初始化

设种群规模为 \(N\)。程序按均匀分布生成初始种群:

$$ \boldsymbol{x}_i^{(0)}=\boldsymbol{l}+\boldsymbol{r}_i\odot(\boldsymbol{u}-\boldsymbol{l}),\qquad \boldsymbol{r}_i\sim U(0,1)^d \tag{7} $$

并计算每个个体的适应度

$$ F_i^{(t)}=f(\boldsymbol{x}_i^{(t)}) \tag{8} $$

每轮迭代开始时,项目会按适应度从优到劣排序种群。

3.2 个体间距离与吸引度

对第 \(i\) 个萤火虫和更优的第 \(j\) 个萤火虫,其欧氏距离定义为

$$ r_{ij}=\|\boldsymbol{x}_i-\boldsymbol{x}_j\|_2 \tag{9} $$

对应吸引度写为

$$ \beta_{ij}=(\beta_0-\beta_{\min})\exp(-\gamma r_{ij}^2)+\beta_{\min} \tag{10} $$

其中 \(\beta_0\) 为初始吸引度,\(\beta_{\min}\) 为最小吸引度,\(\gamma\) 为吸引衰减参数。

3.3 位置更新

项目实现中,对排序后位置靠后的个体 \(i\),会依次遍历所有更优个体 \(j<i\),并按如下公式连续更新:

$$ \boldsymbol{x}_i \leftarrow \boldsymbol{x}_i +\beta_{ij}\left(\boldsymbol{x}_j-\boldsymbol{x}_i\right) +\alpha\left(\boldsymbol{\xi}-0.5\right)\odot(\boldsymbol{u}-\boldsymbol{l}) \tag{11} $$

其中 \(\boldsymbol{\xi}\sim U(0,1)^d\),\(\alpha\) 为随机扰动系数。该实现是“顺序向所有更优个体靠近”,而不是只向当前全局最优点单次更新。

3.4 边界处理

fa_calculator.py 中采用的是随机重置式边界处理。若某一维越界,则该分量直接在对应区间内重新采样:

$$ x_{ij}\leftarrow l_j+\eta_{ij}(u_j-l_j),\qquad \eta_{ij}\sim U(0,1) \tag{12} $$

仅对越界分量应用该替换,未越界分量保持不变。

3.5 参数衰减与最优记录

每轮迭代结束后,随机扰动参数按指数方式衰减:

$$ \alpha^{(t+1)}=\alpha^{(t)}\cdot \rho_\alpha \tag{13} $$

其中 \(\rho_\alpha\) 对应代码中的 alpha_damp。全局最优值记为

$$ g^{(t)}=\min_{1\le i\le N}F_i^{(t)} \tag{14} $$

程序将 \(\{g^{(t)}\}_{t=1}^{T}\) 作为最佳收敛曲线输出。

4. 算法流程

根据 FACalculator._fa_single_run,本项目的 FA 求解步骤为:

  1. 解析问题模式,确定是基准函数、自定义表达式还是上传代理优化。
  2. 在给定边界内初始化萤火虫种群,并计算初始适应度。
  3. 每轮按适应度排序,记录当前全局最优个体。
  4. 对每个较差个体,依次向所有更优个体执行式(11)的吸引更新。
  5. 对越界分量执行式(12)的随机重置。
  6. 更新个体适应度与全局最优值,并按式(13)衰减 \(\alpha\)。
  7. 若设置 runs>1,则对多次独立运行的最佳收敛曲线和最终最优值做统计汇总。

5. 关键参数说明

  • pop_size:种群规模 \(N\)。
  • max_iter:最大迭代次数 \(T\)。
  • alpha:随机扰动幅度,对应式(11)。
  • beta0:初始吸引度,对应式(10)。
  • betamin:最小吸引度,对应式(10)。
  • gamma:吸引度随距离衰减的系数,对应式(10)。
  • alpha_damp:随机扰动衰减比例,对应式(13)。
  • runs:独立重复运行次数。
  • minmax:目标方向,max 时通过目标符号翻转处理。

6. 评价指标与输出结果解释

设共有 \(R\) 次独立运行,第 \(r\) 次运行最终最优值记为 \(b_r\),则项目会统计:

$$ b_{\mathrm{best}}= \begin{cases} \min_{1\le r\le R}b_r, & \text{最小化}\\ \max_{1\le r\le R}b_r, & \text{最大化} \end{cases} \tag{15} $$

$$ \bar{b}=\frac{1}{R}\sum_{r=1}^{R}b_r \tag{16} $$

$$ s_b=\sqrt{\frac{1}{R-1}\sum_{r=1}^{R}(b_r-\bar{b})^2} \tag{17} $$

输出结果通常包括:

  • Parameters:算法参数、边界、问题模式及上传模式附加信息;
  • Summary:目标名称、优化方向、运行次数、best_fitnessbest_run
  • RunSummary:每次运行的 best_fitness_adjusted / best_fitness
  • BestPosition:最终最优位置向量;
  • Convergence_Best:代表性最佳运行的收敛曲线;
  • Convergence_Mean:多次运行均值曲线;当 runs=1 时与最佳运行曲线一致;
  • PopulationPopulationFitness:最佳运行末代种群及其适应度,只有群体规模不大时才导出;
  • Charts:收敛曲线、箱线图和最优解分量图路径;
  • 上传代理模式下额外导出 BoundsUploadedDataSurrogateMetrics

论文结果部分建议先报告 SummaryRunSummary 中的最优值统计,再利用 Convergence_BestConvergence_Mean 展示收敛趋势,并把 BestPosition 作为最优解向量表。若导出了 PopulationPopulationFitness,可将其作为附录中的末代种群分布说明材料;上传代理模式下还应同时报告 SurrogateMetrics

7. 论文写作模板

可在论文方法部分表述为:

“本文采用萤火虫算法对连续变量单目标问题进行求解。算法首先在变量边界内随机生成初始种群,并按目标函数值对个体排序;随后令较差个体依次向更优个体靠近,靠近强度由距离衰减的吸引度控制,同时叠加随机扰动项以增强全局探索能力。为平衡探索与开发,随机扰动系数在迭代过程中按固定比例衰减。对于越界分量,本文采用区间内随机重置策略。对于数据驱动问题,则先训练随机森林代理模型,再以代理函数作为 FA 的优化目标。”

7.1 结果部分补充模板

若需把实验结果直接写入论文结果部分,可进一步表述为:

“表X给出了算法在当前问题上的最优目标值、平均最优值和标准差(如有多次独立运行),图X展示了收敛曲线变化。结果表明,该算法在迭代前期能够快速逼近优势区域,并在后期逐步趋于稳定,最终获得最优解 \(\boldsymbol{x}^*\) 及其对应目标值 \(f(\boldsymbol{x}^*)\)。对于上传代理优化场景,结合代理模型误差指标可认为该最优结果具有一定的数据驱动解释性。”

7.2 写作替换提示

为便于直接落稿,正文撰写时可将结果文件中的字段替换为以下论文措辞:

  • best_fitness 或结果汇总表中的最优值,可写为“最优目标函数值”或“最优适应度值”;
  • BestSolutionBestPositionBest_Solution最优解 等工作表,可统一写为“最优决策变量组合 \(\boldsymbol{x}^*\)”;
  • Convergence收敛曲线 等图表,可统一写为“算法收敛曲线图”;
  • SurrogateMetrics 可写为“代理模型训练误差与拟合优度指标”,如 RMSE、MAE、\(R^2\)。

7.3 可直接替换的论文结果段落

若需进一步直接落稿,可按以下模板替换其中的表号、图号和数值:

“由表X可知,该算法在[问题名称]上的最优目标值为 [best_fitness]。若进行了多次独立运行,则其平均最优值与标准差分别为 [mean_best_fitness] 和 [std_best_fitness]。由图X所示收敛曲线可见,算法在迭代前期快速逼近优势区域,后期逐渐趋于平稳,表现出较好的收敛性。最终得到的最优决策变量组合为 \(\boldsymbol{x}^*=[x_1^*,x_2^*,\ldots,x_d^*]\)。若采用上传代理优化模式,则结合 RMSE、MAE 和 \(R^2\) 等代理误差指标,可认为该优化结果具有一定的数据驱动可信度。”

8. 实现说明与注意事项

  • 本实现适用于连续变量单目标优化,不适用于显式多目标场景。
  • 该实现会让个体按排序顺序连续向多个更优个体更新,这一点与仅向单个最优个体移动的简化版写法不同。
  • alpha_damp 越小,随机性衰减越快,收敛更快但可能损失全局探索能力。
  • 边界处理采用随机重置,而不是截断或镜像反弹,边界附近的搜索行为会受此影响。
  • 上传代理优化的最优结果依赖代理模型精度,应结合 RMSE、MAE、\(R^2\) 等指标综合解释。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Convergence_Best 表可写为:表X FA 最佳运行收敛曲线。
  • Convergence_Mean 表可写为:表X FA 多次运行平均收敛曲线。
  • BestPosition 表可写为:表X FA 求得的最优解向量。
  • convergence 类图建议统一写为:图X 萤火虫算法收敛曲线。
  • 箱线图建议写为:图X FA 多次运行最优值分布箱线图。

9.2 终审说明

  • 当前文档的结果解释已经较完整,终稿时应确保文字中出现的 SummaryRunSummaryConvergence_BestConvergence_Mean 与程序实际导出文件一致。
  • 若附录要展示末代种群状态,可直接把 PopulationPopulationFitness 作为附表,不建议混入正文主结果表。

9.3 全量强化补充

本次全量强化绑定的真实上传验证目录为 具体的算法3/优化与多目标/FA-萤火虫算法/results/manual_upload_verify_20260328/FA-萤火虫算法分析结果_20260328_123512。主结果文件为 FA-萤火虫算法分析结果_20260328_123512.xlsx,实际工作表为 ParametersSummaryRunSummaryBestPositionConvergence_BestConvergence_MeanPopulationPopulationFitnessChartsBoundsUploadedDataSurrogateMetrics

当前真实图文件为 charts/convergence.pngcharts/best_position.png。同目录还存在 fa_repro.xlsxFA-萤火虫算法分析结果_20260328_123512_reproduce.xlsxfa_reproduce_20260328_123512.pyrepro_fa.py,说明该目录同时保留了主结果和复现再生产物;论文正文应固定引用主结果文件,复现文件可放在补充材料说明。

复现脚本 repro_fa.py 的参数中 problem_mode = 'upload_surrogate',输入口径为 problem_file = 'repro_inputs/fa_sample.xlsx',目标列为 f_sphere,方向为 min。因此这篇文档应明确把 Population/PopulationFitness 解释为上传代理优化下最佳运行的末代种群证据,而不是传统 benchmark 的全局理论轨迹。

10. 软件实现核查补充(2026-07)

本篇对应的软件源码目录是 具体的算法3/优化与多目标/FA-萤火虫算法。软件实现支持优化模式和上传数据代理优化模式;上传模式通过数值表训练随机森林代理模型后运行萤火虫搜索。文档中的亮度、吸引度、距离衰减和随机扰动公式可以保留,但输出说明应以 ProblemFA_ParamsRun_SummaryBest_Solution 为准。

当前较新的代表性目录为 results/FA-萤火虫算法分析结果_20260517_132006-优化模式results/FA-萤火虫算法分析结果_20260517_132020-上传数据代理优化。主工作簿 FA_results_*.xlsx 在优化模式下包含 字段说明SummaryProblemFA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。旧文中的 Convergence_Best/Convergence_Mean/Population 属于历史目录表名,当前较新交付说明应按统一表名写。

当前图表文件通常直接位于结果目录或复现输出目录下,例如 FA_convergence_时间戳.png,同时上传模式会生成 FA_preview_时间戳.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/fa_sample.xlsx,复现输出进入 repro_outputs/。如果正文要讨论代理模式,应同时引用 UploadedProblemUploadedDataSurrogateMetrics,不能只看收敛曲线。