正在加载中...

展开本页目录
算法教程SPEA2-强度帕累托

SPEA2-强度帕累托

No.206 · 在线教程

本项目实现的是 SPEA2(Strength Pareto Evolutionary Algorithm 2)多目标优化框架,核心求解器位于 SPEA2-强度帕累托/core/spea2.py 与 core/spea2runner.py,上传代理问题定义位于 utils/upl…

SPEA2-强度帕累托

1. 方法概述

本项目实现的是 SPEA2(Strength Pareto Evolutionary Algorithm 2)多目标优化框架,核心求解器位于 SPEA2-强度帕累托/core/spea2.pycore/spea2_runner.py,上传代理问题定义位于 utils/upload_surrogate_problem.py。项目支持:

  • 内置多目标基准问题;
  • upload_surrogate 上传代理多目标优化;
  • runs>1 的多次独立运行;
  • 最终按非支配前沿规模选择代表性运行。

项目内部统一按最小化形式求解双目标问题:

$$ \min_{\boldsymbol{x}\in\Omega}\ \boldsymbol{f}(\boldsymbol{x}) = \big(f_1(\boldsymbol{x}),f_2(\boldsymbol{x})\big)^\top \tag{1} $$

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

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

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

然后构造第二目标 distance_to_center

$$ d_c(\boldsymbol{x}) = \frac{1}{d}\sum_{j=1}^{d}\left(\frac{x_j-c_j}{s_j}\right)^2 \tag{3} $$

其中 \(\boldsymbol{c}\) 为样本中心,\(\boldsymbol{s}\) 为逐维跨度。于是上传模式下实际优化的双目标为

$$ \boldsymbol{f}_{up}(\boldsymbol{x}) = \begin{bmatrix} \sigma \hat f(\boldsymbol{x})\\ d_c(\boldsymbol{x}) \end{bmatrix}, \qquad \sigma= \begin{cases} 1, & \text{min}\\ -1, & \text{max} \end{cases} \tag{4} $$

项目还会基于训练数据自动生成 2 维参考点 reference_point,用于计算超体积 HV。

3. 核心数学模型

3.1 支配关系与强度适应度

SPEA2 使用最小化支配关系:

$$ \boldsymbol{a}\prec \boldsymbol{b} \Longleftrightarrow \big(\forall j,\ f_j(\boldsymbol{a})\le f_j(\boldsymbol{b})\big)\land \big(\exists j,\ f_j(\boldsymbol{a})< f_j(\boldsymbol{b})\big) \tag{5} $$

对个体 \(i\),其强度值定义为其支配的个体数:

$$ S(i)=\left|\{j\ne i\mid \boldsymbol{x}_i\prec \boldsymbol{x}_j\}\right| \tag{6} $$

原始适应度为所有支配它的个体强度之和:

$$ R(i)=\sum_{j:\boldsymbol{x}_j\prec \boldsymbol{x}_i}S(j) \tag{7} $$

3.2 密度项与总适应度

在目标空间中计算欧氏距离后,项目取

$$ k=\max\!\left(1,\left\lfloor \sqrt{N}\right\rfloor\right) \tag{8} $$

并将第 \(k\) 个近邻距离记为 \(\sigma_i^{(k)}\)。于是密度项为

$$ D(i)=\frac{1}{\sigma_i^{(k)}+2} \tag{9} $$

SPEA2 总适应度写为

$$ F(i)=R(i)+D(i) \tag{10} $$

3.3 环境选择

代码首先把所有 \(F(i)<1\) 的个体加入档案集:

$$ \mathcal{A}_{t+1}=\{i\in \mathcal{P}_t\cup \mathcal{A}_t \mid F(i)<1\} \tag{11} $$

若数量不足,则按 \(F(i)\) 从小到大补齐;若数量过多,则按目标空间距离执行 truncation,迭代删除与其他解最拥挤的个体,直到满足档案规模约束。

3.4 交配选择与繁殖

父代选择采用基于 spea2_fitness 的二元锦标赛:

$$ i^\star=\operatorname*{arg\,min}_{i\in\{a,b\}}F(i) \tag{12} $$

繁殖阶段使用 SBX 交叉。对某一维,子代形如

$$ c_1=\frac{1}{2}\Big((y_1+y_2)-\beta_q(y_2-y_1)\Big), \qquad c_2=\frac{1}{2}\Big((y_1+y_2)+\beta_q(y_2-y_1)\Big) \tag{13} $$

随后再进行多项式变异:

$$ x_j\leftarrow \operatorname{clip}\!\big(x_j+\Delta_q(u_j-l_j),\,l_j,\,u_j\big) \tag{14} $$

代码中逐维变异概率设置为

