Python中的PSO算法

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

确实,有几种方法可以让你让一个函数发挥最佳作用,无论你是想让它尽可能小还是尽可能大。网上有各种优化技术,但没有一种是万能的解决方案。每种方法都有其优缺点。

我们将在这里探讨的一种方法是 PSO,即粒子群优化。这种方法属于受自然启发的一组优化技术。PSO 是一种算法,它以简单直接的方式在定义空间内寻找最佳解决方案。它就像一群粒子协同工作,在每个区域中找到最佳结果。这种方法提供了一种有效解决问题的令人兴奋的方式。

你有没有想过我们如何通过不断改进来改进事物?嗯,有一种巧妙的方法可以做到这一点,它被称为粒子群优化 (PSO)。它就像一个数字助手,致力于一个解决方案,使其尽可能达到最佳。这就像拥有一支微型数字粒子团队,协同工作以找到完美的答案。

粒子群优化 (PSO) 是计算机编程和问题解决中一个简单但非常有效的工具。它由 Eberhart 和 Kennedy 于 1995 年创建,灵感来自鸟群和鱼群的集体行为。我有时将 PSO 用于流体模拟 (CFD) 中物体的空气动力学形状改进等任务,但它也适用于机器学习项目。

现在,让我们谈谈 PSO 的作用。它就像一群数字鸟群在寻找问题的最佳解决方案。它不总是能找到绝对最佳的答案,但它非常擅长解决棘手的挑战,尤其是当它们涉及许多变量和复杂情况时。

在这个简短的介绍中,我将向你展示最基本的 PSO 形式。稍后,我将创建一个更高级的教程,深入探讨它的工作原理。

以下是构成基本 PSO 算法的两个主要方程。请注意,当你在方程中看到“k”时,它指的是当前步骤,而“k+1”表示下一步。

粒子在下一步的位置

Xik+1 = xik+1 + vik+1

简而言之,PSO 就像一群粒子(想象它们是鸟)协同工作,以找到问题的最佳解决方案。这些方程帮助这些粒子决定下一步去哪里,这个过程重复进行,直到它们尽可能接近最佳解决方案。这就像看着鸟儿一起努力寻找它们的出路,这在计算机科学和优化中非常酷。

粒子群优化 (PSO) 是一种用于解决各种优化问题的算法。它受到鸟类或鱼类群居行为的启发,其中个体根据其他个体的位置调整它们的运动以找到最佳路径。在 PSO 中,每个解决方案都由一个粒子表示,该粒子在解决方案空间中移动以找到最佳解决方案。

在 PSO 中,要考虑的关键因素是“困惑度”和“突发性”。让我们以更简单的方式分解这些概念

现在,让我们深入研究 PSO 方程及其组成部分

粒子速度

在 PSO 中,粒子根据以下方程更新其速度和位置

Vik+1 = wkvik + c1r1(pik-xik) + c2r2(pgk-xik)

变量定义

  1. Xik: 粒子位置
  2. Vik+1: 粒子 i 的更新速度。
  3. Pik: 最佳个体粒子位置
  4. Pgk: 最佳群位置
  5. Wk: 恒定惯性权重。
  6. c1, c2: 认知和社会参数。
  7. r1, r2: 0 到 1 之间的随机数。

现在,让我们简化方程以确定两个关键术语

  1. 社会项:社会项鼓励粒子朝着整个群体的最佳已知解决方案移动。它由 C2r2(pgk-xik) 表示
  2. 认知项:该项促使粒子朝着其最佳已知位置移动。它由 C1r1(pik-xik) 表示

这些项有助于引导粒子寻找最佳解决方案。

以下是 PSO 工作原理的简化流程

A) 初始化

  • 设置 kmax、wk、c1、c2 等常量
  • 随机初始化粒子位置和速度。
  • 将迭代计数器 (k) 设置为 1。

B) 优化

  • 在每个粒子位置评估成本函数。

Fik ,xik

  • 如果当前位置优于最佳个体位置,则更新最佳个人位置。

如果 fik<=fibest

则 fibest=fik

且 pik=xik

  • 如果当前位置优于最佳群位置,则更新最佳群位置。

如果 fik<=fgbest

则 fgbest=fik

