正在加载中...

展开本页目录
算法教程GSA-引力搜索

GSA-引力搜索

No.188 · 在线教程

引力搜索算法(Gravitational Search Algorithm, GSA)是一类受牛顿万有引力定律启发的群体优化方法。在本项目中,核心实现位于 GSA-引力搜索/core/gsa.py,UI 层通过 ui/uploadwidget.py 进一步封装了内置测试函数和上…

GSA-引力搜索

1. 方法概述

引力搜索算法(Gravitational Search Algorithm, GSA)是一类受牛顿万有引力定律启发的群体优化方法。在本项目中,核心实现位于 GSA-引力搜索/core/gsa.py,UI 层通过 ui/upload_widget.py 进一步封装了内置测试函数和上传数据代理优化两种模式。

设第 \(i\) 个搜索体在第 \(t\) 轮的位置与速度分别为

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

其中 \(\Omega=[\boldsymbol{l},\boldsymbol{u}]\subset\mathbb{R}^d\) 为变量边界。

2. 问题定义与代理优化

在基准函数模式下,项目求解

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

在上传代理优化模式下,UI 会先训练随机森林代理模型。设训练样本为

$$ \mathcal{D}=\{(\boldsymbol{x}^{(n)},y^{(n)})\}_{n=1}^{N_s} \tag{3} $$

代理目标函数为

$$ \hat{f}(\boldsymbol{x})=\frac{1}{B}\sum_{b=1}^{B}T_b(\boldsymbol{x}),\qquad B=300 \tag{4} $$

变量边界由特征极值给出:

$$ l_j=\min_{1\le n\le N_s}x_j^{(n)},\qquad u_j=\max_{1\le n\le N_s}x_j^{(n)} \tag{5} $$

若目标方向为最大化,则通过

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

转化为内部最小化后再传入 GSA 核心。

3. 核心数学模型

3.1 初始化

设种群规模为 \(N\)。项目按均匀分布初始化搜索体位置,并将初始速度设为零:

$$ \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{v}_i^{(0)}=\boldsymbol{0} \tag{8} $$

3.2 质量计算

设当前代适应度最优值和最差值分别为

$$ f_{best}^{(t)}=\min_i f(\boldsymbol{x}_i^{(t)}),\qquad f_{worst}^{(t)}=\max_i f(\boldsymbol{x}_i^{(t)}) \tag{9} $$

若二者不同,则项目按如下方式计算归一化前质量:

$$ q_i^{(t)}=\frac{f(\boldsymbol{x}_i^{(t)})-f_{worst}^{(t)}}{f_{best}^{(t)}-f_{worst}^{(t)}} \tag{10} $$

并进一步归一化为

$$ M_i^{(t)}=\frac{q_i^{(t)}}{\sum_{j=1}^{N}q_j^{(t)}} \tag{11} $$

若所有个体适应度相同,则令

$$ M_i^{(t)}=\frac{1}{N} \tag{12} $$

3.3 引力常数衰减

项目采用指数衰减的引力常数:

$$ G^{(t)}=G_0\exp\!\left(-\alpha \frac{t}{T}\right) \tag{13} $$

其中 \(G_0\) 为初始引力常数,\(\alpha\) 为衰减系数,\(T\) 为最大迭代次数。

3.4 Kbest 机制

每轮仅让前 \(K^{(t)}\) 个最优个体参与引力作用。项目使用

$$ K^{(t)}=\max\!\left(1,\left\lfloor N\left(1-\frac{t}{T}\right)\right\rfloor\right) \tag{14} $$

并从适应度最优的前 \(K^{(t)}\) 个个体构成引力作用集合。

3.5 加速度计算

对第 \(i\) 个个体和第 \(j\) 个 Kbest 个体,项目先计算距离

$$ R_{ij}^{(t)}=\|\boldsymbol{x}_i^{(t)}-\boldsymbol{x}_j^{(t)}\|_2 \tag{15} $$

然后按代码实现构造引力项:

$$ \boldsymbol{a}_i^{(t)} \leftarrow \boldsymbol{a}_i^{(t)} + \boldsymbol{r}_{ij}^{(t)}\odot \frac{G^{(t)} M_i^{(t)} M_j^{(t)}}{R_{ij}^{(t)}+\varepsilon} \cdot \frac{\boldsymbol{x}_j^{(t)}-\boldsymbol{x}_i^{(t)}}{M_i^{(t)}+\varepsilon} \tag{16} $$

其中 \(\boldsymbol{r}_{ij}^{(t)}\sim U(0,1)^d\),\(\varepsilon\) 为极小正数。式(16)体现了项目代码中“随机向量逐维缩放 + 按自身质量归一”的具体实现。

3.6 速度与位置更新

项目采用

$$ \boldsymbol{v}_i^{(t+1)}=\boldsymbol{\rho}_i^{(t)}\odot \boldsymbol{v}_i^{(t)}+\boldsymbol{a}_i^{(t)} \tag{17} $$

其中 \(\boldsymbol{\rho}_i^{(t)}\sim U(0,1)^d\),随后更新位置:

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

每轮开始前都会做边界截断:

$$ x_{ij}^{(t)}\leftarrow \min\!\big(\max(x_{ij}^{(t)},l_j),u_j\big) \tag{19} $$

3.7 收敛记录

若当前代全局最优值为

$$ g^{(t)}=\min_{1\le i\le N}f(\boldsymbol{x}_i^{(t)}) \tag{20} $$

则项目将 \(\{g^{(t)}\}_{t=1}^{T}\) 记录为收敛曲线。

