正在加载中...

展开本页目录
算法教程MOPSO-多目标粒子群

MOPSO-多目标粒子群

No.196 · 在线教程

MOPSO(Multi-Objective Particle Swarm Optimization)是在粒子群优化基础上引入非支配存档与网格密度控制的多目标算法。本项目的核心实现位于 MOPSO-多目标粒子群/core/mopso.py、core/particle.py 和 c…

MOPSO-多目标粒子群

1. 方法概述

MOPSO(Multi-Objective Particle Swarm Optimization)是在粒子群优化基础上引入非支配存档与网格密度控制的多目标算法。本项目的核心实现位于 MOPSO-多目标粒子群/core/mopso.pycore/particle.pycore/repository.py,统一结果封装与导出位于 core/mopso_calculator.py。项目支持内置 ZDT1/ZDT2/ZDT3,也支持上传数据后构造双目标代理优化问题。

设第 \(i\) 个粒子在第 \(t\) 轮的位置与速度为

$$ \boldsymbol{x}_i^{(t)}\in\Omega,\qquad \boldsymbol{v}_i^{(t)}\in\mathbb{R}^d \tag{1} $$

其目标向量写为

$$ \boldsymbol{f}(\boldsymbol{x}_i^{(t)})= \big(f_1(\boldsymbol{x}_i^{(t)}),\ldots,f_m(\boldsymbol{x}_i^{(t)})\big)^\top \tag{2} $$

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

上传模式下,项目首先训练随机森林预测器

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

再定义第二目标为到样本中心的归一化平方距离

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

于是上传模式的双目标向量为

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

参考点由样本目标范围和中心偏离范围自动生成,后续用于二维 HV 计算。

3. 核心数学模型

3.1 初始化与支配关系

粒子位置按均匀分布初始化,速度初始化为零:

$$ \boldsymbol{x}_i^{(0)}=\boldsymbol{l}+\boldsymbol{r}_i\odot(\boldsymbol{u}-\boldsymbol{l}),\qquad \boldsymbol{v}_i^{(0)}=\boldsymbol{0} \tag{6} $$

项目采用标准最小化支配关系:

