正在加载中...

展开本页目录
算法教程RSA-爬行者搜索

RSA-爬行者搜索

No.202 · 在线教程

本项目实现的是 RSA(Reptile Search Algorithm,爬行者搜索算法)单目标连续优化版本,核心算法位于 RSA-爬行者搜索/core/rsacalculator.py,界面实际通过 ui/uploadwidget.py -> ui/resultswidget…

RSA-爬行者搜索

1. 方法概述

本项目实现的是 RSA(Reptile Search Algorithm,爬行者搜索算法)单目标连续优化版本,核心算法位于 RSA-爬行者搜索/core/rsa_calculator.py,界面实际通过 ui/upload_widget.py -> ui/results_widget.py 调用 RSACalculator.run_analysis。实现特点包括:

  • 支持 Sphere/Rastrigin/Rosenbrock/Ackley/Griewank/CustomExpression
  • 支持上传数据代理优化;
  • 支持 runs>1 多次独立运行;
  • 提供 strict/lenient 边界模式,但 UI 默认不显式传入,因此实际默认使用 lenient
  • 在最佳运行最终种群规模不超过 300 时,额外导出最终种群及其适应度表。

设目标问题为

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

若选择最大化,则内部实际优化 \(-f(\boldsymbol{x})\)。

2. 问题定义、边界处理与上传代理优化

上传模式下,项目首先训练 RandomForestRegressor(n_estimators=300)

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

内部目标为

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

边界处理函数 _resolve_bounds 支持两种模式。若某些维度满足 \(u_j\le l_j\),则:

$$ \text{strict}: \quad u_j\le l_j \Rightarrow \text{直接报错} \tag{4} $$

$$ \text{lenient}: \quad l_j'=\min(l_j,u_j),\qquad u_j'=\max(l_j,u_j) \tag{5} $$

若修正后仍有 \(u_j'=l_j'\),代码再强制令

$$ u_j'=l_j'+1 \tag{6} $$

上传模式下默认边界仍以样本逐维最小值和最大值为准。

3. 核心数学模型

3.1 初始化

种群初始化方式为

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

并记录当前最优个体 \(\boldsymbol{x}_{best}\) 及其目标值 \(f_{best}\)。

3.2 四阶段更新机制

项目按迭代进度切换四个更新阶段。先定义

$$ \mathrm{ES}=2\,\xi\left(1-\frac{t}{T}\right), \qquad \xi\in\{-1,0,1\} \tag{8} $$

对第 \(i\) 个个体的第 \(j\) 维,代码计算

$$ r_{ij}=\frac{x_{best,j}-x_{k,j}}{x_{best,j}+\varepsilon} \tag{9} $$

$$ p_{ij}=\alpha+\frac{x_{ij}-\bar x_i}{x_{best,j}(u_j-l_j)+\varepsilon} \tag{10} $$

$$ \eta_{ij}=x_{best,j}p_{ij} \tag{11} $$

其中 \(\bar x_i\) 是第 \(i\) 个个体的维度均值,\(k\) 为随机抽取的个体索引。

随后按四个阶段更新:

$$ x_{ij}^{new}=x_{best,j}-\eta_{ij}\beta-r_{ij}u, \qquad t<\frac{T}{4} \tag{12} $$

$$ x_{ij}^{new}=x_{best,j}x_{k,j}\,\mathrm{ES}\,u, \qquad \frac{T}{4}\le t<\frac{T}{2} \tag{13} $$

$$ x_{ij}^{new}=x_{best,j}p_{ij}u, \qquad \frac{T}{2}\le t<\frac{3T}{4} \tag{14} $$

$$ x_{ij}^{new}=x_{best,j}-\eta_{ij}\varepsilon-r_{ij}u, \qquad \frac{3T}{4}\le t\le T \tag{15} $$

其中 \(u\sim U(0,1)\)。

3.3 边界截断与贪婪接受

新解会先做边界截断:

$$ \boldsymbol{x}_i^{new}\leftarrow \operatorname{clip}(\boldsymbol{x}_i^{new},\boldsymbol{l},\boldsymbol{u}) \tag{16} $$

随后只在新解更优时才更新当前个体:

$$ \boldsymbol{x}_i\leftarrow \begin{cases} \boldsymbol{x}_i^{new}, & f(\boldsymbol{x}_i^{new})<f(\boldsymbol{x}_i)\\ \boldsymbol{x}_i, & \text{otherwise} \end{cases} \tag{17} $$

代码每轮会跳过当前全局最优个体本身,只更新其余个体。