$$ p_m=\frac{1}{d} \tag{15} $$

3.5 HV 记录与最佳运行选择

core/spea2_runner.py 会在每一代基于当前非支配档案计算二维 HV。其实现本质上按 \(f_1\) 升序后累加矩形面积:

$$ \mathrm{HV} = \sum_{i=1}^{K}(r_1-p_{i,1})(y_{i-1}-p_{i,2}), \qquad y_0=r_2 \tag{16} $$

若总共运行 \(R\) 次,则最佳运行的选择规则不是 HV 最大,而是

$$ r^\star= \operatorname*{arg\,max}_{1\le r\le R} \Big(\text{nondominated\_size}_r,\ -\overline{f_{1,r}}\Big) \tag{17} $$

即优先比较最终非支配解个数,并列时再比较 pareto_df["f1"].mean() 更小者。

4. 算法流程

结合 core/spea2.pycore/spea2_runner.pyutils/upload_surrogate_problem.pyutils/excel_handler.py,本项目 SPEA2 的流程为:

  1. 选择内置多目标基准问题或 upload_surrogate
  2. 若为上传模式,则训练随机森林,并构造式(4)的双目标问题。
  3. 初始化种群,计算目标向量。
  4. 按式(6)至式(10)计算 strength/raw_fitness/density/spea2_fitness
  5. 按式(11)执行环境选择,得到档案集。
  6. 在档案集上做二元锦标赛,随后执行 SBX 与多项式变异。
  7. 每代记录 front_sizenondominated_sizebest_f1hv
  8. 多次运行后按式(17)选出代表性最佳运行并导出结果。

5. 关键参数说明

  • pop_size:种群规模。
  • archive_size:外部档案规模。
  • max_iter:最大迭代次数。
  • runs:独立运行次数。
  • seed:基础随机种子,后续运行按 seed+r-1 偏移。
  • 上传模式下的 objective_direction:决定式(4)中第一目标的符号。

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

utils/excel_handler.py 导出的主要工作表包括:

  • Summary:问题名、运行次数、front_size_best_runarchive_size_best_runhv_final、参考点等;
  • ProblemSPEA2_Params:问题参数与算法参数;
  • Run_Summary:每次运行的最终前沿规模、非支配规模与 hv_final
  • History_All:所有运行各代的 front_sizenondominated_sizehv 等历史;
  • Pareto_Front:最佳运行档案中再次筛选后的非支配前沿;
  • ParetoFrontParetoSolutions:目标空间前沿与对应决策变量;
  • HVHistory:最佳运行的 HV 演化;
  • Archive_All:最佳运行最终档案全集;
  • Charts:Pareto 图、前沿规模历史图、HV 曲线图路径。

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

需要特别注意:_extract_pareto() 会对最终档案再做一次非支配筛选,因此 Pareto_Front 可能少于 Archive_All。论文结果部分建议把 Pareto_Front 作为主前沿数据,把 Archive_All 作为附录中的最终档案全集,并结合 HVHistory 解释收敛趋势。若比较多次独立运行,应以 Run_Summary 中的 front_sizehv_final 为统计口径,而不是直接统计 Archive_All 的行数。

7. 论文写作模板

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

“本文采用 SPEA2 进行双目标优化。算法首先基于支配关系计算个体的强度值、原始适应度和密度项,并据此形成总适应度;随后通过环境选择维护外部档案集,再在档案集上执行基于适应度的二元锦标赛选择,并结合 SBX 交叉与多项式变异生成新种群。对于数据驱动场景,本文进一步将随机森林预测目标与样本中心距离共同构造为双目标代理优化问题,并利用超体积(HV)跟踪收敛过程。”

7.1 结果部分补充模板

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

“图X展示了算法得到的 Pareto 前沿,表X列出了代表性非支配解及其决策变量和目标函数值。结合 HV、IGD、前沿规模或档案规模等指标可见,该算法在保持解集多样性的同时实现了较好的收敛性能。对于上传代理优化场景,所得前沿刻画了预测目标与样本中心偏离度之间的权衡关系,从而为方案筛选提供了多解备选。”

7.2 写作替换提示

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

  • ParetoFrontPareto_Front 可写为“最终 Pareto 前沿解集”或“非支配解集”;
  • ParetoSolutions 可写为“Pareto 前沿对应的决策变量组合”;
  • HVHistoryhv_final 可写为“超体积指标及其演化曲线”;
  • igd 可写为“反世代距离指标”;
  • 上传代理模式下的第二目标可写为“预测目标与样本中心偏离度之间的权衡关系”。

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

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

