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入门教程之Python的安装下载配置

    Python入门教程之Python的安装下载配置

    这篇文章主要介绍了Python入门教程之Python的安装下载配置,Python是一门非常强大好用的语言,也有着易上手的特性,本文为入门教程,需要的朋友可以参考下
    2023-04-04
  • Python正则表达中re模块的使用

    Python正则表达中re模块的使用

    这篇文章主要介绍了Python正则表达中re模块的使用,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • python套接字流重定向实例汇总

    python套接字流重定向实例汇总

    套接字是一种具有之前所说的“通信端点”概念的计算网络数据结构。相当于电话插口,没它无法通信,这个比喻非常形象。今天我们就来汇总一下套接字流重定向的实例
    2016-03-03
  • python for和else语句趣谈

    python for和else语句趣谈

    这篇文章主要介绍了python for和else语句趣谈,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • wxpython学习笔记(推荐查看)

    wxpython学习笔记(推荐查看)

    wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的程序
    2014-06-06
  • Python同时迭代多个序列的方法

    Python同时迭代多个序列的方法

    这篇文章主要介绍了Python同时迭代多个序列的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • python写日志封装类实例

    python写日志封装类实例

    这篇文章主要介绍了python写日志封装类,实例分析了Python操作日志的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 使用Python和Prometheus跟踪天气的使用方法

    使用Python和Prometheus跟踪天气的使用方法

    这篇文章主要介绍了使用Python和Prometheus跟踪天气的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 用pycharm开发django项目示例代码

    用pycharm开发django项目示例代码

    这篇文章主要介绍了用pycharm开发django项目示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python实现视频下载功能

    Python实现视频下载功能

    最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容。如果有一个程序可以把各大视频网站的热门用户最新发布的视频下载下来,不仅方便了观看,还可以将没有版权的视频发布在个人社交网站上,增加自己的人气,多好呀
    2017-03-03

最新评论