且 pgk=xik

  • 检查是否满足停止条件;如果满足,则继续执行 C。
  • 更新粒子速度和位置。
  • 增加迭代计数器 (k) 并返回 B(1)。

C) 终止

就是这样!正如你从粒子速度方程中看到的那样,PSO 背后的主要思想是粒子不断在三种力之间平衡

  • 其当前速度的惯性
  • 对最佳个体解决方案的吸引力
  • 对整个群体的最佳解决方案的吸引力

这种动态过程有助于他们寻找当前问题的最佳解决方案。

Wk,c1,c2,r1,r2,pgk,pik

当我们谈论粒子群的行为时,我们会考虑一些基本因素。这些因素就像影响粒子运动的力。让我们分解它们

  • 惯性(先前速度):这就像粒子保持其当前方向移动的趋势。这就像开车,不想太突然地改变速度或方向。
  • 认知力(与个体最佳已知位置的距离):这种力将粒子拉向其最佳已知位置。想象一下试图找到你最喜欢的餐馆的路;你会被吸引回那个地方。
  • 社会力(与群体的最佳已知位置的距离):这种力就像群体的吸引力。如果你和一群朋友一起寻找餐馆,你会受到他们的选择和偏好的影响。

现在,这些力并非都相等。它们被赋予了不同的权重,这意味着有些力比其他力具有更大的影响力。这种加权由“w”、“c1”和“c2”表示。

此外,还涉及一些随机性。想象一下在不同方向上的轻微推或 nudges,由“r1”和“r2”表示。这些随机变化可以使粒子探索新的方法。

因此,根据我们赋予这些力的权重,整个群体(群)的最佳已知位置或粒子的个人最佳位置将对粒子的运动产生重大影响。它假设粒子的初始速度不会使其偏离太多。

有时,如果粒子需要很长时间才能达到共同目标(收敛),可能是因为我们过于重视粒子的初始速度(惯性)。在这种情况下,我们可以减少它以加快速度。但是,我们需要小心,因为过小的惯性可能会使粒子停留在局部最小值处,无法探索更好的解决方案。

在更技术性的表示中,这些力可以表示为具有不同大小的向量,表示每个力在方程中的重要程度。它帮助我们了解这些力如何协同作用以引导群中的粒子。

在我们刚刚讨论的例子中,我们正在谈论一群粒子如何协同工作以找到问题的最佳解决方案。这就像一群机器人试图在一个迷宫中导航。

什么是粒子群优化 (PSO)

在 20 世纪 90 年代,研究人员研究了动物在群体中的行为方式。他们发现,像鸟和鱼这样的动物可以在它们的群体中分享信息或相互交流。当它们需要躲避捕食者或智胜其他动物群体时,这会很有帮助。基于这个想法,Kennedy 和 Eberhart 在 1995 年提出了一种叫做 PSO 算法的东西。它是一种特殊的算法,用于解决棘手的问题。他们受到鸟类和鱼类等动物在群体和鱼群中协同工作以实现目标的启发。

研究表明,动物会分享信息,就像分享技巧或智慧一样。这有助于它们弄清楚新的情况,例如寻找食物或躲避捕食者。这就像一群鸟分享它们所看到的东西,这使得找到最佳解决方案变得更容易,这被称为群体智能。

粒子群优化内部工作原理

群集行为可分为两种主要类型。第一种类型是“探索行为”,即群体中的动物试图在一个具有许多可能解决方案的广阔区域中寻找某物。第二种类型是“利用行为”,其中群集智能在一个较小、更有前景的区域中寻找最佳解决方案。

粒子群优化 (PSO) 是一种常用于在探索和利用之间找到正确平衡的方法。这种平衡至关重要,因为它确保了群体有效地收敛到最佳解决方案。简单来说,PSO 帮助群体在广泛探索和深入挖掘最佳答案之间找到最佳平衡点。

粒子群优化收敛性

PSO(粒子群优化)过程侧重于一组粒子如何聚集在一起以找到最佳解决方案。将这些粒子想象成个体,试图在问题空间中找到通往局部“最佳”点的方法。

现在,这些个体或粒子受到其个人经验(其自身最佳已知位置,表示为 P)和群体集体知识(整个群体中最突出的部分,也称为 G)的引导。目标是让每个个体都达到特定问题的局部最佳点。