3.4 多次运行与统计

若执行 \(R\) 次独立运行,则第 \(r\) 次使用

$$ \mathrm{seed}_r=\mathrm{seed}_0+r-1 \tag{18} $$

代表性最佳运行按内部调整后目标值最小选择:

$$ r^\star=\operatorname*{arg\,min}_{1\le r\le R} \tilde b_r \tag{19} $$

并输出最佳运行收敛曲线、均值收敛曲线及多次运行统计:

$$ \mu_t=\frac{1}{R}\sum_{r=1}^{R} c_r^{(t)} \tag{20} $$

4. 算法流程

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

  1. 选择基准函数、自定义表达式或上传代理优化模式。
  2. 根据 use_default_boundsbounds_mode 解析边界。
  3. 按式(7)初始化种群并计算初始适应度。
  4. 每轮根据式(8)至式(15)进入四阶段更新。
  5. 执行边界截断与贪婪接受,记录 curve_best
  6. runs>1,汇总 RunSummary、最佳运行曲线和均值曲线。
  7. 导出 ParametersSummaryRunSummaryBestPositionConvergence_BestConvergence_Mean,并在条件满足时附加 PopulationPopulationFitnessCharts 与复现脚本 repro_rsa.py

5. 关键参数说明

  • pop_size:种群规模。
  • max_iter:最大迭代次数。
  • alphabeta:RSA 关键控制参数,默认分别为 0.10.005
  • runs:独立运行次数。
  • seed:基础随机种子。
  • bounds_modestrictlenient,实际 UI 默认走 lenient
  • use_default_bounds:是否使用基准函数推荐边界。

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

项目主要输出:

  • Parameters:参数表,包含 pop_sizemax_iterdimalphabetarunsseedminmaxbounds_modeuse_default_boundsproblem_mode 等;
  • Summary:摘要表,仅汇总 objectiveminmaxrunsbest_fitnessbest_run
  • RunSummary:每次运行的 best_fitness_adjusted 与恢复后的 best_fitness
  • BestPosition:最优位置向量,列为 dim / x
  • Convergence_Best:最佳运行的收敛曲线;
  • Convergence_Mean:多次运行的均值收敛曲线;
  • PopulationPopulationFitness:仅当最佳运行最终种群规模不超过 300 时导出;
  • Charts:收敛曲线、箱线图、最优解分量图的路径索引;
  • 上传模式下附加 UploadedDataSurrogateMetricsBounds_Detail

其中 stats 里的 best/mean/std/worst 是在恢复为原始目标方向之后再计算的。

论文结果部分建议先以 SummaryRunSummary 汇报多次运行统计,再结合 Convergence_BestConvergence_Mean 说明代表性最佳运行和总体收敛趋势,最后用 BestPosition 给出最优解向量。若导出了 PopulationPopulationFitness,可将其作为附录中的末代群体分布材料;上传代理模式下则应同步引用 SurrogateMetrics

7. 论文写作模板

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

“本文采用爬行者搜索算法(RSA)进行单目标优化。算法首先随机初始化多个候选解,并以当前最优个体为引导,在不同迭代阶段采用四种不同的位置更新机制,从而在全局探索与局部开发之间动态切换。每次位置更新后,算法通过边界截断和贪婪接受策略保留优质解;当研究对象来自实验样本数据时,本文进一步构建随机森林代理模型,并在样本边界内执行 RSA 搜索。”

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

  • 本实现是单目标 RSA,上传代理模式也仍然是单目标。
  • 代码明确“跳过当前最优个体、更新其余个体”,这与一些固定跳过索引 0 的简化写法不同。
  • UI 默认并未传入 bounds_mode,因此实际运行通常采用 lenient 模式。
  • 上传模式下虽然界面会把 lb/ub 显示成标量最小值和最大值,但核心计算仍优先使用样本逐维边界向量。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Parameters 表可写为:表X RSA 参数设置表。
  • Summary 表可写为:表X RSA 运行摘要表。
  • RunSummary 表可写为:表X RSA 多次运行汇总表。
  • BestPosition 表可写为:表X RSA 最优位置向量表。
  • Convergence_Best 表可写为:表X RSA 最佳运行收敛历史表。
  • Convergence_Mean 表可写为:表X RSA 平均收敛历史表。
  • Population 表可写为:表X RSA 末代种群位置表。
  • PopulationFitness 表可写为:表X RSA 末代种群适应度表。
  • UploadedData 表可写为:表X RSA 上传样本预览表。
  • SurrogateMetrics 表可写为:表X RSA 代理模型误差指标表。
  • Bounds_Detail 表可写为:表X RSA 逐维边界明细表。
  • Charts 表可写为:表X RSA 图表索引表。
  • convergence.png 建议写为:图X RSA 收敛曲线图。
  • best_position.png 建议写为:图X RSA 最优解分量图。
  • runs_boxplot.png 建议写为:图X RSA 多次运行箱线图。

