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使用xlrd模块操作Excel数据导入的方法
May 26 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
python读取ini配置文件过程示范
Dec 23 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
简单了解Python多态与属性运行原理
Jun 15 Python
通过实例解析python创建进程常用方法
Jun 19 Python
如何一键升级Python所有包
Nov 05 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 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
在php中取得image按钮传递的name值
2006/10/09 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
Javascript中replace()小结
2015/09/30 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
经济管理自荐书
2014/06/09 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
电工实训报告总结
2014/11/05 职场文书
小学工作总结2015
2015/05/04 职场文书
python turtle绘图命令及案例
2021/11/23 Python