PSO 算法探索和利用问题空间的能力取决于这些粒子的连接或结构方式,我们称之为“拓扑结构”。拓扑结构可以被认为是这些个体交流和共享信息的方式。

存在不同的拓扑结构,例如局部环(粒子主要与其直接邻居交互)或全局星形(粒子与所有其他粒子交互)。拓扑结构的选择会影响算法的行为方式。它影响粒子如何搜索解决方案、共享信息、调整速度,甚至决定移动方向。

因此,简单来说,PSO 过程就是一群个体协同工作,每个个体都利用自己的经验和群体的集体知识来找到最佳解决方案。它们如何相互连接和交互(拓扑结构)在解决问题中起着重要作用。

简单来说,让我们谈谈系统中的粒子可以连接的两种方式。想象一群粒子。在一种设置中,所有粒子都像一张网一样连接起来,形成一个全局星形结构。

  1. 粒子群优化 (PSO):这是我们数字助手背后的宏大想法。把它想象成运行整个系统的引擎。
  2. 内部工作原理:我们将深入探讨 PSO 的工作原理,这样你就能了解幕后发生的一切。
  3. PSO 的变体或类型:就像不同工作有不同工具一样,PSO 也有各种版本。我们将研究其中一些。
  4. 使用 PySwarms 实现 PSO:这是实践部分。我们将向你展示如何使用 PySwarms 将 PSO 付诸实践,这样你就可以开始将它用于你的项目。

在另一种设置中,每个粒子仅与其两个最近的邻居连接,从而创建一个局部环形结构。

自适应机制

你可以在自适应系统中设置它,以在关注一种解决方案和探索不同可能性之间找到正确的平衡。把它想象成微调策略,使其既高效又对新想法开放。

现在,考虑自适应粒子群优化 (APSO)。它是常规粒子群优化 (PSO) 的更高级版本。很酷的是,APSO 往往更好。它收敛到解决方案的速度更快,并且可以探索整个解决方案空间,使其非常适合全局搜索最佳答案。

粒子群优化的变体

有各种 PSO(粒子群优化)算法,其中一些可能非常简单。在这些算法中,粒子及其速度可以以不同的方式启动。该过程涉及更新整个群集并为 Pi 和 G 分配值,以及其他因素。

梯度粒子群优化

想象一下我们正在使用一种称为 PSO(粒子群优化)的方法,它擅长在问题中找到不同的局部最小值。现在,如果我们将它与另一种涉及遵循景观斜率(梯度)的技术配对,它有助于我们精确定位特定区域的最低点。PSO 和基于梯度的方法的这种组合很实用,因为 PSO 擅长探索各种可能性,而基于梯度的方法为我们提供了精确找到最低点的精度。本质上,这就像拥有一种擅长侦察潜在解决方案的工具,然后使用另一种工具精确确定最佳解决方案。

混合粒子群优化

研究人员正在探索和使用更新、更先进的粒子群优化 (PSO) 变体,以使优化过程更有效。一种有趣的方法是使用混合 PSO,它将传统的 PSO 与另一种优化技术相结合。一个例子是结合基于生物地理学的优化并集成智能学习机制。这种组合增强了现有的 PSO,使其在解决优化问题时更鲁棒和高效。这是一个旨在改进优化技术的持续研究领域。

使用 PySwarms 实现粒子群优化

介绍 PySwarms,一个专为群优化设计的基于 Python 的工具。无论你是研究人员、实践者还是学生,这个工具都提供了一种用户友好的方式,通过高级接口应用粒子群优化 (PSO) 算法。PySwarms 是将群优化与基本优化方法无缝集成的理想工具。

通过 PySwarms,你可以实现各种多粒子群优化技术,使其在不同项目中具有高度的适应性和用户友好性。该工具的支持模块进一步增强了解决优化问题的有效性。

现在,让我们探讨如何使用 PySwarm 的函数式 API(称为“pyswarms. Single.GBestPSO”)使用全局最优优化器。我们将以 2D 和 3D 格式可视化结果,从而全面了解优化过程。

要开始,你可以使用以下命令轻松安装 PySwarms

让我们首先引入一些模块

所以,一旦你引入了所有必要的元素,让我们专注于改进我们的球体函数。PSO 粒子群优化很实用。你可以从优化器中任何你喜欢的设置开始。这里有三个主要步骤

