MFO-飞蛾扑火
MFO(Moth-Flame Optimization)是一类通过飞蛾围绕火焰做对数螺旋飞行来实现搜索的群智能算法。本项目的核心搜索过程位于 MFO-飞蛾扑火/core/mfo.py,而真正的运行入口是 core/mfocalculator.py。界面层不做多次独立运行统计,而…
MFO-飞蛾扑火
1. 方法概述
MFO(Moth-Flame Optimization)是一类通过飞蛾围绕火焰做对数螺旋飞行来实现搜索的群智能算法。本项目的核心搜索过程位于 MFO-飞蛾扑火/core/mfo.py,而真正的运行入口是 core/mfo_calculator.py。界面层不做多次独立运行统计,而是执行单次 MFO 搜索;上传模式下则先训练随机森林代理模型,再在样本边界内运行 MFO。
设第 \(i\) 只飞蛾在第 \(t\) 轮的位置为
$$ \boldsymbol{m}_i^{(t)}\in\Omega \tag{1} $$
项目求解的内部问题为
$$ \min_{\boldsymbol{x}\in\Omega}\tilde f(\boldsymbol{x}) \tag{2} $$
2. 问题定义与代理优化
上传模式下,项目先读取样本
$$ \mathcal{D}=\{(\boldsymbol{x}^{(n)},y^{(n)})\}_{n=1}^{N_s} \tag{3} $$
再以 300 棵树训练随机森林代理模型:
$$ \hat f(\boldsymbol{x})=\frac{1}{300}\sum_{b=1}^{300}T_b(\boldsymbol{x}) \tag{4} $$
若用户选择最大化,则内部目标函数同样被重写为
$$ \tilde f(\boldsymbol{x})= \begin{cases} \hat f(\boldsymbol{x}), & \text{min}\\ -\hat f(\boldsymbol{x}), & \text{max} \end{cases} \tag{5} $$
上传模式中的逐维边界由样本极值确定:
$$ l_j=\min_n x_j^{(n)},\qquad u_j=\max_n x_j^{(n)} \tag{6} $$
3. 核心数学模型
3.1 初始化
飞蛾种群按均匀分布初始化:
$$ \boldsymbol{m}_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)}=\tilde f(\boldsymbol{m}_i^{(t)}) \tag{8} $$
3.2 火焰数量递减
第 \(t\) 轮可用火焰数量按代码中的公式递减:
$$ N_f^{(t)}=\operatorname{round}\!\left(N-\frac{t(N-1)}{T}\right) \tag{9} $$
当 \(t=0\) 时,火焰集合由当前飞蛾群排序后直接得到;当 \(t>0\) 时,项目并不是只对当前飞蛾排序,而是将“上一代飞蛾 + 上一代火焰”拼接后共同排序:
$$ \mathcal{P}^{(t)}= \big[\mathcal{M}^{(t-1)};\mathcal{F}^{(t-1)}\big] \tag{10} $$
随后取其中前 \(N\) 个最优解作为新火焰:
$$ \mathcal{F}^{(t)}=\operatorname{TopN}\big(\mathcal{P}^{(t)}\big) \tag{11} $$
这一步是本项目实现中最值得写入论文说明的细节之一,因为代码明确保留了历史火焰档案。
3.3 螺旋更新
项目中的螺旋控制参数满足
$$ a^{(t)}=-1-\frac{t}{T} \tag{12} $$
并对每个维度生成随机螺旋参数
$$ \tau_{ij}^{(t)}=(a^{(t)}-1)u_{ij}^{(t)}+1,\qquad u_{ij}^{(t)}\sim U(0,1) \tag{13} $$
设螺旋常数 \(b=1\),若第 \(i\) 只飞蛾仍对应自己的火焰,则到火焰的距离为
$$ D_{ij}^{(t)}=\left|f_{ij}^{(t)}-m_{ij}^{(t)}\right| \tag{14} $$
其位置更新为
$$ m_{ij}^{(t+1)}= D_{ij}^{(t)}e^{b\tau_{ij}^{(t)}}\cos(2\pi\tau_{ij}^{(t)})+f_{ij}^{(t)} \tag{15} $$
若 \(i>N_f^{(t)}\),则代码会让该飞蛾围绕最后一个保留火焰飞行:
$$ m_{ij}^{(t+1)}= \left|f_{N_f,j}^{(t)}-m_{ij}^{(t)}\right| e^{b\tau_{ij}^{(t)}}\cos(2\pi\tau_{ij}^{(t)}) +f_{N_f,j}^{(t)} \tag{16} $$
3.4 边界与收敛记录
每轮开始前,项目对飞蛾位置执行逐维截断:
$$ m_{ij}^{(t)}\leftarrow \min\!\big(\max(m_{ij}^{(t)},l_j),u_j\big) \tag{17} $$
排序后当前最优火焰的适应度记为
$$ g^{(t)}=\min_{1\le i\le N}F_i^{(t)} \tag{18} $$
项目还在结果汇总中计算收敛曲线均值与标准差:
$$ \mu_g=\frac{1}{T}\sum_{t=1}^{T}g^{(t)},\qquad \sigma_g=\sqrt{\frac{1}{T}\sum_{t=1}^{T}\big(g^{(t)}-\mu_g\big)^2} \tag{19} $$
4. 算法流程
根据 core/mfo.py 与 core/mfo_calculator.py,本项目的 MFO 流程为:
- 选择内置函数模式或上传代理优化模式。
- 若为上传模式,则读取数值数据并训练随机森林代理模型。
- 按式(7)初始化飞蛾种群,计算初始适应度。
- 按式(9)确定当前火焰数量。
- 首轮直接对飞蛾排序;之后按式(10)至式(11)融合历史火焰档案。
- 按式(12)至式(16)执行围绕火焰的对数螺旋更新。
- 按式(17)做边界截断,并记录式(18)的收敛曲线。
- 导出 Excel、收敛图和复现实验脚本
repro_mfo.py。
5. 关键参数说明
pop_size:飞蛾数量 \(N\)。max_iter:最大迭代次数 \(T\)。dim:问题维度。lb、ub:搜索边界;上传模式下使用逐维样本边界。seed:计算器层支持的随机种子参数,当前界面未单独暴露。objective_direction:上传代理优化时的目标方向。
6. 评价指标与输出结果解释
本项目是单次运行版本,实际导出的主要工作表包括:
Summary:best_fitness、best_fitness_last、curve_mean、curve_std、dim、pop_size、max_iter等汇总信息;Objective:objective_name、dim、lb、ub、seed等原始问题元数据;上传模式下还会带source_file、target_column、objective_direction;MFO_Params:界面提交的 MFO 参数表;Bounds:变量边界表;Convergence:iter / best_fitness逐轮最优值曲线;Best_Solution:最优解向量,仅含dim / value;Charts:图表路径索引。
若为上传代理优化模式,还会额外导出 UploadedData、SurrogateMetrics、Bounds_Detail。
论文结果部分可按“Summary 汇报最优值和收敛统计、Convergence 展示迭代过程、Best_Solution 给出最优解向量”的方式组织,其中 Best_Solution 仅保存位置向量,最优值应以 Summary 为准。若为上传代理模式,建议再补充 SurrogateMetrics 与 Bounds_Detail,说明代理误差和搜索空间来源。
7. 论文写作模板
可在论文方法部分表述为:
“本文采用飞蛾扑火优化算法进行求解。算法将飞蛾个体与火焰档案解耦,通过对数螺旋轨迹驱动飞蛾逐步逼近火焰,同时令火焰数量随迭代次数递减。本文实现进一步保留了上一代火焰档案,并在每轮将上一代飞蛾与火焰合并排序后更新火焰集合,从而增强了对历史优良解的继承能力。对于数据驱动问题,本文先构建随机森林代理模型,再由 MFO 在样本边界内搜索最优解。”
7.1 结果部分补充模板
若需把实验结果直接写入论文结果部分,可进一步表述为:
“表X给出了算法在当前问题上的最优目标值、平均最优值和标准差(如有多次独立运行),图X展示了收敛曲线变化。结果表明,该算法在迭代前期能够快速逼近优势区域,并在后期逐步趋于稳定,最终获得最优解 \(\boldsymbol{x}^*\) 及其对应目标值 \(f(\boldsymbol{x}^*)\)。对于上传代理优化场景,结合代理模型误差指标可认为该最优结果具有一定的数据驱动解释性。”
7.2 写作替换提示
为便于直接落稿,正文撰写时可将结果文件中的字段替换为以下论文措辞:
best_fitness或结果汇总表中的最优值,可写为“最优目标函数值”或“最优适应度值”;BestSolution、BestPosition、Best_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. 实现说明与注意事项
- 本实现适用于连续变量单目标优化。
- 火焰更新不是只看当前种群,而是显式融合了上一代火焰档案。
- 上传模式下虽然界面参数面板仍保留
lb/ub/dim字段,但真实搜索边界由代理问题的逐维样本极值决定。 - 项目当前没有多次运行统计,因此稳定性评估需要用户自行重复实验或扩展代码。
9. 单篇终审补充
9.1 图题与表题对齐建议
Summary表可写为:表X MFO 最优值与收敛统计摘要。Objective表可写为:表X MFO 问题定义与边界元数据。MFO_Params表可写为:表X MFO 算法参数设置。Convergence表可写为:表X MFO 单次运行收敛轨迹。Best_Solution表可写为:表X MFO 求得的最优解向量。Charts中收敛图建议写为:图X 飞蛾扑火优化算法收敛曲线。
9.2 终审说明
- 当前实现没有多次运行统计,正文不应写“均值-标准差重复实验结果”。
- 上传代理模式下,
SurrogateMetrics与Bounds_Detail应作为最优结果的配套说明同时出现。
9.3 全量强化补充
本次全量强化绑定的真实结果目录为 具体的算法3/优化与多目标/MFO-飞蛾扑火/results/pytest_ui_mfo_test_swarm_improved_ui_flow_of5。当前建议作为主引用对象的工作簿为 MFO_results_20260329_171727.xlsx,实际工作表为 Summary、Objective、MFO_Params、Bounds、Convergence、Best_Solution、Charts;对应主图可绑定 MFO_convergence_20260329_171727.png。
该目录里同时累积了 151637、152357、153000、171727 四轮结果和四张收敛图,因此它不是单次静态导出,而是同一 UI/回归目录里的连续再运行结果池。本次文档应明确以最后一轮 171727 为主结果,其余同目录时间戳视作历史残留或连续复算产物。
复现脚本 repro_mfo.py 的真实口径为 benchmark:objective_name = 'F1',参数字典里 problem_mode = 'benchmark',并将 output_dir 写成相对目录 results。因此 MFO 当前绑定的是 benchmark/F1 复现链路,而非 repro_inputs 上传代理链路;正文若说明可复现性,应如实写成基准函数复算。
10. 软件实现核查补充(2026-07)
本篇对应的软件源码目录是 具体的算法3/优化与多目标/MFO-飞蛾扑火。当前软件实现支持优化模式和上传数据代理优化模式;上传模式将数值表转成代理问题后再运行飞蛾扑火搜索。文档中的火焰排序、螺旋运动、火焰数量递减和边界处理公式可以保留,但软件交付说明应以 MFO_Params、History_Mean、History_All 和 Best_Solution 为准。
当前较新的代表性目录为 results/MFO-飞蛾扑火分析结果_20260517_142026-优化模式 与 results/MFO-飞蛾扑火分析结果_20260517_142038-上传数据代理优化。主工作簿在优化模式下包含 结果说明、字段说明、Summary、Problem、MFO_Params、Bounds、Run_Summary、History_Mean、History_All、Best_Solution、Charts;上传模式额外包含 UploadedProblem、UploadedData、SurrogateMetrics。旧文中 benchmark 回归目录可作为历史证据,但当前较新版本已经有标准化上传代理链路。
当前图表位于 charts/ 下,稳定输出包括 MFO_convergence_时间戳.png 和 MFO_best_solution_时间戳.png。复现代码位于 复现代码/优化模式/ 或 复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/mfo_sample.xlsx,复现结果进入 repro_outputs/。如果论文解释上传代理最优值,必须把 SurrogateMetrics 作为代理模型可靠性说明同步列出。