Python中的粒子群优化教程

362 阅读7分钟

有几种方法可以用来最大化或最小化一个函数以找到最佳值。尽管有几种优化方法可以使用,但没有一种方法被认为是对每个特定情况的理想选择。因此,每种优化方法都有自己的优势和局限性。粒子群优化(PSO)也是一种属于自然启发计算领域的优化技术。它是一种以直截了当的方式在空间中搜索最佳解决方案的算法。这是一种通过迭代地试图改善一个候选解决方案,并考虑到给定的质量衡量标准来优化问题的方法。在这篇文章中,我们将详细讨论粒子群优化,以及它的工作和不同的变体。我们还将学习使用Python包PySwarms来实现PSO的实践。在这篇文章中,我们将涵盖以下主要内容。

目录

  1. 粒子群优化(PSO)
  2. 内部工作
  3. PSO的变种
  4. 使用PySwarms实现PSO

让我们从了解粒子群优化(PSO)算法开始讨论。

粒子群优化(PSO)

在20世纪90年代初,对动物群体的社会行为进行了一些研究。这些调查显示,特定群体中的一些生物,即鸟类和鱼类,能够在它们之间传递知识,这种能力为这些动物提供了巨大的生存利益。受到这项研究的启发。 肯尼迪和埃伯哈特1995年提出了PSO算法,一种适合优化非线性连续函数的元启发式算法。该算法受到群居智能概念的启发,群居智能通常表现在动物群体中,如羊群和鱼群。

正如原始研究中所说,鱼或一群鸟在群体中移动时,"可能会从所有其他成员的经验中受益。" 换句话说,如果一只鸟随机飞来飞去寻找食物,鸟群中的所有鸟可以分享它们的发现,帮助整个鸟群获得最好的狩猎。虽然我们可以模仿鸟群的运动,但我们也可以认为每只鸟都在协助我们在高维解空间中寻找最优解,鸟群找到的最佳解就是空间中的最佳解。

PSO的内部工作

研究人员认为,蜂群行为在探索性行为(搜索搜索空间的较大部分)和寻求搜索空间的较小区域以接近(潜在的局部)最优的探索性行为之间有所不同。研究人员认为,自PSO诞生以来,PSO算法及其参数的设计必须在探索和开发之间取得适当的平衡,以避免早期收敛到局部最优,同时确保向最优收敛的良好速度。

收敛

在PSO收敛中,无论蜂群如何运作,当所有的个人利益P或者蜂群的最佳位置G接近问题的局部最优时,就会发生向局部最优的收敛。

PSO算法的探索和利用能力可能受到其拓扑结构的影响;也就是说,在不同的结构下,算法的收敛速度和在同一优化问题上避免过早收敛的能力会有所不同,因为拓扑结构决定了每个粒子的搜索信息共享速度或方向。最常见的两种拓扑结构是全局星和局部环。

具有全局星形结构的PSO,所有的粒子都是相连的,在蜂群中的平均距离最短;而具有局部环形结构的PSO,每个粒子都与附近的两个粒子相连,在蜂群中的平均距离最高。

图1(来源)

实验研究考察了两种常用的架构,全局星形结构(图1a)和局部环形结构(图1b)。每组有16个粒子。应该强调的是,局部结构中最近的粒子主要是由粒子指数决定的。

适应性机制

一个自适应机制可以在不需要在收敛("利用")和发散("探索")之间进行权衡的情况下实现。自适应粒子群优化(APSO)优于常规粒子群优化(PSO)。凭借更快的收敛时间,APSO可以在整个搜索空间执行全局搜索。

它允许实时修改惯性权重、加速系数和其他计算因素,从而提高搜索功效和效率。APSO还可以对最佳粒子进行全局操作,以跳出最可能的局部优化区。

PSO的变种

即使是一个简单的PSO算法也可以有很多不同的变化。有各种方法来初始化粒子和速度(例如,从零速度开始),只在整个蜂群被更新后才更新Pi和G,等等。

梯度PSO

为了构建基于梯度的PSO算法,可以将PSO算法有效探索许多局部最小值的能力与基于梯度的局部搜索算法有效计算出准确的局部最小值的能力相结合。

