正在加载中...

展开本页目录
算法教程WCA-水循环算法

WCA-水循环算法

No.211 · 在线教程

本项目实现的是 WCA(Water Cycle Algorithm,水循环算法)单目标连续优化版本,核心代码位于 WCA-水循环算法/core/wca.py,界面调用链为 ui/uploadwidget.py -> ui/resultswidget.py。项目支持:

WCA-水循环算法

1. 方法概述

本项目实现的是 WCA(Water Cycle Algorithm,水循环算法)单目标连续优化版本,核心代码位于 WCA-水循环算法/core/wca.py,界面调用链为 ui/upload_widget.py -> ui/results_widget.py。项目支持:

  • benchmark:内置测试函数;
  • upload_surrogate:上传数据后训练随机森林代理;
  • 海洋 sea、河流 rivers、溪流 streams 的分层搜索机制。

项目内部统一按最小化问题求解:

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

当前实现为单次运行,不带 runs 多次独立实验框架。

2. 问题定义与上传代理优化

上传模式会先训练 RandomForestRegressor(n_estimators=300)

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

若界面选择最大化,则 utils/problem_definition.py 会把内部优化目标改写为

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

上传模式的搜索边界直接取样本逐维极值:

$$ l_j=\min_n x_j^{(n)}, \qquad u_j=\max_n x_j^{(n)} \tag{4} $$

3. 核心数学模型

3.1 种群分层

设总雨滴数为 \(N\),nsr 表示“海洋 + 河流”的总数,则

$$ N_{river}=nsr-1, \qquad N_{stream}=N-nsr \tag{5} $$

初始化后,项目先对全部个体按适应度升序排序,并定义:

$$ \boldsymbol{x}_{sea}= \text{当前最优个体}, \qquad \{\boldsymbol{x}_{river}\}=\text{其后 }(nsr-1)\text{ 个体} \tag{6} $$

其余个体全部划为 streams

3.2 流向概率

代码并未固定每条溪流一定流向某条河,而是根据海洋和各河流的适应度构造概率。对集合 \(\{c_{sea},c_{river,1},\ldots,c_{river,N_{river}}\}\),先计算

$$ s_k=\max(c)-c_k+\varepsilon \tag{7} $$

再归一化为流向概率

$$ p_k=\frac{s_k}{\sum_j s_j} \tag{8} $$

适应度越好,对应获得溪流分配的概率越高。

3.3 溪流向海/河流动

对每一条溪流,代码先按式(8)随机抽取目标(海洋或某条河流),然后更新为

$$ \boldsymbol{x}_{stream}^{new} = \boldsymbol{x}_{stream} +\boldsymbol{r}\odot C\big(\boldsymbol{x}_{target}-\boldsymbol{x}_{stream}\big), \qquad C=2 \tag{9} $$

若新解更优,则接受;若目标是海洋且新溪流优于海洋,则两者交换;若目标是某条河流且新溪流优于该河流,也执行交换。

3.4 河流向海洋流动

每条河流再朝海洋移动:

$$ \boldsymbol{x}_{river}^{new} = \boldsymbol{x}_{river} +\boldsymbol{r}\odot C\big(\boldsymbol{x}_{sea}-\boldsymbol{x}_{river}\big) \tag{10} $$

若更新后的河流优于海洋,则交换河流与海洋。

3.5 蒸发降雨机制

算法维护一个逐轮衰减的蒸发阈值 dmax_current。若河流或溪流距离海洋过近,则重新降雨:

$$ \|\boldsymbol{x}_{sea}-\boldsymbol{x}_{river}\|_2<d_{max}^{(t)} \Longrightarrow \boldsymbol{x}_{river}\sim U(\boldsymbol{l},\boldsymbol{u}) \tag{11} $$

$$ \|\boldsymbol{x}_{sea}-\boldsymbol{x}_{stream}\|_2<d_{max}^{(t)} \Longrightarrow \boldsymbol{x}_{stream}\sim U(\boldsymbol{l},\boldsymbol{u}) \tag{12} $$

