粒子群优化Python实现

  • 一、PSO算法概念
  • 二、PSO算法流程
  • 三、Python代码实现
  • 四、优缺点以应用
  • 1、PSO算法的一些优点:
  • 2、PSO算法的不足之处:
  • 3、PSO算法的产业应用


一、PSO算法概念

  西元1995年由肯尼迪(Kennedy)与埃伯哈特(Eberhart)(1995)两位学者所提出,这两位学者借由观察鸟类族群觅食的讯息传递所得到的一个启发,粒子群算法的理论基础是以单一粒子来做为鸟类族群之中的单一个体,将种群中的个体看成是D维搜索空间中没有质量和体积的粒子,每个粒子以一定的速度在解空间运动,并向粒子本身历史最佳位置和种群历史最佳位置靠拢,以实现对候选解的进化。
  于算法中赋予该粒子(个体)拥有记忆性,并能够透过与粒子群体中的其他粒子之间的互动而寻求到最适解。因此在粒子群算法的基础理论可以理解,任一个体(粒子)皆可用有自身移动过程中所产生的记忆与经验,当个体移动的同时,能依造自身的经验与记忆来学习调整自身的移动方向,由于在粒子群算法中,多个粒子是同时移动的,且同时以自身经验与其他粒子所提供的经验进行比对找寻最适当的解,并使自己处于最适解中,该粒子群算法的特性使得粒子不单单受自身演化的影响,同时会对群体间的演化拥有学习性、记忆性,并使粒子本身达到最佳调整。

二、PSO算法流程

  • Step1:初始化粒子群,包括群体规模(初始种群),每个粒子的位置和速度,设置惯性权重(非最优点,但下一步最优的概率),最大速度,加速度常速,最大迭代次数等初始值;
  • Step2:设计适应度函数(目标函数),并计算每个粒子的适应度;
  • Step3:对每个粒子,用它的适应度p与该粒子历史适应度pbest比较,如果前者大于后者,更新pbest;
  • Step4:对每个粒子的pbest,用它的最大值与种群历史最佳gbest比较,若前者大于后者,则更新gbest;
  • Step5:根据定义(1)(2)对粒子i第d维速度和位置进行更新: Python实现PSO粒子群优化循环神经网络LSTM回归模型 粒子群优化随机森林python_算法Python实现PSO粒子群优化循环神经网络LSTM回归模型 粒子群优化随机森林python_python_02

公式

物理意义

惯性部分,它表示维持粒子已有的速度趋势

认知部分,它表示粒子对历史经验的回忆,有向自身历史最佳位置靠近的趋势

社会部分,它表示粒子间相互协同合作与知识共享的群体历史经验,有向群体或区域最佳位置靠近的趋势

  • Step6:如果满足条件:
  • 达到最大迭代次数;
  • 最佳适应度增量小于设定阈值。则退出循环。

三、Python代码实现

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from mpl_toolkits.mplot3d import Axes3D
# 以下 font.family 设置仅适用于 Mac系统,其它系统请使用对应字体名称
# matplotlib.rcParams['font.family'] = 'Arial Unicode MS'

# 画图观察规律
fig = plt.figure(figsize=(10,7))
ax = Axes3D(fig)
ax.set_xlabel('$x$',fontsize=16)
ax.set_ylabel('$y$',fontsize=16)
ax.set_zlabel('$z$',fontsize=16)
x = np.linspace(-2,2,100)
y = np.linspace(-2,2,100)
# x-y 平面的网格
x, y = np.meshgrid(x, y)
z = x*np.exp(-x**2-y**2)
ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=plt.get_cmap('cool'))
plt.show()

# 初始化粒子群(包含20个粒子)
vmax = 1
# 设置惯性权重
w = 0.5
# 设置加速度常数
c1,c2 = 2,2
# 设置最大迭代次数
iters = 1000
# 设置最佳适应度值的增量阈值
alpha = 0.000001
# 在给定定义域内,随机生成位置矩阵如下
xMat = np.random.uniform(-2,2,(20,2))
# 在给定最大速度的限制下,随机生成速度矩阵如下
vMat = np.random.uniform(-vmax,vmax,(20,2))

# 计算种群中所有粒子的适应度
def get_adjust(location):
    x,y = location
    return -x*np.exp(-x**2-y**2)

adjusts = np.array([get_adjust(loc) for loc in xMat])

pbest = xMat, adjusts
gbest = xMat[np.argmax(adjusts)], np.max(adjusts)
gbest_add = None
# 更新pbest、gbest,同时更新所有粒子的位置与速度
for k in range(iters):
    # 更新pbest,遍历adjusts,如果对应粒子的适应度是历史中最高的,则完成替换
    index = np.where(adjusts > pbest[1])[0]
    if len(index) > 0:
        pbest[0][index] = xMat[index]
        pbest[1][index] = adjusts[index]

    # 更新gbest
    if np.sum(pbest[1] > gbest[1]) > 0:
        gbest_add = np.max(adjusts) - gbest[1]
        gbest = xMat[np.argmax(adjusts)], np.max(adjusts)

    # 更新所有粒子的位置与速度
    xMat_backup = xMat.copy()
    xMat = xMat + vMat
    vMat = w * vMat + c1 * np.random.uniform(0, 1) * (pbest[0] - xMat_backup) + c2 * np.random.uniform(0, 1) * (
                gbest[0] - xMat_backup)

    # 如果vMat有值超过了边界值,则设定为边界值
    xMat[xMat > 2] = 2
    xMat[xMat < (-2)] = -2
    vMat[vMat > vmax] = vmax
    vMat[vMat < (-vmax)] = -vmax

    # 计算更新后种群中所有粒子的适应度
    adjusts = np.array([get_adjust(loc) for loc in xMat])

    # 检查全局适应度的增量,如果小于 alpha,则算法停止
    if gbest_add is not None and gbest_add < alpha:
        print("k = ", k, " 算法收敛!")
        break

