python实现粒子群算法


Posted in Python onOctober 15, 2020

粒子群算法

粒子群算法源于复杂适应系统(Complex Adaptive System,CAS)。CAS理论于1994年正式提出,CAS中的成员称为主体。比如研究鸟群系统,每个鸟在这个系统中就称为主体。主体有适应性,它能够与环境及其他的主体进行交流,并且根据交流的过程“学习”或“积累经验”改变自身结构与行为。整个系统的演变或进化包括:新层次的产生(小鸟的出生);分化和多样性的出现(鸟群中的鸟分成许多小的群);新的主题的出现(鸟寻找食物过程中,不断发现新的食物)。

PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。
在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

python实现粒子群算法

python实现粒子群算法

i 表示第 i 个粒子, d 表示粒子的第 d 个维度。r1, r2 表示两个位于 [0, 1] 的随机数(对于一个粒子的不同维度,r1, r2 的值不同)。pbest[i] 是指粒子取得最高(低)适应度时的位置,gbest[i] 指的是整个系统取得最高(低)适应度时的位置。

实践

我们用 PSO 算法求解如下函数的最小值

python实现粒子群算法

可以在空间画出图像

python实现粒子群算法

下图是使用 5 个粒子的收敛情况

python实现粒子群算法

可以看到,fitness 在第 12 轮就几乎收敛到 -10.0。

下面是完整代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


INF = 1e5

def plot_cost_func():
  """画出适应度函数"""
  fig = plt.figure()
  ax = Axes3D(fig)
  X = np.arange(-4, 4, 0.25)
  Y = np.arange(-4, 4, 0.25)
  X, Y = np.meshgrid(X, Y)
  Z = (X**2 + Y**2) - 10
  ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
  plt.show()

def fitness(x):
  return x[0]**2 + x[1]**2 - 10

class PSOSolver(object):
  def __init__(self, n_iter, weight=0.5, c1=2, c2=2, n_particle=5):
    self.n_iter = n_iter
    self.weight = weight
    self.c1 = c1
    self.c2 = c2
    self.n_particle = n_particle
    self.gbest = np.random.rand(2)
    # gbest 对应的函数值
    self.gbest_fit = fitness(self.gbest)
    # 将位置初始化到 [-5, 5]
    self.location = 10 * np.random.rand(n_particle, 2) - 5
    # 将速度初始化到 [-1, 1]
    self.velocity = 2 * np.random.rand(n_particle, 2) - 1
    self.pbest_fit = np.tile(INF, n_particle)
    self.pbest = np.zeros((n_particle, 2))
    # 记录每一步的最优值
    self.best_fitness = []
  
  def new_velocity(self, i):
    r = np.random.rand(2, 2)
    v = self.velocity[i]
    x = self.location[i]
    pbest = self.pbest[i]
    return self.weight * v + self.c1 * r[0] * (pbest - x) + \
        self.c2 * r[1] * (self.gbest - x)

  def solve(self):
    for it in range(self.n_iter):
      for i in range(self.n_particle):
        v = self.new_velocity(i)
        x = self.location[i] + v
        fit_i = fitness(x)
        if fit_i < self.pbest_fit[i]:
          self.pbest_fit[i] = fit_i
          self.pbest[i] = x
          if fit_i < self.gbest_fit:
            self.gbest_fit = fit_i
            self.gbest = x
        self.velocity[i] = v
        self.location[i] = x
      self.best_fitness.append(self.gbest_fit)

  
if __name__ == '__main__':
  plot_cost_func()
  n_iter = 20
  s = PSOSolver(n_iter)
  s.solve()
  print(s.gbest_fit)
  plt.title("Fitness Curve")
  plt.xlabel("iter")
  plt.ylabel("fitness")
  plt.plot(np.arange(n_iter), np.array(s.best_fitness))
  plt.show()

以上就是python实现粒子群算法的详细内容,更多关于python 粒子群算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现的石头剪子布代码分享
Aug 22 Python
跟老齐学Python之for循环语句
Oct 02 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
分析Python编程时利用wxPython来支持多线程的方法
Apr 07 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
pytorch 多分类问题,计算百分比操作
Jul 09 Python
python 爬取吉首大学网站成绩单
Jun 02 Python
python 使用pandas读取csv文件的方法
Dec 24 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 #Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 #Python
python利用faker库批量生成测试数据
Oct 15 #Python
如何利用python检测图片是否包含二维码
Oct 15 #Python
用python实现一个简单计算器(完整DEMO)
Oct 14 #Python
python在linux环境下安装skimage的示例代码
Oct 14 #Python
python中如何使用虚拟环境
Oct 14 #Python
You might like
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
解析vue中的$mount
2017/12/21 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
Django中的文件的上传的几种方式
2018/07/23 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
使用Scrapy爬取动态数据
2018/10/21 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
python 项目目录结构设置
2020/02/14 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
工程师自我评价怎么写
2013/09/19 职场文书
餐饮主管岗位职责
2013/12/10 职场文书
求职信范文大全
2014/05/26 职场文书
签约仪式策划方案
2014/06/02 职场文书
出差报告怎么写
2014/11/06 职场文书
2014年村委会工作总结
2014/11/24 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
python开发制作好看的时钟效果
2022/05/02 Python