阈值按线性方式衰减:

$$ d_{max}^{(t+1)}=\max\!\left(0,\ d_{max}^{(t)}-\frac{d_{max}^{(0)}}{T}\right) \tag{13} $$

3.6 边界与最优值

所有更新位置都会直接截断到边界内:

$$ \boldsymbol{x}\leftarrow \operatorname{clip}(\boldsymbol{x},\boldsymbol{l},\boldsymbol{u}) \tag{14} $$

算法记录的 best_fitness 即当前海洋中历史最优值。

4. 算法流程

结合 core/wca.pyui/upload_widget.pyui/results_widget.pyutils/problem_definition.py,本项目 WCA 的流程为:

  1. 选择内置目标或上传代理目标。
  2. 若为上传模式,则训练随机森林代理,并按式(3)处理最大化。
  3. 初始化全部雨滴并按适应度排序,划分 sea/rivers/streams
  4. 依据式(7)和式(8)给海洋及各河流分配溪流吸引概率。
  5. 溪流按式(9)向海洋或河流移动,并在更优时发生交换。
  6. 河流按式(10)向海洋移动。
  7. 若个体距离海洋小于 dmax_current,则按式(11)和式(12)触发蒸发降雨重置。
  8. 线性衰减 dmax_current,记录收敛曲线并导出结果。

5. 关键参数说明

  • population_size:总雨滴数 \(N\)。
  • nsr:海洋与河流总数,需满足 2 <= nsr < N
  • max_iter:最大迭代次数。
  • dmax:蒸发判据初值。
  • seed:随机种子。
  • objective_direction:上传模式优化方向。

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

ui/results_widget.py 导出的主要工作表包括:

  • Convergence:每轮历史最优值;
  • Best Solution:当前最优解向量;
  • Parameters:问题、边界、nsrdmax、种子等;
  • Charts:收敛图路径。

上传模式下还会额外写出:

  • Bounds:逐维样本边界;
  • UploadedData:上传数据预览;
  • SurrogateMetrics:代理模型训练指标。

需要特别说明:虽然 core/wca.py 支持 bounds_mode=strict/lenient,但当前 UI 并未暴露该参数,因此实际调用走的是默认 strict。因此,论文结果部分可按“最优值、收敛轨迹、参数设置”组织;若为上传模式,再补充 BoundsSurrogateMetrics 说明搜索空间来源与代理误差。由于 Best Solution 仅保存决策变量,正文中应把最优目标值与其分开叙述。

7. 论文写作模板

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

“本文采用水循环算法(WCA)进行连续变量单目标优化。算法将种群划分为海洋、河流与溪流,并根据个体适应度动态构造溪流流向海洋或河流的概率;溪流和河流分别朝其目标位置移动,当新解优于上层个体时会发生交换,从而实现从溪流到河流、再到海洋的逐级改进。同时,算法还通过蒸发降雨机制在个体过度靠近海洋时重置局部搜索路径,以维持全局探索能力。对于数据驱动问题,本文进一步在上传样本上训练随机森林代理模型,并在样本边界内执行 WCA 搜索。”

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

  • 本实现是单目标连续 WCA,不包含多次独立运行统计。
  • 上传模式支持 min/max 两种方向,方向切换通过代理目标符号翻转实现。
  • nsr 过大时可用的溪流数量会减少,可能影响水循环层级结构。
  • 当前代码中海洋和河流的交换逻辑是 WCA 实现的重要细节,论文复现时建议明确说明。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Parameters 表可写为:表X WCA 参数设置与实验配置。
  • Convergence 表可写为:表X WCA 最优值收敛历史。
  • Best Solution 表可写为:表X WCA 最优决策变量组合。
  • Charts 表可写为:表X WCA 图表索引与文件路径。
  • ChartsChart=Convergence 对应图片建议写为:图X 水循环算法收敛曲线。
  • 若为上传代理模式,Bounds 表可写为:表X WCA 上传样本逐维边界。
  • 若为上传代理模式,SurrogateMetrics 表可写为:表X WCA 代理模型误差指标。

