C++ 中的粒子群优化

2025 年 5 月 17 日 | 阅读 13 分钟

粒子群优化 (PSO) 是一种受鸟类或鱼类等自然生物的集体行为启发的优化技术。它由 James Kennedy 和 **Russell Eberhart** 于 **1995** 年推出。在 PSO 中,称为粒子的候选解决方案种群会遍历搜索空间以找到最优解决方案。每个粒子根据其自身经验和邻居的经验调整其位置。

这种调整由两个主要原则指导:对有希望区域的探索和对良好解决方案的利用。PSO 的特点是其简单性和在解决复杂优化问题方面的有效性。它不需要梯度计算,因此适用于梯度不易获得或计算成本过高的 G 题。它能够有效地探索大型搜索空间并快速收敛到最优或接近最优的解决方案,使其成为工程、金融和人工智能等各个领域的热门选择。

关键概念

PSO 对粒子群进行建模,每个粒子代表搜索空间中的一个潜在解决方案。这些粒子在空间中移动,根据它们自身的经验和邻居的经验来调整它们的位置。PSO 的主要组成部分包括:

**粒子:**每个粒子在搜索空间中都有一个位置和速度,分别代表候选解决方案和 G 运动方向。

**种群:**协同工作以探索搜索空间的粒子集合。

目标函数:需要优化的函数。每个粒子的适应度都根据此函数进行评估。

**个人最佳 (pBest):**粒子到目前为止取得的最佳位置。

**全局最佳 (gBest):**在 **种群** 中找到的任何粒子的最佳位置。

PSO 算法涉及以下步骤:

**初始化:随机初始化**搜索空间中所有粒子的位置和速度。

**评估:**使用目标函数计算每个粒子的适应度。

更新 pBest 和 gBest

如果当前位置优于其先前的最佳位置,则更新每个粒子的 pBest。

如果任何粒子的当前位置优于全局最佳位置,则更新 gBest。

更新速度和位置

根据每个粒子的当前速度、与 G 的距离以及与 G 的距离来调整其速度。

使用 **新速度** 更新每个粒子的位置。

**终止:**重复评估和更新步骤,直到达到停止标准,例如最大迭代次数或可接受的适应度水平。

方法 1:使用向量

此 PSO 实现是通用的,可以通过在目标函数方法中提供其定义来优化任何目标函数。此外,可以根据 **问题要求** 调整粒子数量、维度和迭代次数等参数。

此代码演示了 C++ 中 PSO 算法的基本实现,可以对其进行扩展和定制以适应各种 **优化问题**。PSO 算法的简单性和有效性使其成为解决各种领域中复杂优化任务的热门选择。

程序

输出

Iteration 0: Global Best Fitness = 0.0029762
Iteration 1: Global Best Fitness = 0.0029762
Iteration 2: Global Best Fitness = 0.000553463
Iteration 3: Global Best Fitness = 0.000553463
Iteration 4: Global Best Fitness = 0.000198333
Iteration 5: Global Best Fitness = 0.000198333
Iteration 6: Global Best Fitness = 0.000187206
Iteration 7: Global Best Fitness = 0.00016765
Iteration 8: Global Best Fitness = 3.14658e-05
Iteration 9: Global Best Fitness = 2.99408e-05

说明

**粒子类:**粒子类代表种群中的单个粒子。每个粒子都有诸如 **位置、速度**、个人最佳位置、适应度和最佳适应度等属性。这些属性存储为向量,以适应 **多维** 问题。

**种群类:**种群类管理粒子集合。它包含一个粒子向量,并跟踪种群找到的全局最佳位置和适应度。通过比较每个粒子的适应度值与全局最佳适应度来更新全局最佳位置和适应度。

**目标函数:**目标函数根据粒子的位置计算 G 的适应度值。在此示例中,使用了简单的目标函数——球函数,该函数计算粒子位置每个维度的平方和。

**初始化:**种群类的 **初始化方法** 随机初始化所有粒子的位置和速度。此步骤对于探索搜索空间至关重要。

