正在加载中...

展开本页目录
算法教程FDA-流向算法

FDA-流向算法

No.185 · 在线教程

流向算法(Flow Direction Algorithm, FDA)是一类模拟流体在势差驱动下寻找下降方向的连续优化方法。本项目的实现位于 FDA-流向算法/core/fdacalculator.py,面向单目标连续优化,支持内置基准函数、自定义表达式目标以及上传数据代理优化…

FDA-流向算法

1. 方法概述

流向算法(Flow Direction Algorithm, FDA)是一类模拟流体在势差驱动下寻找下降方向的连续优化方法。本项目的实现位于 FDA-流向算法/core/fda_calculator.py,面向单目标连续优化,支持内置基准函数、自定义表达式目标以及上传数据代理优化,并输出最优轨迹与流群状态用于论文复现。

设第 \(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. 问题定义与代理优化

项目求解的基本形式为

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

在上传代理优化模式下,系统先用随机森林训练代理模型。设训练样本为

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

则代理目标函数写为

$$ \hat{f}(\boldsymbol{x})=\frac{1}{B}\sum_{b=1}^{B}T_b(\boldsymbol{x}),\qquad B=300 \tag{4} $$

边界由训练样本逐维极值确定:

$$ 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{5} $$

若上传模式中方向为最大化,则项目通过

$$ \tilde{f}(\boldsymbol{x})= \begin{cases} \hat{f}(\boldsymbol{x}), & \text{min}\\ -\hat{f}(\boldsymbol{x}), & \text{max} \end{cases} \tag{6} $$

统一转换为内部最小化形式。

3. 核心数学模型

3.1 初始化

设流的数量为 \(\alpha\),每条流的邻域数量为 \(\beta\)。项目按均匀分布初始化全部流:

$$ \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} $$

每轮开始时按适应度排序,记当前全局最优流为

$$ \boldsymbol{x}_{best}^{(t)}=\arg\min_{1\le i\le \alpha}F_i^{(t)} \tag{9} $$

3.2 自适应权重

项目在每轮迭代构造一个随机权重向量。设当前代数为 \(t\),总迭代次数为 \(T\),则有

$$ \mathrm{base}^{(t)}=1-\frac{t}{T}+\varepsilon \tag{10} $$

$$ w_s^{(t)}=\left(\mathrm{base}^{(t)}\right)^{2z_t},\qquad z_t\sim \mathcal{N}(0,1) \tag{11} $$

进一步得到逐维权重

$$ \boldsymbol{w}^{(t)}= w_s^{(t)}\cdot \boldsymbol{r}_1^{(t)}\cdot \frac{t}{T}\cdot \boldsymbol{r}_2^{(t)} \tag{12} $$

其中 \(\boldsymbol{r}_1^{(t)},\boldsymbol{r}_2^{(t)}\sim U(0,1)^d\)。

3.3 邻域生成

对第 \(i\) 条流,先计算其与当前最优流的距离

$$ D_i^{(t)}=\|\boldsymbol{x}_{best}^{(t)}-\boldsymbol{x}_i^{(t)}\|_2 \tag{13} $$

然后对每个邻域样本 \(j=1,2,\ldots,\beta\),随机生成参考点 \(\boldsymbol{x}_{rand}\),并构造扰动项

$$ \Delta \boldsymbol{x}_{ij}^{(t)}= \boldsymbol{w}^{(t)}\odot \left(r_1\boldsymbol{x}_{rand}-r_2\boldsymbol{x}_i^{(t)}\right)\cdot D_i^{(t)} \tag{14} $$

其中 \(r_1,r_2\sim U(0,1)\)。随后生成邻域解

$$ \boldsymbol{n}_{ij}^{(t)}= \boldsymbol{x}_i^{(t)}+\boldsymbol{\eta}_{ij}^{(t)}\odot \Delta \boldsymbol{x}_{ij}^{(t)},\qquad \boldsymbol{\eta}_{ij}^{(t)}\sim \mathcal{N}(0,\mathbf{I}) \tag{15} $$

再对 \(\boldsymbol{n}_{ij}^{(t)}\) 执行边界截断。

3.4 基于坡度的流向更新

从 \(\beta\) 个邻域中选取最优邻域解 \(\boldsymbol{n}_{i,best}^{(t)}\)。若该邻域优于当前流,则先计算距离