9.2 终审说明

  • 当前实现不做多次独立运行统计,因此正文不要写“平均最优值”“标准差”“箱线图”或“多次运行稳定性”。
  • Best SolutionConvergence 分别对应“最优解向量”和“最优值轨迹”,论文里应分开引用,不能把 Best Solution 直接当作最优目标值表。
  • 图表路径在主程序导出时通常为 APP_NAME_convergence.png,在 repro 脚本中通常写成 convergence.png;正文引用图题时应按内容命名,不要依赖具体文件名。
  • UI 当前未暴露 bounds_mode,因此实际结果应按默认实现口径描述,不要在论文里额外宣称做了 strict/lenient 对比实验,除非另行复跑并留证。

9.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/优化与多目标/WCA-水循环算法。该算法的 results 目录较杂,既有大量 baseline 结果池,也有上传代理验证目录,因此这里不适合直接引用 results 顶层,而应绑定到明确的单轮结果目录。

本次优先采用的代表性结果目录为 具体的算法3/优化与多目标/WCA-水循环算法/results/manual_upload_verify_20260329/WCA-水循环算法分析结果_20260329_012543_126195。选择这个目录的原因是它同时包含上传代理模式下的主结果工作簿、输入副本、复现脚本和 repro 再生产物,比纯 baseline 目录更完整。

该目录下的主结果工作簿为 具体的算法3/优化与多目标/WCA-水循环算法/results/manual_upload_verify_20260329/WCA-水循环算法分析结果_20260329_012543_126195/WCA-水循环算法分析结果_20260329_012543_126195.xlsx,实测工作表为:

  • Convergence
  • Best Solution
  • Parameters
  • Charts
  • Bounds
  • UploadedData
  • SurrogateMetrics

这里的 BoundsUploadedDataSurrogateMetrics 真实存在,说明该轮结果不是单纯解析测试,而是上传代理优化模式的完整证据。论文若要写上传数据驱动口径,应优先引用这轮结果,而不是只引用 baseline 目录里只有 4 个 sheet 的工作簿。

同目录下还实际存在:

  • WCA-水循环算法_convergence.png
  • convergence.png
  • repro_inputs/wca_sample.xlsx
  • repro_wca.py
  • wca_repro.xlsx

其中 WCA-水循环算法_convergence.png 更适合视为主结果导出图,convergence.png 则来自 repro 再运行。wca_repro.xlsx 的工作表与主结果一致,也包含 Bounds / UploadedData / SurrogateMetrics,因此这里必须明确区分“主结果工作簿”和“同目录中的 repro 再生产物工作簿”,不能把两者写成一次静态导出。

复现脚本中真实参数写法为 problem_mode='upload_surrogate',并通过 problem_file='repro_inputs/wca_sample.xlsx' 绑定结果目录内的输入副本。这说明当前复现链路已经是“上传样本副本 + 参数副本 + repro 脚本”的目录内自洽模式,而不是再回头依赖原始绝对路径。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/WCA-水循环算法。软件实现支持优化模式和上传数据代理优化模式;上传模式通过数值表训练代理目标后执行水循环算法。文档中的河流/溪流/流域迁移公式可以保留,但软件结果应以 WCA_ParamsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts 为准。

当前较新的代表性目录为 results/WCA-水循环算法分析结果_20260517_144757-优化模式results/WCA-水循环算法分析结果_20260517_144809-上传数据代理优化。主工作簿通常包含 SummaryProblemWCA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。这类结果应优先按当前表结构解释,不要只写成抽象的“收敛趋势”。

当前图表稳定输出为 WCA_convergence_时间戳.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/wca_sample.xlsx,复现结果进入 repro_outputs/。如果正文引用上传代理模式,SurrogateMetrics 需要与最优解一起解释。