正在加载中...

展开本页目录
算法教程PSO-粒子群优化

PSO-粒子群优化

No.201 · 在线教程

本项目实现的是面向单目标连续优化的 PSO(Particle Swarm Optimization,粒子群优化)桌面版,核心代码位于 PSO-粒子群优化/core/psocalculator.py,界面实际入口为 ui/uploadwidget.py,结果页线程通过 ui/re…

PSO-粒子群优化

1. 方法概述

本项目实现的是面向单目标连续优化的 PSO(Particle Swarm Optimization,粒子群优化)桌面版,核心代码位于 PSO-粒子群优化/core/pso_calculator.py,界面实际入口为 ui/upload_widget.py,结果页线程通过 ui/results_widget.py 调用 PsoCalculator.run_analysis。项目支持:

  • 内置基准函数 F1-F6/Ackley/Griewank
  • 上传数据后训练随机森林代理的单目标优化;
  • runs>1 的重复运行;
  • clip/midpoint/random 三种边界处理;
  • 导出初始群体、最终群体、初始速度、最终速度。

算法求解的基本问题为

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

若界面选择最大化,则代码会先把目标取负后再按最小化运行。

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

上传模式的边界由样本逐维最小值与最大值给出:

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

导出阶段再利用 predict_actualdisplay_curve 把结果恢复为真实方向。

3. 核心数学模型

3.1 初始化

对第 \(i\) 个粒子,位置和速度分别初始化为

$$ \boldsymbol{x}_i^{(0)}=\boldsymbol{l}+\boldsymbol{r}_i\odot(\boldsymbol{u}-\boldsymbol{l}), \qquad \boldsymbol{r}_i\sim U(0,1)^d \tag{5} $$

$$ \boldsymbol{v}_i^{(0)}= \operatorname{clip}\!\Big((2\boldsymbol{q}_i-\boldsymbol{1})\cdot \rho v_{\max},-v_{\max},v_{\max}\Big), \qquad \boldsymbol{q}_i\sim U(0,1)^d \tag{6} $$

其中 \(\rho\) 对应 init_vel_scale

3.2 个体最优与群体最优

项目记录每个粒子的历史个体最优

$$ \boldsymbol{p}_i^{(t)}=\operatorname*{arg\,min}_{0\le k\le t} f(\boldsymbol{x}_i^{(k)}) \tag{7} $$

以及全局最优

$$ \boldsymbol{g}^{(t)}=\operatorname*{arg\,min}_{1\le i\le N} f(\boldsymbol{p}_i^{(t)}) \tag{8} $$

3.3 线性递减惯性权重与速度更新

代码采用线性递减惯性权重:

$$ w_t=w_{\max}-t\frac{w_{\max}-w_{\min}}{T} \tag{9} $$

速度更新公式为

$$ \boldsymbol{v}_i^{(t+1)} = w_t\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}^{(t)}-\boldsymbol{x}_i^{(t)}\big) \tag{10} $$

随后执行速度限幅与位置更新:

$$ \boldsymbol{v}_i^{(t+1)}\leftarrow \operatorname{clip}\big(\boldsymbol{v}_i^{(t+1)},-v_{\max},v_{\max}\big) \tag{11} $$

$$ \boldsymbol{x}_i^{(t+1)}=\boldsymbol{x}_i^{(t)}+\boldsymbol{v}_i^{(t+1)} \tag{12} $$

3.4 边界处理

项目支持三种边界处理:

$$ \operatorname{clip}:\ x_j\leftarrow \min\big(\max(x_j,l_j),u_j\big) \tag{13} $$

$$ \operatorname{midpoint}:\ x_j\leftarrow \begin{cases} \dfrac{x_j+l_j}{2}, & x_j<l_j\\ \dfrac{x_j+u_j}{2}, & x_j>u_j \end{cases} \tag{14} $$

$$ \operatorname{random}:\ x_j\leftarrow l_j+r_j(u_j-l_j),\qquad r_j\sim U(0,1) \tag{15} $$

3.5 多次运行与最佳运行复跑

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

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

最佳运行按最终最优值选择:

$$ r^\star= \begin{cases} \operatorname*{arg\,min}_{1\le r\le R} b_r, & \text{min}\\ \operatorname*{arg\,max}_{1\le r\le R} b_r, & \text{max} \end{cases} \tag{17} $$

代码随后会用同一随机种子把第 \(r^\star\) 次再次完整运行一遍,以导出该次运行的初始群体、最终群体、初始速度和最终速度。

4. 算法流程

结合 core/pso_calculator.pyutils/problem_definition.pyui/upload_widget.pyutils/pso_exporter.py,本项目 PSO 的流程为:

  1. 选择内置基准函数或上传代理优化模式。
  2. 解析边界与算法参数,并在上传模式下训练随机森林代理。
  3. 按式(5)和式(6)初始化粒子位置与速度。
  4. 依据式(7)至式(12)迭代更新 pbestgbest、速度和位置。
  5. 按式(13)至式(15)执行边界处理。
  6. runs>1,汇总所有运行并按式(17)选出最佳运行。
  7. 用最佳运行对应的随机种子复跑一次,输出群体与速度表。
  8. 导出 Excel、收敛图、箱线图以及复现实验脚本。