$$ d_i^{(t)}=\|\boldsymbol{n}_{i,best}^{(t)}-\boldsymbol{x}_i^{(t)}\|_2 \tag{16} $$

并按项目实现定义坡度因子

$$ \mathrm{sf}_i^{(t)}=\frac{f(\boldsymbol{n}_{i,best}^{(t)})-f(\boldsymbol{x}_i^{(t)})}{\sqrt{d_i^{(t)}}} \tag{17} $$

然后生成速度

$$ v_i^{(t)}=\xi_i^{(t)}\cdot \mathrm{sf}_i^{(t)},\qquad \xi_i^{(t)}\sim \mathcal{N}(0,1) \tag{18} $$

项目中速度会按代码逻辑限制到由搜索范围确定的区间近邻,并更新为

$$ \boldsymbol{x}_i^{(t+1)}= \boldsymbol{x}_i^{(t)}+ v_i^{(t)}\frac{\boldsymbol{n}_{i,best}^{(t)}-\boldsymbol{x}_i^{(t)}}{\sqrt{d_i^{(t)}}} \tag{19} $$

3.5 退化时的替代更新

若最优邻域并未优于当前流,则程序分两种情形更新:

当随机流 \(r\) 的适应度优于当前流时,

$$ \boldsymbol{x}_i^{(t+1)}= \boldsymbol{x}_i^{(t)}+\boldsymbol{\zeta}_i^{(t)}\odot\left(\boldsymbol{x}_r^{(t)}-\boldsymbol{x}_i^{(t)}\right),\qquad \boldsymbol{\zeta}_i^{(t)}\sim \mathcal{N}(0,\mathbf{I}) \tag{20} $$

否则向当前全局最优流移动:

$$ \boldsymbol{x}_i^{(t+1)}= \boldsymbol{x}_i^{(t)}+\xi_i^{(t)}\left(\boldsymbol{x}_{best}^{(t)}-\boldsymbol{x}_i^{(t)}\right) \tag{21} $$

3.6 边界处理与最优记录

项目采用截断式边界处理:

$$ x_{ij}^{(t+1)}\leftarrow \min\!\big(\max(x_{ij}^{(t+1)},l_j),u_j\big) \tag{22} $$

若新流更优,则接受更新,并同步刷新全局最优:

$$ \text{若 } f(\boldsymbol{x}_i^{(t+1)})<f(\boldsymbol{x}_i^{(t)}),\ \text{则接受新流} \tag{23} $$

收敛曲线记录为

$$ g^{(t)}=\min_{1\le i\le \alpha} f(\boldsymbol{x}_i^{(t)}) \tag{24} $$

4. 算法流程

根据 FDACalculator.calculate,本项目的 FDA 求解步骤可概括为:

  1. 确定目标函数模式并初始化流群。
  2. 计算初始适应度并确定当前最优流。
  3. 在每轮中为每条流生成 \(\beta\) 个邻域候选解。
  4. 选择最优邻域,并按式(19)或式(20)至式(21)更新流向。
  5. 执行边界截断与贪婪接受。
  6. 更新全局最优流和收敛曲线。
  7. 输出最优轨迹、最佳解、最终流群与图表文件。

5. 关键参数说明

  • alpha:流的数量,即种群规模。
  • beta:每条流生成的邻域个数。
  • max_iter:最大迭代次数。
  • dim:问题维度。
  • lbub:变量边界。
  • seed:随机种子。

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

本项目当前主要输出单次运行结果,核心指标包括:

$$ f^*=f(\boldsymbol{x}^*) \tag{25} $$

其中 \(\boldsymbol{x}^*\) 为最终全局最优解。save_results() 实际导出的主要工作表包括:

  • 原始数据:初始流群或原始群体数据;
  • 参数:问题配置与 FDA 参数;
  • 边界设置:搜索边界;
  • 运行汇总:最优值、耗时等摘要;
  • 收敛曲线:逐代最优值历史;
  • 最佳解:最终最优解向量;
  • 最优轨迹:每代最优位置轨迹;
  • 初始流群:初始化得到的流群分布;
  • 结果解读图表清单:结果说明与图表路径索引。

代理优化模式下还会额外导出 UploadedBoundsUploadedDataSurrogateMetrics,用于记录样本边界明细、上传数据预览以及随机森林训练误差。