$$ \boldsymbol{f}(\boldsymbol{a})\prec \boldsymbol{f}(\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{7} $$

3.2 外部存档与自适应网格

存档 Repository 只保留非支配粒子。若新粒子被已有成员支配,则直接拒绝;若它支配部分旧成员,则先删除旧成员再插入新粒子。

为进行稀疏区域优先选择,项目对每个目标维构造膨胀网格:

$$ \tilde l_j=c_j^{\min}-\alpha(c_j^{\max}-c_j^{\min}),\qquad \tilde u_j=c_j^{\max}+\alpha(c_j^{\max}-c_j^{\min}) \tag{8} $$

其中 \(\alpha=0.1\),\(c_j^{\min}\)、\(c_j^{\max}\) 为当前存档在第 \(j\) 个目标上的极值。领导者所在超网格 \(h\) 的选取概率满足

$$ P_{\mathrm{leader}}(h)\propto n_h^{-\beta} \tag{9} $$

其中 \(n_h\) 是网格 \(h\) 中的粒子数,\(\beta=2\)。若存档超出容量,则按

$$ P_{\mathrm{delete}}(h)\propto n_h^{\gamma} \tag{10} $$

从最拥挤网格中随机删除粒子,其中 \(\gamma=2\)。

3.3 速度与位置更新

设外部存档选出的领导者为 \(\boldsymbol{g}_i^{(t)}\),则速度更新为

$$ \boldsymbol{v}_i^{(t+1)}= w\boldsymbol{v}_i^{(t)} +c_1\boldsymbol{r}_{1,i}^{(t)}\odot\big(\boldsymbol{p}_i^{(t)}-\boldsymbol{x}_i^{(t)}\big) +c_2\boldsymbol{r}_{2,i}^{(t)}\odot\big(\boldsymbol{g}_i^{(t)}-\boldsymbol{x}_i^{(t)}\big) \tag{11} $$

其中 \(\boldsymbol{p}_i^{(t)}\) 是粒子的个体历史最优。位置更新为

$$ \boldsymbol{x}_i^{(t+1)}= \operatorname{clip}\!\big(\boldsymbol{x}_i^{(t)}+\boldsymbol{v}_i^{(t+1)},\boldsymbol{l},\boldsymbol{u}\big) \tag{12} $$

3.4 非均匀变异与个体历史最优

项目每轮还会以概率 mutation_rate 对一个随机维度做非均匀变异。设该维的扰动半径为

$$ R_j^{(t)}=\frac{1}{2}(u_j-l_j)\left(1-\frac{t}{T}\right)^5 \tag{13} $$

则被选中维度的更新为

$$ x_{ij}^{(t+1)}\leftarrow \operatorname{clip}\!\big(x_{ij}^{(t+1)}+\Delta_j,\ l_j,\ u_j\big), \qquad \Delta_j\sim U(-R_j^{(t)},R_j^{(t)}) \tag{14} $$

个体历史最优的更新规则为

$$ \boldsymbol{p}_i^{(t+1)}= \begin{cases} \boldsymbol{x}_i^{(t+1)}, & \boldsymbol{f}(\boldsymbol{x}_i^{(t+1)})\prec \boldsymbol{f}(\boldsymbol{p}_i^{(t)})\\ \boldsymbol{p}_i^{(t)}, & \boldsymbol{f}(\boldsymbol{p}_i^{(t)})\prec \boldsymbol{f}(\boldsymbol{x}_i^{(t+1)})\\ \boldsymbol{x}_i^{(t+1)} \text{ 或 } \boldsymbol{p}_i^{(t)}\ \text{各以 }0.5\text{ 概率}, & \text{二者互不支配} \end{cases} \tag{15} $$

3.5 收敛指标

项目每轮根据外部存档目标值计算二维 Hypervolume:

$$ \mathrm{HV}(\mathcal{R}^{(t)})= \sum_{k=1}^{|\mathcal{R}^{(t)}|} \big(r_1-p_{k1}\big)\big(\hat r_{2,k}-p_{k2}\big) \tag{16} $$

并额外记录存档规模

$$ S^{(t)}=\left|\mathcal{R}^{(t)}\right| \tag{17} $$

这两个序列分别导出为 HVHistoryRepoSizeHistory

4. 算法流程

结合 core/mopso.pycore/repository.pycore/mopso_calculator.py,本项目的 MOPSO 流程为:

  1. 选择内置多目标问题或上传代理优化模式。
  2. 初始化粒子群、速度和个体历史最优。
  3. 以全部初始粒子更新外部存档。
  4. 每轮先根据稀疏网格选择领导者。
  5. 按式(11)至式(12)更新速度与位置。
  6. 按式(13)至式(14)执行单维非均匀变异。
  7. 按式(15)更新个体历史最优,并将新粒子加入存档。
  8. 记录 HV 与存档规模历史,导出 Pareto 解集、参数表、图表和复现实验脚本。

5. 关键参数说明

  • swarm_size:粒子数。
  • max_iter:最大迭代次数。
  • rep_size:外部存档容量。
  • grid_bins:每个目标维的网格划分数。
  • w:惯性权重。
  • c1c2:个体经验与社会经验学习因子。
  • mutation_rate:变异触发概率。

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

项目输出主要包括:

  • ParetoFront:外部存档中的目标值集合。
  • ParetoSolutions:对应决策变量集合。
  • HVHistory:二维 HV 收敛曲线。
  • RepoSizeHistory:外部存档规模变化。
  • Summary:最终 HV、存档规模、目标最小值等信息。

由于项目最终直接以存档内容作为结果,所以这里的 Pareto 解集是真正经过非支配筛选后的外部档案。论文结果部分可先用 ParetoFront/ParetoSolutions 展示最终前沿,再结合 HVHistoryRepoSizeHistory 解释收敛过程和解集覆盖性。若正文需要报告“前沿规模”,应明确该数值对应外部档案中的非支配解规模,而不是当前种群规模。

7. 论文写作模板

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

“本文采用多目标粒子群优化算法求解双目标优化问题。算法在标准 PSO 更新公式基础上,引入外部非支配存档以保存 Pareto 解集,并使用自适应网格机制优先从稀疏区域选择领导者,从而增强前沿覆盖性。本文实现还在每轮加入随时间衰减的单维非均匀变异,并在个体历史最优与当前解互不支配时采用随机保留机制,以维持种群多样性。”

7.1 结果部分补充模板

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

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

7.2 写作替换提示

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

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

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

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

“由表X可知,MOPSO 在[问题名称]上得到的最终外部档案规模 repository_size 为 [repository_size],对应的非支配解规模 pareto_size 为 [pareto_size],末代超体积指标 hv_final 为 [hv_final]。由图X所示 ParetoFront 可见,外部存档中的解在两个目标之间形成了较好的折中分布;由图Y所示 HVHistory 曲线可见,算法在迭代过程中持续提升解集覆盖质量;由图Z所示 RepoSizeHistory 还可进一步观察外部档案规模由扩张到稳定的演化过程。表Y给出了 ParetoSolutions 中代表性解的决策变量组合,必要时还可结合 Summary 中的 min_objectives 报告各目标达到的最低水平。若采用上传代理优化模式,则应说明该前沿对应“预测目标值与样本中心偏离度”之间的权衡关系,并结合 SurrogateMetrics 中的 RMSE、MAE 与 \(R^2\) 指标论证结果的可靠性。”

8. 实现说明与注意事项

就本项目当前可运行版本而言,MOPSO 的真实工程主链路位于:

  • 具体的算法3/优化与多目标/MOPSO-多目标粒子群/core/mopso.py
  • 具体的算法3/优化与多目标/MOPSO-多目标粒子群/core/repository.py
  • 具体的算法3/优化与多目标/MOPSO-多目标粒子群/core/mopso_calculator.py
  • 具体的算法3/优化与多目标/MOPSO-多目标粒子群/ui/results_widget.py

其中真正决定结果文件结构的是 core/mopso_calculator.py::_save_to_excel()

8.1 当前 Excel 工作簿与图表导出

根据 _save_to_excel() 的实际实现,结果工作簿包含:

  • Parameters
  • Summary
  • ParetoFront
  • ParetoSolutions
  • HVHistory
  • RepoSizeHistory
  • UploadedData
  • Bounds
  • SurrogateMetrics
  • Charts

其中:

  • ParetoFront 存放最终非支配目标值;
  • ParetoSolutions 存放对应决策变量;
  • HVHistory 存放 HV 收敛曲线;
  • RepoSizeHistory 存放外部存档规模随迭代变化;
  • UploadedDataBoundsSurrogateMetrics 仅在上传代理模式下出现;
  • Charts 记录图表名、用途与实际路径。

程序当前固定输出三张核心图:

  • charts/pareto_front.png
  • charts/hv_history.png
  • charts/repo_size.png

8.2 当前 results 目录与 repro 结构

当前结果目录通常形如:

MOPSO-多目标粒子群分析结果_<YYYYMMDD_HHMMSS>/

目录中除主结果 Excel 外,还会生成:

  • repro_mopso.py
  • repro_inputs/<上传数据文件>

结果页 ui/results_widget.py 还支持额外导出:

  • mopso_reproduce_<tag>.py
  • mopso_reproduce_<tag>_output.txt
  • <stem>_reproduce.xlsx

这说明当前项目已经形成“双层复现链”:核心保存时自动产出 repro_mopso.py,结果页又可进一步导出一次显式复现实验脚本。

8.3 当前上传代理模式的真实工程口径

需要特别说明的是:本模块并不是只有基准测试函数 ZDT1/ZDT2/ZDT3。当前 UI 里还存在真实上传入口 ui/upload_widget.py,上传模式下程序会:

  1. 读取用户样本;
  2. 构造随机森林代理模型;
  3. 以预测目标和中心偏离度组成双目标问题;
  4. 在保存结果时额外输出 UploadedDataBoundsSurrogateMetrics

因此,论文或交接说明若涉及上传模式,必须把它写成“代理多目标优化”而不是“直接对原始表格做 Pareto 排序”。

8.4 当前项目实现的使用注意事项

  • 本实现当前主要面向二维多目标问题,HV 计算也仅在二维下有效;
  • 上传模式下第二目标 distance_to_center 为项目自定义目标,用于把代理优化问题扩展为 Pareto 问题;
  • 领导者并不是从全部存档均匀采样,而是通过 \(n_h^{-\beta}\) 的稀疏优先机制选出;
  • 边界处理采用简单截断,代码中没有启用速度反弹;
  • 论文若与程序输出保持一致,应把 Summary/ParetoFront/ParetoSolutions/HVHistory/RepoSizeHistory/Charts 视为标准结果集合,而不是只摘取最终前沿图。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Parameters 表可写为:表X MOPSO 参数设置与问题配置。
  • Summary 表可写为:表X MOPSO 前沿规模与 HV 摘要。
  • ParetoFront 表可写为:表X MOPSO 最终 Pareto 前沿目标值。
  • ParetoSolutions 表可写为:表X MOPSO Pareto 前沿对应决策变量。
  • HVHistory 表可写为:表X MOPSO 超体积收敛历史。
  • RepoSizeHistory 表可写为:表X MOPSO 外部存档规模变化历史。
  • 上传代理模式下,UploadedData 表可写为:表X MOPSO 上传样本预览。
  • 上传代理模式下,Bounds 表可写为:表X MOPSO 逐维搜索边界。
  • 上传代理模式下,SurrogateMetrics 表可写为:表X MOPSO 代理模型误差指标。
  • Charts 表可写为:表X MOPSO 图表索引与路径。
  • pareto_front.png 建议写为:图X MOPSO Pareto 前沿散点图。
  • hv_history.png 建议写为:图X MOPSO HV 收敛曲线。
  • repo_size.png 建议写为:图X MOPSO 外部存档规模变化图。

9.2 终审说明

  • 当前实现的标准输出口径就是 Parameters / Summary / ParetoFront / ParetoSolutions / HVHistory / RepoSizeHistory / Charts。论文中若写“标准结果表”,应按这组真实 sheet 名表述,而不是引用泛化的多目标模板。
  • Summary 只给出前沿规模、HV 末值、仓库规模等摘要量;真正的前沿点集和对应解向量分别在 ParetoFrontParetoSolutions,正文不要把三者混写。
  • 该实现固定导出三张核心图:前沿散点图、HV 曲线、仓库规模曲线。论文图题应围绕这三类展开,不要额外写成“IGD 曲线”或“Spacing 曲线”,因为当前程序未自动输出这些图件。
  • 上传代理模式下的第二目标是项目自定义的 distance_to_center,因此正文若解释上传模式,应写成“预测目标与样本中心偏离度的双目标代理优化”,而不是把它误写为原始问题天然自带的双目标。

9.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/优化与多目标/MOPSO-多目标粒子群。当前最完整、最适合绑定真实上传代理场景的结果池不是顶层 results,而是 具体的算法3/优化与多目标/MOPSO-多目标粒子群/results/manual_upload_verify_20260328/mopso_sample_upload_real_after_fix/MOPSO-多目标粒子群分析结果_20260328_234422

该目录顶层主结果工作簿为:

  • 具体的算法3/优化与多目标/MOPSO-多目标粒子群/results/manual_upload_verify_20260328/mopso_sample_upload_real_after_fix/MOPSO-多目标粒子群分析结果_20260328_234422/MOPSO-多目标粒子群分析结果_20260328_234422.xlsx

实测工作表为:

  • Parameters
  • Summary
  • ParetoFront
  • ParetoSolutions
  • HVHistory
  • RepoSizeHistory
  • UploadedData
  • Bounds
  • SurrogateMetrics
  • Charts

这份顶层工作簿就是上传代理模式下的主结果证据,其中 UploadedDataBoundsSurrogateMetrics 说明当前结果不是纯公式型多目标求解,而是绑定了上传样本、边界和代理模型误差。

顶层目录还实际包含:

  • charts/hv_history.png
  • charts/pareto_front.png
  • charts/repo_size.png
  • repro_inputs/mopso_sample.xlsx
  • repro_mopso.py
  • mopso_reproduce_20260328_234422.py

其中 repro_mopso.pymopso_reproduce_20260328_234422.py 都使用 repro_inputs/mopso_sample.xlsx 作为输入副本。脚本源码中实际写的是 INPUT_FILE = Path('repro_inputs/mopso_sample.xlsx')input_file = Path('repro_inputs/mopso_sample.xlsx'),这说明复现口径已经是结果目录内部相对路径。

同一顶层目录下还嵌套了三个再生产物子目录:

  • MOPSO-多目标粒子群分析结果_20260328_234428
  • MOPSO-多目标粒子群分析结果_20260328_234433
  • MOPSO-多目标粒子群分析结果_20260328_234439

这些子目录内部各自又包含一份 xlsx、三张图、repro_inputs/mopso_sample.xlsxrepro_mopso.py。因此这里必须明确区分三层结构:

  1. 顶层 ...234422.xlsx 是这次手动上传验证目录的主结果。
  2. 顶层 repro_mopso.py / mopso_reproduce_20260328_234422.py 是针对主结果目录的复现入口。
  3. ...234428 / ...234433 / ...234439 是同一结果池里后续脚本再运行生成的再生产物子目录。

如果把这些时间戳子目录全部混写成“一次单轮实验”,就会把主结果和多次 repro 再运行结果混为一谈。这一篇文档必须按“主结果证据 + 顶层 repro 入口 + 子目录再生产物池”来描述,才符合真实磁盘口径。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/MOPSO-多目标粒子群。这是多目标粒子群算法,核心输出不是单一最优解,而是外部仓库中的 Pareto 非支配解集。软件实现支持 多目标优化多目标上传数据代理优化;上传模式同样通过代理预测目标和 distance_to_center 构成双目标问题。

当前较新的代表性目录为 results/MOPSO-多目标粒子群分析结果_20260517_150201-多目标优化results/MOPSO-多目标粒子群分析结果_20260517_150240-多目标上传数据代理优化。主工作簿在普通多目标模式下包含 字段说明SummaryProblemAlgorithm_ParamsBoundsPareto_SolutionsPareto_ObjectivesPopulation_FinalHistoryRun_SummaryQuality_MetricsCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetricsHistory 记录 HV 和外部仓库规模,Quality_Metrics 记录最终 HV、Spacing、Pareto 数量等指标。

当前图表位于 charts/ 下,稳定输出包括 pareto_front.pnghv_history.pngrepository_size.png。复现代码位于 复现代码/多目标优化/复现代码/多目标上传数据代理优化/,上传模式输入副本为 repro_inputs/mopso_sample.xlsx,复现脚本会将新结果写入同级 repro_outputs/。旧文中关于 20260328 多层再生产物池的说明可作为历史证据保留,但当前较新交付说明应优先按 20260517 的主结果目录和三张图解释。