Python实现粒子群算法详解

 更新时间:2023年07月27日 10:31:01   作者:微小冷  
这篇文章主要介绍了Python实现粒子群算法详解,粒子群算法,缩写为PSO(Particle Swarm Optimization),是一种非线性寻优算法,其特点是实现简单、收敛速度快,对多元函数的局部最优有较好的克服能力,需要的朋友可以参考下

算法原理

粒子群算法,缩写为PSO(Particle Swarm Optimization),是一种非线性寻优算法,其特点是实现简单、收敛速度快,对多元函数的局部最优有较好的克服能力。

Python实现

首先,需要创建一个类或者字典来表示粒子,这里用类来实现

import numpy as np
uniRand = np.random.uniform
class Particle:
    def __init__(self, N, xRange, vRange):
        # 生成(N)维参数
        self.x = uniRand(*xRange, (N,))
        self.v = uniRand(*vRange, (N,))
        self.best = np.inf
        self.xBest = np.zeros((N,))

接下来实现粒子群,粒子群无非是多个粒子,所以要有一个存放粒子的列表。故其初始化函数如下,其中bestxBest分别存放全局最优解和全局最优参数。

from copy import deepcopy
rand = np.random.rand
class Swarm:
    # pNum 粒子个数,N粒子维度,即参数个数
    # wRange 最大最小权重
    def __init__(self, pNum, N, xRange, vRange, wRange, c):
        self.ps = [Particle(N, xRange, vRange) for _ in range(pNum)]
        self.bestPs = deepcopy(self.ps)
        self.best = np.inf  #全局最优值
        self.xBest = np.zeros((N,)) #全局最优参数
        self.wRange = wRange
        self.c0, self.c1 = c
        self.N = N

然后将参数更新的规则封入一个函数中,这里包括三个内容的更新,

首先是从当前计算结果中,挑选出最优结果,作为新的全局最优值;

然后针对单个粒子,更新粒子的历史最优值;

最后,也是最复杂的一步,即更新每个粒子的速度和位置。

在写好单步更新函数之后,将其写入循环中,就是粒子群算法的主干了,代码如下。

# 下面的函数写在class Swarm中
# 为了书写方便,这里顶个写,注意在Swarm中的缩进
    # 参数更新 func为待优化函数
def oneStep(self, func, w=1):
    for p in self.ps:
        y = func(p.x)
        # 更新历史最优值
        if y < p.best:
            p.best = y
            p.xBest = deepcopy(p.x)
        # 更新粒子群最优情况
        if y < self.best:
            self.best = y
            self.xBest = deepcopy(p.x)
            self.bestPs = deepcopy(self.ps)
    for p in self.ps:
        iw = uniRand(*self.wRange, 1)[0]
        us = self.c0 * rand(self.N) * (p.xBest - p.x)
        vs = self.c1 * rand(self.N) * (self.xBest - p.x)
        p.v = iw * p.v + us + vs
        p.x = p.x + p.v
    return self.best
# nMsg为输出提示的周期
# iter为迭代次数
def optimize(self, func, nMsg, iter):
    for i in range(iter):
        best = self.oneStep()
        if i % nMsg == 0:
            print(f"第{i}次迭代最小值为{best}")

得益于pyhton的函数式特性,可以方便地将函数作为参数传入,从而在优化函数optimize中,直接把被优化的函数func用作输入参数。

算法测试

最后,代码写好之后,可以测试一下,假设现有一个比较复杂的多元函数,其中 Xi为不同维度的参数,令 i = 1..10 i=1..10 i=1..10,即下面是一个10元函数。

测试代码写为

def test(xs):
    s = 0.0
    for i in range(len(xs)):
        s += np.cos(i*xs[i]/5)*(i+1)
    return s
if __name__ == "__main__":
    xRange = (-3,3)
    vRange = (-1,1)
    wRange = (0.5,1)
    C = (1.5, 1.5)
    s = Swarm(20, 10, xRange, vRange, wRange, C)
    s.optimize(test, 20, 200)
    print("最佳位置在:\n", s.xBest)

测试结果为

第1次迭代最小值为-29.665606552469008
第21次迭代最小值为-36.351923008184464
第41次迭代最小值为-47.14461157300818
第61次迭代最小值为-52.25291216470125
第81次迭代最小值为-52.964363058825406
第101次迭代最小值为-52.99124052250346
第121次迭代最小值为-52.99966161164592
第141次迭代最小值为-52.99990804268494
第161次迭代最小值为-52.99997494166753
第181次迭代最小值为-52.9999871143357
最佳位置在:
[ 28.01165182 -15.70858655   7.85375734   5.23563916  -3.92708994
  -3.14138732  -2.61760754   2.24427198   5.89048506  -1.74515961]

可见其收敛速度还是很快的。

到此这篇关于Python实现粒子群算法详解的文章就介绍到这了,更多相关Python粒子群算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何爬取实时变化的WebSocket数据的方法

    Python如何爬取实时变化的WebSocket数据的方法

    这篇文章主要介绍了Python如何爬取实时变化的WebSocket数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • python中的opencv 图像梯度

    python中的opencv 图像梯度

    这篇文章主要介绍了python中的opencv 图像梯度,图像梯度计算的是图像变化的速度,图像梯度计算需要求导数,但是图像梯度一般通过计算像素值的差来得到梯度的近似值,下文详细介绍需要的小伙伴可以参考一下
    2022-06-06
  • Python数据预处理常用的5个技巧

    Python数据预处理常用的5个技巧

    大家好,本篇文章主要讲的是Python数据预处理常用的5个技巧,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • numpy中loadtxt 的用法详解

    numpy中loadtxt 的用法详解

    这篇文章主要介绍了numpy中loadtxt 的用法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 推荐10款最受Python开发者欢迎的Python IDE

    推荐10款最受Python开发者欢迎的Python IDE

    这篇文章收集了一些对开发者非常有帮助的,最好的10款Python IDE,包括Vim,Eclipse with PyDev,Sublime Text,PyCharm等知明Python开发工具
    2018-09-09
  • Python的selenium模块使用find_element_by_id无效解决方案

    Python的selenium模块使用find_element_by_id无效解决方案

    这篇文章主要介绍了Python的selenium模块使用find_element_by_id无效解决方案,find_element_by_id无效可能是因为版本问题,而4.5.0版本不支持页面对象的定位find_element_by_id方法,以前版本支持这些进行元素定位,需要的朋友可以参考下
    2023-12-12
  • Python实现Linux下守护进程的编写方法

    Python实现Linux下守护进程的编写方法

    这篇文章主要介绍了Python实现Linux下守护进程的编写方法,比较实用的一个技巧,需要的朋友可以参考下
    2014-08-08
  • python调用Matplotlib绘制分布点并且添加标签

    python调用Matplotlib绘制分布点并且添加标签

    这篇文章主要为大家详细介绍了python调用Matplotlib绘制分布点并且添加标签的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 人工智能——K-Means聚类算法及Python实现

    人工智能——K-Means聚类算法及Python实现

    这篇文章主要介绍了人工智能——K-Means聚类算法及Python实现,一个能够找到我圈出的这 些点集的算法,就被称为聚类算法,下面就来看看文章具体的介绍吧
    2022-01-01
  • python 信息同时输出到控制台与文件的实例讲解

    python 信息同时输出到控制台与文件的实例讲解

    今天小编就为大家分享一篇python 信息同时输出到控制台与文件的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论