5. 关键参数说明

  • pop_size:粒子数。
  • max_iter:最大迭代次数。
  • runs:独立运行次数。
  • w_maxw_min:惯性权重上下限。
  • c1c2:个体学习因子和社会学习因子。
  • v_max:速度上限。
  • init_vel_scale:初始速度缩放比例。
  • bound_methodclipmidpointrandom

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

项目输出非常完整,实际导出的主要工作表包括:

  • 运行汇总best_runbest_fitnessmean_best_fitnessstd_best_fitness、耗时等;
  • 参数边界设置:问题配置和逐维边界;
  • 初始群体最终群体:代表性最佳运行的粒子位置;
  • 初始速度最终速度:代表性最佳运行的速度矩阵;
  • 多次运行:每次运行的最佳值与耗时;
  • 收敛曲线:最佳运行曲线,以及多次运行下的均值和标准差;
  • 最优解:最佳粒子位置向量;
  • 结果解读图表清单:结果说明和图表路径。

上传模式下还会追加 UploadedDataBoundsSurrogateMetrics

需要注意,代码输出的群体和速度信息来自“最佳运行的复跑结果”,不是第一次多次运行循环中直接缓存的快照。因此,论文结果部分建议先报告 运行汇总多次运行 中的统计值,再展示 收敛曲线,最后把 最优解初始群体/最终群体初始速度/最终速度 作为代表性最佳运行的复现实验补充材料。若为上传代理模式,SurrogateMetrics 应与最优预测值同步给出。

7. 论文写作模板

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

“本文采用标准粒子群优化(PSO)进行单目标连续优化。算法首先随机初始化粒子位置与速度,并记录个体历史最优和群体历史最优;随后在每一代中使用线性递减惯性权重更新速度,再根据个体认知项与群体社会项更新位置。为增强结果可复现性,本文对多次独立运行中的最佳随机种子进行复跑,从而进一步导出最佳运行的初始群体、最终群体及速度矩阵。”

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

  • 本实现是单目标 PSO,不包含拓扑邻域 PSO 或多目标 PSO 扩展。
  • 最大化问题通过对目标函数取负实现;上传代理模式也遵循这一内部转换逻辑。
  • best_run 选出后,代码会复跑同一 seed 导出群体与速度,这是本项目和很多简化实现不同的地方。
  • 多次运行时收敛均值的标准差使用 ddof=1 计算;若只运行一次,则不绘制箱线图。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 多次运行 表可写为:表X PSO 各次运行结果汇总。
  • 收敛曲线 表可写为:表X PSO 最佳运行与重复实验均值收敛曲线。
  • 最优解 表可写为:表X PSO 求得的最优粒子位置向量。
  • 初始群体最终群体 表可写为:表X PSO 代表性最佳运行的种群状态对比。
  • 初始速度最终速度 表可写为:表X PSO 代表性最佳运行的速度矩阵对比。
  • 图表清单 中收敛图建议写为:图X 粒子群优化算法收敛曲线。

9.2 终审说明

  • 该实现可写多次运行统计,但群体和速度矩阵只对应最佳运行复跑结果,不代表所有运行的直接缓存。
  • 上传代理模式下,最优预测值与 SurrogateMetrics 需要同步给出。

9.3 全量强化补充

本次全量强化绑定的真实上传验证目录为 具体的算法3/优化与多目标/PSO-粒子群优化/results/manual_upload_verify_20260325/PSO-粒子群优化分析结果_20260325_manual。主结果文件为 PSO-粒子群优化分析结果_20260325_manual.xlsx,实际工作表为 运行汇总参数边界设置初始群体最终群体初始速度最终速度多次运行收敛曲线最优解UploadedDataBoundsSurrogateMetrics结果解读图表清单

当前真实图文件为 charts/convergence.png。同目录还存在 results/results.xlsxresults/repro_pso.py 作为复现输出,因此论文正文若引用 PSO 主实验,应固定首层主结果文件,不要把 results/ 子目录里的复现实跑文件混入主结论。

复现脚本为 repro_pso.py,输入口径为 INPUT_FILE = Path('repro_inputs/pso_sample.csv'),参数中显式包含 problem_mode = 'upload_surrogate'target_column = 'f_sphere'objective_direction = 'min'。因此这篇文档应按“上传代理 PSO 复现 + 最佳运行复跑导出群体与速度矩阵”这一真实实现口径来写。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/PSO-粒子群优化。软件实现支持优化模式和上传数据代理优化模式;上传模式通过数值表训练代理目标后执行粒子群搜索。文档中的惯性权重、学习因子、速度/位置更新公式可以保留,但软件结果应按 PSO_ParamsRun_SummaryHistory_MeanHistory_AllBest_Solution 解读。

当前较新的代表性目录为 results/PSO-粒子群优化分析结果_20260517_144100-优化模式results/PSO-粒子群优化分析结果_20260517_144111-上传数据代理优化。主工作簿 PSO_results_*.xlsx 通常包含 SummaryProblemPSO_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。文档中应强调 Best_Solution 是当前最优粒子位置向量,而 Best_Fitness 或类似字段是对应目标值。

当前图表稳定输出为 PSO_convergence_时间戳.pngPSO_best_solution_时间戳.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/pso_sample.xlsx,复现结果进入 repro_outputs/。若用户使用上传代理模式,正文必须同步说明 SurrogateMetrics,不要把结果写成直接真实目标函数求解。