**更新速度和位置:**update_velocity 和 update_position 方法根据 PSO 规则更新每个粒子的速度和位置。这些规则包括 G 和 G 因素,它们决定了粒子如何向全局最佳位置和 G 最佳位置移动。

**PSO 算法:** **PSO 函数** 作为 G 过程的主要驱动程序。它通过创建具有随机位置和速度的粒子种群来初始化 G。之后,它根据目标函数评估每个粒子的 G。该函数更新每个粒子的 G 位置和适应度,以及 G 找到的 G 位置和适应度。这些更新会针对指定的迭代次数进行迭代执行,使 G 能够有效地探索和利用搜索空间。

**主函数:**主函数作为 G 的入口点。它播 G 发生器以确保结果的可重现性,并使用指定 G、G 和 G 的参数调用 G 函数。通过在每次迭代中监控打印的 G 最佳适应度值,用户可以跟踪 G 进度并评估 PSO 算法在寻找 G 或接近 G 解决方案方面的 G。

复杂度分析

分析提供的粒子群优化 (PSO) 算法的时间和空间复杂度,需要了解算法每个阶段 **执行的操作** 以及使用的数据结构。

时间复杂度

**初始化:**使用随机位置和速度初始化 G 的时间复杂度为 **O(N * D)**,其中 N 是 G 的数量,D 是 G 的数量。这是因为需要初始化每个粒子 G 的位置和速度 G。

**适应度评估:**计算每个粒子的适应度涉及评估 G 函数,其时间复杂度为 **O(D)**,其中 D 是 G 的数量。由于此 G 对每个粒子执行,因此 G 评估的总 G 复杂度为 **O(N * D)**。

**全局最佳更新:**更新 G 最佳 G 涉及遍历 G 粒子以将其 G 值与 G 最佳 G 进行比较。此 G 的时间复杂度为 **O(N)**。

**速度和位置更新:**更新每个粒子的速度和位置涉及 G 向量上的简单 **算术运算**。由于这是对每个粒子执行的,因此 G 复杂度为 **O(N * D)**,其中 N 是 G 的数量,D 是 G 的数量。

**迭代:**PSO 算法运行指定的 G 次。因此,整个 PSO 算法的 G 复杂度为 **O(iterations * N * D)**,其中 G 是 G 的次数,N 是 G 的数量,D 是 G 的数量。

空间复杂度

**粒子数据结构:**每个粒子由包含 G、G 和 G 位置的 G 组成。存储一个 G 的 G 复杂度为 **O(3 * D)**,其中 D 是 G 的数量。

**种群数据结构:**种群由 G 组成,因此存储 G 的 G 复杂度为 **O(N * 3 * D)**,其中 N 是 G 的数量,D 是 G 的数量。

**全局最佳位置:**G 最佳 G 存储为 G,因此存储 G 的 G 复杂度为 **O(D)**,其中 D 是 G 的数量。

**附加空间:**该算法需要额外的 G 来存储计算过程中使用的 G,例如 G 计数器、 **临时变量** 和 G 生成。但是,与 G 数据结构相比,这些 G 所占用的 G 很少。

方法 2:使用链表

该实现演示了 G 数据结构在 **PSO 算法** 中管理 G 的 G 使用。链表提供 G 内存 G 和 G G,使其适用于在 G 过程中处理 G 的 G。

程序

输出

Initial state of the swarm:
Position: 0.134002 0.29139 | Fitness: 0.102865
Position: 0.963568 0.851058 | Fitness: 1.65276
Position: 0.717642 0.642082 | Fitness: 0.927279
Position: 0.885449 0.23609 | Fitness: 0.839758
Position: 0.838268 0.354988 | Fitness: 0.82871
Iteration 1:
Position: 0.134002 0.29139 | Fitness: 0.102865
Position: 0.963568 0.851058 | Fitness: 1.65276
Position: 0.717642 0.642082 | Fitness: 0.927279
Position: 0.885449 0.23609 | Fitness: 0.839758
Position: 0.838268 0.354988 | Fitness: 0.82871
Iteration 2:
Position: 0.134002 0.29139 | Fitness: 0.102865
Position: 0.963568 0.851058 | Fitness: 1.65276
Position: 0.717642 0.642082 | Fitness: 0.927279
Position: 0.885449 0.23609 | Fitness: 0.839758
Position: 0.838268 0.354988 | Fitness: 0.82871
Iteration 3:
Position: 0.134002 0.29139 | Fitness: 0.102865
Position: 0.963568 0.851058 | Fitness: 1.65276
Position: 0.717642 0.642082 | Fitness: 0.927279
Position: 0.885449 0.23609 | Fitness: 0.839758
Position: 0.838268 0.354988 | Fitness: 0.82871