在基于梯度的PSO算法中,PSO算法被用来探索几个局部最小值,并发现深层局部最小值的吸引盆地中的一个位置。然后使用高效的基于梯度的局部搜索技术对深层局部最小值进行正确定位。

混合PSO

为了提高优化性能,新的和更先进的PSO变体正在被引入。该研究有一定的发展,如开发一种混合优化方法,将PSO与其他优化器相结合,如将PSO与基于生物地理学的优化相结合,并包括一个有效的学习机制。

使用PySpwarms实现粒子群优化

PySwarms是一个基于Python的粒子群优化工具。它被群集智能研究人员、从业人员和学生使用,他们希望使用声明性的高级界面来应用PSO解决他们的问题。PySwarms提供了与蜂群优化的互动,以及与PSO的基本优化。

PySwarms在高层次上实现了多粒子群优化技术。因此,它希望对用户友好并具有适应性。还可以采用支持模块来帮助你解决优化问题。

在本节中,我们将使用PySwarms的功能APIpyswarms.single.GBestPSO 实现全局最佳优化器。我们还将以2D和3D的方式绘制函数。

PySwarm可以通过pip install pyswarms 直接安装。

优化球体的功能
# Import PySwarms
import pyswarms as ps
from pyswarms.utils.functions import single_obj as fx

我们将致力于改进球体函数。现在让我们在我们的优化器中进行一些任意的设置。最起码,优化有三个步骤:

  • 将蜂群配置为一个字典,设置超参数。
  • 将字典与相关的输入一起传递给优化器,以创建一个优化器的实例。
  • 调用optimize() 方法,并告诉它将最佳成本和位置保存在一个变量中。
# Set-up hyperparameters
options = {'c1': 0.5, 'c2': 0.3, 'w':0.9}
# Call instance of PSO
optimizer = ps.single.GlobalBestPSO(n_particles=10, dimensions=2, options=options)
# Perform optimization
cost, pos = optimizer.optimize(fx.sphere, iters=1000)

这将使优化器运行1000次迭代,然后返回蜂群的最佳成本和位置:

函数的可视化

PySwarms包括用于可视化蜂群行为的工具。这些工具是在matplotlib的基础上构建的,形成了用户友好和高度可定制的图表。Plotters模块有两种动画方法:plot contour()plot surface() 。这些方法,顾名思义,在2-D或3-D空间绘制粒子。

为了绘制球体函数,我们应该向我们的蜂群添加网格。这使我们能够以图形方式看到粒子与我们的目标函数的关系。使用Mesher类,我们可以实现这一点:

import matplotlib.pyplot as plt
from pyswarms.utils.plotters import plot_contour, plot_surface
from pyswarms.utils.plotters.formatters import Designer
from pyswarms.utils.plotters.formatters import Mesher

pyswarms.utils.plotters.formatters 模块包含许多格式化器,用于定制你的绘图和可视化。除了Mesher,还有一个用于修改字体大小、图形大小等的Designer类,以及一个用于设置动画延迟和重复的Animator类。

二维平面图
m = Mesher(func=fx.sphere)
# Make animation
animation = plot_contour(pos_history=optimizer.pos_history,
                         mesher=m,
                         mark=(0,0)) # Mark minima
animation.save('mymovie.mp4')

三维平面图
# preprocessing
pos_history_3d = m.compute_history_3d(optimizer.pos_history)
# adjust the figure
d = Designer(limits=[(-1,1), (-1,1), (-0.1,1)], label=['x-axis', 'y-axis', 'z-axis'])
# Make animation
animation3d = plot_surface(pos_history=pos_history_3d, 
                           mesher=m, designer=d,       
                           mark=(0,0,0))  # Mark minima

最后的话

在这篇文章中,我们通过了解PSO的内部机制是如何工作的,看到了它背后的理论。此外,我们还看到了它的一些变体,但是PSO是如何被社区应用于不同领域的。最后,我们通过利用基于python的PySwarms库,对PSO进行了实践体验。

参考文献