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采用getopt解析命令行输入参数实例
Sep 30 Python
介绍Python的@property装饰器的用法
Apr 28 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
Unicode和Python的中文处理
Mar 19 Python
Python+selenium实现截图图片并保存截取的图片
Jan 05 Python
python write无法写入文件的解决方法
Jan 23 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
Python遍历字典方式就实例详解
Dec 28 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
关于Python解包知识点总结
May 05 Python
Django静态文件加载失败解决方案
Aug 26 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获取发送给用户的header信息的方法
2015/03/16 PHP
简单了解PHP编程中数组的指针的使用
2015/11/30 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
[转]JS宝典学习笔记
2007/02/07 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
简单的js表单验证函数
2013/10/28 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
jQuery实现图片切换效果
2020/10/19 jQuery
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
Python根据区号生成手机号码的方法
2015/07/08 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
python线程中的同步问题及解决方法
2019/08/29 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
护士试用期自我鉴定
2014/02/08 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
微信小程序调用python模型
2022/04/21 Python
python通过新建环境安装tfx的问题
2022/05/20 Python
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技