print(gbest)
# (array([-0.70669195,  0.00303178]), -0.42887785271504353)

  代码流程:

Python实现PSO粒子群优化循环神经网络LSTM回归模型 粒子群优化随机森林python_迭代_06

四、优缺点以应用

1、PSO算法的一些优点:

  1. 它是一类不确定算法。不确定性体现了自然界生物的生物机制,并且在求解某些特定问题方面优于确定性算法。
  2. 是一类概率型的全局优化算法。非确定算法的优点在于算法能有更多机会求解全局最优解。
  3. 不依赖于优化问题本身的严格数学性质。
  4. 是一种基于多个智能体的仿生优化算法。粒子群算法中的各个智能体之间通过相互协作来更好的适应环境,表现出与环境交互的能力.
  5. 具有本质并行性。包括内在并行性和内含并行性。
  6. 具有突出性。粒子群算法总目标的完成是在多个智能体个体行为的运动过程中突现出来的。
  7. 具有自组织和进化性以及记忆功能,所有粒子都保存优解的相关知识。
  8. 都具有稳健性。稳健性是指在不同条件和环境下算法的实用性和有效性,但是现在粒子群算法的数学理论基础还不够牢固,算法的收敛性还需要讨论。

2、PSO算法的不足之处:

  随着应用范围的扩大,PSO算法存在早熟收敛、维数灾难、易于陷入局部极值等问题需要解决,主要有以下几种发展方向:

  1. 调整PSO的参数来平衡算法的全局探测和局部开采能力。如Shi和Eberhart对PSO算法的速度项引入了惯性权重,并依据迭代进程及粒子飞行情况对惯性权重进行线性(或非线性)的动态调整,以平衡搜索的全局性和收敛速度。2009年张玮等在对标准粒子群算法位置期望及方差进行稳定性分析的基础上,研究了加速因子对位置期望及方差的影响,得出了一组较好的加速因子取值。
  2. 设计不同类型的拓扑结构,改变粒子学习模式,从而提高种群的多样性,Kennedy等人研究了不同的拓扑结构对SPSO性能的影响。针对SPSO存在易早熟收敛,寻优精度不高的缺点,于2003年提出了一种更为明晰的粒子群算法的形式:骨干粒子群算法(Bare Bones PSO,BBPSO)
  3. 将PSO和其他优化算法(或策略)相结合,形成混合PSO算法。如曾毅等将模式搜索算法嵌入到PSO算法中,实现了模式搜索算法的局部搜索能力与PSO算法的全局寻优能力的优势互补。
  4. 采用小生境技术。小生境是模拟生态平衡的一种仿生技术,适用于多峰函数和多目标函数的优化问题。例如,在PSO算法中,通过构造小生境拓扑,将种群分成若干个子种群,动态地形成相对独立的搜索空间,实现对多个极值区域的同步搜索,从而可以避免算法在求解多峰函数优化问题时出现早熟收敛现象。 Parsopoulos提出一种基于“分而治之”思想的多种群PSO算法,其核心思想是将高维的目标函数分解成多个低维函数,然后每个低维的子函数由一个子粒子群进行优化,该算法对高维问题的求解提供了一个较好的思路。

  不同的发展方向代表不同的应用领域,有的需要不断进行全局探测,有的需要提高寻优精度,有的需要全局搜索和局部搜索相互之间的平衡,还有的需要对高维问题进行求解。这些方向没有谁好谁坏的可比性,只有针对不同领域的不同问题求解时选择最合适的方法的区别。

3、PSO算法的产业应用

  1. 模式识别和图像处理。PSO算法已在图像分割、图像配准、图像融合、图像识别、图像压缩和图像合成等方面发挥作用。
  2. 神经网络训练。PSO算法可完成人工神经网络中的连接权值的训练、结构设计、学习规则调整、特征选择、连接权值的初始化和规则提取等。但是速度没有梯度下降优化的好,需要较大的计算资源。一般都算不动。
  3. 电力系统设计,例如:日本的Fuji电力公司的研究人员将电力企业某个著名的RPVC(Reactive Power and Voltage Control)问题简化为函数的最小值问题,并使用改进的PSO算法进行优化求解。
  4. 半导体器件综合,半导体器件综合是在给定的搜索空间内根据期望得到的器件特性来得到相应的设计参数
  5. 还有其他的一些相关产业。包括自动目标检测、生物信号识别、决策调度、系统识别以及游戏训练等方面也取得了一定的研究成果。