调整设置:将超参数想象成我们组的设置。将它们设置为字典——一个带有每个位置标签的列表。

创建优化器:现在,使用该字典创建优化器。这就像为我们的组提供它变得更好所需的指令。

保存最佳结果:“optimize()”函数帮助我们找到最佳结果。此函数将最佳成本和位置保存在变量中。这就像记下最佳分数和它发生的位置一样。

可视化函数

PySwarm 拥有各种工具,旨在方便地查看群中发生的情况。将这些工具想象成观察和理解粒子群行为的方式。很酷的是,这些行为是使用 Matplotlib 可视化的,Matplotlib 是一种工具,可以让我们创建不仅高度可定制而且用户友好的图表。

让我们特别谈谈两种方法:“plot_contour()”和“plot_surface()”方法。这些魔咒在 2D 或 3D 空间中绘制粒子,以视觉方式表示发生的情况。但是,要可视化球体函数,我们必须将一个特定的函数(称为网格函数)散布到我们的群中。

想象一下这些工具可以绘制粒子活动的图片。我们有一个名为“Mesher”类的方便工具可以帮助我们做到这一点。它就像一支画家的画笔,让我们能够描绘出我们群体的行为。你猜怎么着?“pyswarms.utils.plotters.formatters”模块通过提供不同的格式来美化你的图表,让你随心所欲。

但等等,还有更多!就像造型师一样,我们还有一个用于视觉表示的“Designer”类。它让我们调整诸如图形大小、字体大小等。对于那些喜欢动画的人,还有一个动画师类,可以让你设置能量重复的次数以及每帧之间的延迟。因此,使用 PySwarm,你不仅可以了解群体的行为,还可以使用工具使其看起来很棒。

因此,准备好探索粒子群优化的世界,并学习如何一步步改进你的解决方案。

  1. 第一个例子:想象一下这些机器人对如何探索迷宫有不同的想法。在这种情况下,它们更关心自己的个人偏好,而不是群体想法。因此,它们四处分散探索,而不是聚集在一起。它们就像一群独立的冒险家。
  2. 第二个例子:现在,想象一个不同的场景,其中群体的意见影响着这些机器人。它们希望保持紧密联系并遵循相同的路径。这意味着它们更有可能快速找到出口,但它们可能会错过迷宫中一些隐藏的宝藏,因为它们没有到处探索。

因此,在这些例子中,我们比较了机器人在试图穿越迷宫时,是更看重自己的想法还是更看重群体的想法。

当我们查看这两种设置中粒子之间的平均距离时,存在一个令人兴奋的差异。在全局星形结构中,每个人都与所有人相连,粒子之间的平均距离最短。但在局部环形结构中,粒子只与其两个最近的邻居连接,平均长度在整个粒子群中最高。

在图片中,你可以看到差异。左侧是全局星形结构;右侧是局部环形结构。每个组有 16 个粒子,因此它们之间的平均距离有所不同。它们的连接方式显着影响它们平均彼此之间有多近或多远。

Python 中 PSO 算法的优点

粒子群优化 (PSO) 就像一种超级智能算法,灵感来自鸟类和鱼类的社交方式。在 Python 或任何其他编程语言中使用它会带来巨大的好处。以下是为什么在 Python 中使用 PSO 是一个明智之举的原因

  1. 易于使用:PSO 就像你的友善邻居,随时准备提供帮助。在 Python 中使用它非常简单。主要思想是模仿群体中粒子的行为方式,我们可以用简单的方程来表示这种行为。
  2. 几乎无所不能:PSO 就像一个多任务专家。它可以处理许多优化问题,从调整参数到选择特征。这种灵活性使其在工程、金融和机器学习中非常有用。
  3. 快速完成任务:PSO 就像高维空间中的高速超级英雄。它能快速找到解决方案,尤其是在棘手的环境中。因此,如果你正在处理一个复杂的问题,PSO 会支持你。
  4. 与伙伴合作良好:PSO 就像一个团队合作者。它可以与其他进程协同工作,例如在多台计算机核心上或跨网络。这种团队合作意味着它可以更快、更有效地解决大问题。
  5. 不需要花哨的信息:PSO 要求不高。它不需要花哨的梯度信息,而其他一些算法依赖于这些信息。这使得它非常适合于计算梯度具有挑战性或成本高昂的问题。
  6. 找到全貌:PSO 就像一个广阔景观中的探索者。它擅长四处寻找最佳解决方案。这对于存在许多散布的合理解决方案的问题来说非常棒。
  7. 像专业人士一样适应:PSO 就像一只变色龙。它可以处理随时间变化的问题,随着情况的变化适应新的最佳解决方案。PSO 很有用。
  8. 保持简单:PSO 就像行动中的极简主义。它没有许多复杂的设置,这使得它比其他优化方法更容易使用和设置。
  9. 说一种清晰的语言:PSO 就像一个解释事情清楚的朋友。粒子位置和速度等参数是有意义的,并且易于理解。这使得它对使用该算法的人更友好。
  10. 周围有很多帮助:PSO 就像一位拥有庞大粉丝群的名人。因为它如此受欢迎,Python 中有许多资源、库和现成的版本可供使用。像 pyswarm 和 deep 这样的工具随时可以让你更轻松。