论文结果部分更适合按“运行汇总 报告最优值与耗时、收敛曲线 展示迭代过程、最佳解最优轨迹 解释代表性搜索路径”的顺序写作。需要特别注意的是,最佳解 工作表只对应最优位置向量,最优目标值应以 运行汇总 为准;若为上传代理模式,还应同步报告 SurrogateMetrics

7. 论文写作模板

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

“本文采用流向算法对连续变量单目标优化问题进行求解。算法首先在可行域内初始化多条流,并围绕当前最优流构造邻域候选解;随后依据邻域最优解与当前流之间的相对改善程度计算坡度因子,并据此更新流向。当局部邻域未产生改进时,算法转而向随机更优流或全局最优流移动,以增强跳出局部最优的能力。本文实现中所有越界分量均采用截断方式修正。对于数据驱动问题,则以随机森林代理模型替代真实目标函数,再在样本特征边界内执行 FDA 搜索。”

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. 实现说明与注意事项

  • 本实现适用于连续变量单目标优化,不适用于离散编码问题。
  • 邻域生成依赖当前最优流的距离 \(D_i^{(t)}\),因此种群收敛后扰动幅度会自然缩小。
  • 速度项的限制按项目代码中的符号逻辑处理,不完全等同于标准对称裁剪写法。
  • 上传代理优化本质上优化的是随机森林近似函数,样本外推能力不足时需谨慎解释最优结果。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 运行汇总 表可写为:表X FDA 最优值与运行时间汇总。
  • 收敛曲线 表可写为:表X FDA 各迭代最优值变化。
  • 最佳解 表可写为:表X FDA 求得的最优解向量。
  • 最优轨迹 表可写为:表X FDA 各代最优位置轨迹。
  • 图表清单 中收敛图建议写为:图X 流向算法收敛曲线。

9.2 终审说明

  • 正文中若要解释搜索路径,优先引用 最优轨迹,不要把 最佳解 误写成全过程轨迹。
  • 上传代理模式下的边界说明应与 UploadedBounds 或同义边界表同时出现。

9.3 全量强化补充

本次全量强化绑定的真实上传验证目录为 具体的算法3/优化与多目标/FDA-流向算法/results/manual_upload_verify_20260328/FDA-流向算法分析结果_20260328_124417。主结果文件为 FDA-流向算法分析结果_20260328_124417.xlsx,实际工作表为 原始数据参数边界设置运行汇总收敛曲线最佳解最优轨迹初始流群结果解读图表清单UploadedBoundsUploadedDataSurrogateMetrics

当前真实图文件为 charts/convergence.pngcharts/best_position.png。目录中还出现嵌套复现输出 FDA-流向算法分析结果_20260328_124552/,论文正文应优先引用首层主结果文件;嵌套目录适合作为复现再生产物说明。

复现脚本为 repro_fda.py,输入口径为 problem_file = 'repro_inputs/fda_sample.xlsx',并以 problem_mode = 'upload_surrogate'target_column = 'f_sphere'objective_direction = 'min' 运行。论文结果解释应同时引用 UploadedBoundsUploadedDataSurrogateMetrics,说明最优轨迹来自随机森林代理模型的优化过程。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/FDA-流向算法。软件实现支持内置/自定义函数优化和上传数据代理优化;上传模式会复制输入数据到复现目录,并将代理模型指标写入结果工作簿。文档中的流向、流群移动、最优轨迹和边界约束说明可以保留,但应强调当前软件结果属于单目标连续优化工程实现。

当前较新的代表性目录为 results/FDA-流向算法分析结果_20260517_130749-优化模式results/FDA-流向算法分析结果_20260517_130817-上传数据代理优化。主工作簿包含 结果说明SummaryProblemFDA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts参数边界设置运行汇总稳定性统计收敛曲线最优轨迹最佳解初始流群最终流群结果解读图表清单;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics最优轨迹最佳解 含义不同,前者描述过程,后者描述最终向量。

当前图表稳定输出为 charts/convergence.pngcharts/best_position.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/fda_sample.xlsx,复现输出进入 repro_outputs/。旧文中提到 UploadedBounds 的历史目录可以保留,但当前较新工作簿实际使用 UploadedProblem/UploadedData/SurrogateMetrics 组合描述上传代理问题。