“由表X可知,SPEA2 在 [runs] 次独立运行中选出的代表性结果,其最终非支配解规模 front_size_best_run 为 [front_size_best_run],对应档案规模 archive_size_best_run 为 [archive_size_best_run],末代超体积指标 hv_final 为 [hv_final]。这里应注明,代表性运行的选择规则是“非支配解数量优先、平均 \(f_1\) 次之”,而不是单纯按 HV 最大确定。图X展示了 ParetoFrontPareto_Front 所对应的最终前沿分布,图Y给出了 HVHistory 的演化曲线,可以看出算法在迭代后期趋于稳定。表Y列出了 ParetoSolutions 中的代表性决策变量组合,而 Archive_All 可作为附录补充全部最终档案解。若采用上传代理优化模式,则应进一步说明第二目标为样本中心偏离度,并结合 SurrogateMetrics 中的 RMSE、MAE 与 \(R^2\) 指标说明所得 Pareto 解集具有一定的数据驱动可信度。”

8. 实现说明与注意事项

  • 本实现是标准 SPEA2 风格的双目标求解器,适合连续变量多目标优化。
  • 上传模式下第二目标 distance_to_center 是项目自定义目标,不是原始基准测试函数的一部分。
  • 最佳运行选择标准是“最终非支配解数量优先,平均 \(f_1\) 次之”,不是 HV 最优。
  • HV 计算使用的是二维专用实现,因此这里的导出解释应限定在当前双目标代码版本。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Summary 表可写为:表X SPEA2 最佳运行摘要与 HV 统计。
  • Run_Summary 表可写为:表X SPEA2 各次运行前沿规模与超体积汇总。
  • Pareto_Front 表可写为:表X SPEA2 代表性运行的最终非支配前沿。
  • ParetoFrontParetoSolutions 可写为:表X SPEA2 前沿目标值与对应决策变量。
  • HVHistory 表可写为:表X SPEA2 超体积演化历史。
  • Archive_All 表可写为:表X SPEA2 最终档案全集。

9.2 终审说明

  • 代表性运行不是按 HV 最大选取,而是按“前沿规模优先、平均 \(f_1\) 次之”选取,正文必须写明。
  • Pareto_Front 经过再次非支配筛选,不能把它和 Archive_All 的行数直接等同。

9.3 全量强化补充

本次全量强化优先绑定修复后的真实上传验证目录 具体的算法3/优化与多目标/SPEA2-强度帕累托/results/manual_upload_verify_20260329/spea2_sample_upload_real_after_fix_003459。主结果文件可采用 SPEA2_results_20260329_003512_445396.xlsx,其实际工作表为 SummaryProblemSPEA2_ParamsBoundsRun_SummaryHistory_AllPareto_FrontParetoFrontParetoSolutionsHVHistoryArchive_AllUploadedDataSurrogateMetricsCharts

当前真实图文件位于 charts/ 子目录,包括与主结果时间戳对应的 SPEA2_pareto_20260329_003512_445396.pngSPEA2_history_20260329_003512_445396.pngSPEA2_hv_20260329_003512_445396.png。同目录还保留更早的 003504003511 版本,因此论文正文引用图件时必须与主工作簿时间戳保持一致。

复现脚本为 repro_spea2.py,输入口径为 problem_file = 'repro_inputs/spea2_sample.xlsx',并以 problem_mode = 'upload_surrogate'target_column = 'f_sphere'objective_direction = 'min' 运行。由于该目录是 after_fix 版本,正文和附录都应固定引用此目录,避免把修复前 003107 目录里的旧结果混入正式证据。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/SPEA2-强度帕累托。这是多目标算法,不应按单目标最优值解释。当前软件实现支持多目标优化与多目标上传数据代理优化;上传模式构造代理目标后再运行 SPEA2,核心输出应围绕 Pareto 解集和质量指标。

当前较新的代表性目录为 results/SPEA2-强度帕累托分析结果_20260517_144353-多目标优化results/SPEA2-强度帕累托分析结果_20260517_144404-多目标上传数据代理优化。主工作簿应重点看 SummaryProblemSPEA2_ParamsBoundsPareto_SolutionsPareto_ObjectivesPopulation_FinalHistoryRun_SummaryQuality_MetricsCharts;上传模式再叠加 UploadedProblemUploadedDataSurrogateMetrics。因此论文写作中应把这篇视为 Pareto 算法,而不是单纯“一个最优解”的优化器。

当前图表稳定输出为 pareto_front.pnghv_history.pngrepository_size.png。复现代码位于 复现代码/多目标优化/复现代码/多目标上传数据代理优化/,上传模式输入副本为 repro_inputs/spea2_sample.xlsx,复现输出进入 repro_outputs/。如果正文解释质量,建议把 HV、Spacing 和 Pareto 数量一起列出。