9.2 终审说明

  • 当前代表性结果目录建议优先采用上传代理模式的 results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611
  • 当前上传模式下的真实工作表为 Parameters/Summary/RunSummary/BestPosition/Convergence_Best/Convergence_Mean/Population/PopulationFitness/UploadedData/SurrogateMetrics/Bounds_Detail/Charts;普通 smoke 目录则通常没有后三张上传相关表。
  • 当前稳定实体图文件为 charts/convergence.pngcharts/best_position.pngcharts/runs_boxplot.png。正文若解释多次运行稳定性,应把 RunSummary/Convergence_Meanruns_boxplot.png 一起引用。
  • 真实 repro 脚本在上传模式下统一采用 INPUT_FILE = Path('repro_inputs/rsa_sample.xlsx') 读取输入副本;而部分较早 smoke 目录仍使用 EXCEL_PATH = Path(...) 直接回读结果簿。论文和附录应优先采用较新上传目录中的 repro_inputs/... 可移植口径。
  • 当前 Bounds_Detail 记录的才是逐维真实搜索边界。若正文只引用 Summary 中的标量边界,会丢失上传模式下“按样本逐维边界优化”的关键信息。

9.3 全量强化补充

  • 当前建议绑定的用户实跑主目录为 具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611。这是一套“上传样本驱动的代理优化”结果,不应与仅函数求解的 smoke 目录混用。
  • 当前主工作簿为 具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611/RSA-爬行者搜索分析结果_20260329_000611.xlsx,实际工作表为 ParametersSummaryRunSummaryBestPositionConvergence_BestConvergence_MeanPopulationPopulationFitnessUploadedDataSurrogateMetricsBounds_DetailCharts。其中 UploadedData/SurrogateMetrics/Bounds_Detail 只在上传代理模式下出现,正文要把它们当作本算法“样本驱动搜索”的关键证据。
  • 当前实体图文件为 具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611/charts/convergence.png具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611/charts/best_position.png具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611/charts/runs_boxplot.png。图证是单层 charts/,不需要再去外层目录寻找副本。
  • 当前 repro 脚本为 具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611/repro_rsa.py,脚本内真实输入口径是 INPUT_FILE = Path('repro_inputs/rsa_sample.xlsx'),对应输入副本实际位于 具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611/repro_inputs/rsa_sample.xlsx
  • 该目录下还包含一层复现再生产物 具体的算法3/优化与多目标/RSA-爬行者搜索/results/manual_upload_verify_20260329/rsa_sample_upload_real_after_fix/RSA-爬行者搜索分析结果_20260329_000611/results/RSA-爬行者搜索分析结果_20260329_000620/,其中有再生成的工作簿和一份新的 repro_rsa.py。文档里应明确区分:000611 是首层主结果,000620 是由 repro 触发的二次产物。
  • 当前这套证据链说明 RSA 并非“无数据输入”的纯 benchmark 运行,而是支持上传样本后训练代理模型再搜索。若论文或说明书要讲用户用法,应明确告诉用户:上传样本后真正要看的表是 UploadedDataSurrogateMetricsBounds_Detail,而不是只看 Summary

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/RSA-爬行者搜索。软件实现支持优化模式和上传数据代理优化模式;上传模式读取数值表并训练代理模型后再运行 RSA。文档中的侦察者、交替、探索与开发公式可以保留,但软件结果应以 RSA_ParamsRun_SummaryHistory_MeanHistory_AllBest_Solution 为准。

当前较新的代表性目录为 results/RSA-爬行者搜索分析结果_20260517_144130-优化模式results/RSA-爬行者搜索分析结果_20260517_144142-上传数据代理优化。主工作簿包含 SummaryProblemRSA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。这与旧文中泛化的“优化结果图”表述不同,当前应该明确每个结果表和图的用途。

当前图表稳定输出为 RSA_convergence_时间戳.pngRSA_best_solution_时间戳.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/rsa_sample.xlsx,复现结果进入 repro_outputs/。如果正文讨论上传代理模式,必须把 SurrogateMetrics 视为必需解释项。