4. 算法流程

结合 core/gsa.pyui/upload_widget.py,本项目的 GSA 求解流程为:

  1. 选择内置测试函数或上传数据代理优化模式。
  2. 初始化位置与零速度。
  3. 计算当前代适应度、最优值、最差值和归一化质量。
  4. 按式(13)更新引力常数,并确定 Kbest 集合。
  5. 按式(16)累计各个体所受引力并计算加速度。
  6. 按式(17)至式(18)更新速度与位置。
  7. 记录收敛曲线,并输出最佳解与代理优化信息。

5. 关键参数说明

  • pop_size:搜索体数量 \(N\)。
  • max_iter:最大迭代次数 \(T\)。
  • G0:初始引力常数。
  • alpha:引力常数衰减系数,对应式(13)。
  • random_state:随机种子。

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

本项目当前主要以单次运行结果为主。若最终最优解为 \(\boldsymbol{x}^*\),则

$$ f^*=f(\boldsymbol{x}^*) \tag{21} $$

实际导出由 ui/results_widget.py 在结果页触发,主要工作表包括:

  • 运行汇总:最优值、问题模式、运行时间等摘要;
  • 参数:算法参数与问题配置;
  • 收敛曲线:逐轮最优值曲线;
  • 最优解:最终最优解向量;
  • 图表清单:图表路径索引。

上传代理模式下还会追加 BoundsUploadedDataSurrogateMetrics,用于记录边界明细、样本预览和随机森林训练指标。

论文结果部分建议按“运行汇总 报告最优值与运行信息、收敛曲线 描述搜索过程、最优解 列出最终位置向量”的顺序组织,其中 最优解 只对应决策变量,最优目标值应以 运行汇总 为准。若为上传代理模式,还应同步呈现 SurrogateMetrics

7. 论文写作模板

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

“本文采用引力搜索算法对连续变量单目标问题进行求解。算法将每个候选解视作具有质量的粒子,并根据适应度水平计算归一化质量;质量较大的个体对其他个体施加更强的引力作用。本文实现中,引力常数采用指数衰减方式更新,并仅保留当前最优的 Kbest 个体参与引力计算,以兼顾全局探索和后期收敛效率。粒子的速度由上一代速度与引力加速度共同决定,位置则通过速度积分更新。对于数据驱动问题,则先训练随机森林代理模型,再在样本边界内执行 GSA 搜索。”

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

  • 本实现适用于连续变量单目标优化。
  • 代码中的引力项按自身质量 \(M_i\) 做归一,会影响与教科书简化公式的形式差异。
  • Kbest 数量随迭代线性减少,是后期加速收敛的重要机制。
  • 上传代理优化仍由 UI 层驱动,本质上是“代理模型 + GSA 核心”的组合实现。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 运行汇总 表可写为:表X GSA 最优适应度与问题维度汇总。
  • 收敛曲线 表可写为:表X GSA 各迭代最优适应度变化。
  • 最优解 表可写为:表X GSA 求得的最优解向量。
  • convergence.png 建议写为:图X 引力搜索算法收敛曲线。

9.2 终审说明

  • 当前文档已经有较完整结果写作模板,但正式落稿时应把“稳定性统计”表述限定在确实存在多次运行结果的实验中。
  • 若使用上传代理模式,正文中应同步说明 SurrogateMetrics 的存在,避免最优值解释与代理误差脱节。

9.3 全量强化补充

本次全量强化绑定的真实上传验证目录为 具体的算法3/优化与多目标/GSA-引力搜索/results/manual_upload_verify_20260328。主结果文件为 GSA-引力搜索分析结果_20260328_194555.xlsx,实际工作表为 运行汇总参数收敛曲线最优解图表清单BoundsUploadedDataSurrogateMetrics

当前真实图文件为 charts/convergence.png,同目录还存在 charts/convergence_repro.pngmanual_upload_verify_20260328_repro.xlsx 作为复现再生产物。论文正文若只陈述主实验,应固定引用主结果文件和 charts/convergence.png

复现脚本为 repro_gsa.py,输入口径为 INPUT_FILE = Path('repro_inputs/gsa_sample.xlsx'),结果摘要中明确把目标名写成 UploadSurrogate::f_sphere。因此这篇文档应明确写成“上传代理 GSA 复现”,并把 SurrogateMetrics 作为解释最优值可信度的必要证据。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/GSA-引力搜索。软件实现支持优化模式和上传数据代理优化模式;上传模式通过数值表训练代理模型后执行引力搜索。文档中关于质量、引力常数、加速度和速度位置更新的公式可以保留,但输出说明应以 GSA_ParamsRun_SummaryHistory_MeanHistory_AllBest_Solution 为准。

当前较新的代表性目录为 results/GSA-引力搜索分析结果_20260517_133942-优化模式results/GSA-引力搜索分析结果_20260517_133958-上传数据代理优化。主工作簿 GSA_results_*.xlsx 在优化模式下包含 字段说明SummaryProblemGSA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。这比旧文中 运行汇总/参数/收敛曲线 的历史中文表结构更统一,用户说明应优先按当前表名写。

当前图表通常直接位于结果目录下,例如 GSA_convergence_时间戳.pngGSA_preview_时间戳.png,复现输出也会生成新的 GSA_convergence_*.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/gsa_sample.xlsx,复现结果进入 repro_outputs/。如果 exe 打开无反应,应先用当前源码重新打包并查看运行日志;文档层面的结果口径以这些新版导出为准。