但是,虽然 PSO 很棒,但它并不是一个万能的解决方案。它的表现如何取决于问题以及你如何设置。因此,尝试不同的设置是一个好主意,以便为你的特定任务找到最佳点。

Python 中 PSO 算法的缺点

粒子群优化 (PSO) 是一种广泛用于近似解决优化和搜索问题的算法。虽然它有其优点,但也有缺点,主要是在 Python 或任何编程语言中应用时。让我们深入探讨 PSO 算法的一些潜在问题

  1. 陷入局部最优:PSO 可能会找到一个比全局最优更好的局部解决方案,尤其是在处理复杂地形或高维空间时。
  2. 参数敏感性:PSO 的性能对其参数(如惯性权重以及认知和社会参数)非常敏感。找到正确的值很棘手;选择不当可能会导致收敛不佳。
  3. 难以处理离散空间:PSO 最初是为连续问题设计的,在应用于离散或组合问题(如具有二进制变量的问题)时面临挑战。它可能无法有效地探索潜在解决方案。
  4. 过早停止:存在过早收敛的风险,即算法过早停止探索搜索空间并满足于次优解决方案。
  5. 记忆丧失:PSO 本身不记忆过去的解决方案,这限制了它从先前尝试中学习的能力。这会阻碍它适应不断变化的环境或动态优化问题。
  6. 约束处理复杂性:使用 PSO 处理约束可能具有挑战性。如果解决方案违反特定规则,你必须引入额外的措施或惩罚函数,从而使算法更加复杂。
  7. 计算成本:PSO 可能会带来高昂的计算成本,需要大量的函数评估,特别是对于具有资源密集型目标函数的问题。
  8. 动态环境中的挑战:将 PSO 适应于最佳解决方案随时间变化的问题可能很棘手。该算法可能难以快速适应适应度景观的变化。
  9. 对起始条件的依赖:PSO 的性能可能受粒子初始位置和初始速度的影响。糟糕的起始条件可能导致收敛速度变慢或结果次优。
  10. 缺乏鲁棒性:PSO 可能不如其他一些优化算法鲁棒,其有效性可能因问题的性质而异。

重要的是要了解 PSO 的成功取决于你正在解决的具体问题。通过仔细的参数调整、针对特定问题的调整或将 PSO 与其他优化技术相结合,可以缓解这些缺点。

结论

总而言之,在 Python 中使用粒子群优化 (PSO) 算法是解决优化问题的一种有效且鲁棒的方法。通过尝试设置和尝试不同的方法,我们发现该算法非常擅长探索各种可能性并快速确定最佳解决方案。它可以处理各种问题复杂度和大小,使其适用于许多优化任务。根据特定指标进行测试表明,它可以快速找到解决方案,即使问题变得更大,也能很好地工作。当然,像任何优化工具一样,它也有其挑战,特别是处理局部最优,这就像这些算法中的常见障碍。我们必须思考如何帮助它更好地摆脱这些困境。展望未来,我们可以探索自动设置其参数的方法,以及使其运行更快并处理更大挑战的方法。总的来说,Python 中的 PSO 算法似乎是一个有前途的工具,可以帮助解决许多不同领域的实际问题。随着我们不断研究和改进它,它可能会变得更有价值和更有效地解决棘手的优化问题。