说明

链表结构

该实现使用 G 来管理 G 中的 G。PSO 算法中的每个 G 都由链表中的一个 G 表示,这允许 G 地 G 和 G G。

粒子结构

G 是一个 G,包含 G、G、G 和 G 位置等 G。这些 G 代表 G 中每个 G 的 G。

目标函数

目标函数根据 G 的 G 计算 G 的 G。在提供的 G 中,使用了一个简单的 G 函数——球函数,该函数计算 G 的 G 的 G。

粒子初始化

PSO 算法通过初始化 **指定数量** 的 G,并 G 随机 G 和 G 来开始。每个 G 的 G 和 G G 随机 G,其 **适应度值** 通过 G 函数 G。

插入链表

在 G 每个 G 后,将其 G 到 G 的 G。此 G 过程 G 粒子 G 地 G 到 **种群**,同时 G 它们在 G 中的 G。

PSO 迭代

**PSO 算法迭代** 指定的 G 次。在每次迭代中,G 的 G 和 G 根据 PSO G 进行 G。此外,G 值和 G 位置根据 G 的 G 进行 G。

显示种群状态

在 PSO 算法的每次迭代中,通过 G 链表结构 G G 的 G 和 G,G G 的 G。这 G 了 G 过程的 G,并 G 了 G G 的 G。

内存管理

在 G 链表 G 时 G 链表 G 的 G 确保 G 的 G。这 G 了 G G 并确保 G G 的 G G。

主函数

主函数初始化 G 发生器,指定 G 算法的 G(G、G 和 G 迭代次数),并 G PSO 函数 G 优化 G。

复杂度分析

时间复杂度

粒子初始化

初始化每个 G 包括 G 随机 G 和 G,这需要 G 为每个 G,其中 D 是 G 的 G。由于此 G 对每个 G 重复,因此 G 复杂度为 **O(N * D)**,其中 N 是 G 的 G。

插入链表

将 G G 到 G 的 G 是一个 G G 的 G,因为它只需要 G G 指针。因此,将 N 个 G G 到 G 的 G 复杂度为 **O(N)**。

PSO 迭代

PSO 算法的每次 G 都涉及 G 所有 G 的 G 和 G,这需要 G 为每个 G,其中 D 是 G 的 G。此外,G G 值和 G 位置的 G 也需要 G 每个 G 的 G,其中 D 是 G 的 G。因此,每次 G 的 G 复杂度为 **O(N * D)**,其中 N 是 G 的 G,D 是 G 的 G。

PSO 算法运行指定的 G 次,因此 G G 复杂度为 **O(iterations * N * D)**,其中 G 是 G 的 G,N 是 G 的 G,D 是 G 的 G。

显示种群状态

在每次 G 中 G G 状态涉及 G 整个 G 并 G 每个 G 的 G 和 G。此 G 需要 G,其中 N 是 G 的 G。

空间复杂度

粒子结构

PSO 算法中的每个 G 都由 G 组成,该 G 包含 G、G 和其他 G 的 G。存储单个 G 的 G 复杂度为 **O(D)**,其中 D 是 G 的 G。

链表

存储 G 本身的 G 复杂度为 **O(N)**,其中 N 是 G 的 G。G 中的每个 G 都包含一个 G G,因此 G 的 G 复杂度与 G 中的 G G 成 G。

目标函数和辅助变量

PSO 算法中使用的辅助变量(如 G 计数器和 G 变量)的 G 复杂度与 G 数据结构相比微不足道。因此,对 G G 的 G 影响很小。