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 26进制计算实现方法
May 28 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
Python优化技巧之利用ctypes提高执行速度
Sep 11 Python
python2.7安装图文教程
Mar 13 Python
python实现图书馆研习室自动预约功能
Apr 27 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
python看某个模块的版本方法
Oct 16 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
属性与 @property 方法让你的python更高效
Sep 21 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
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
理解Python中的With语句
2015/02/02 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
python中set常用操作汇总
2016/06/30 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Python构建网页爬虫原理分析
2017/12/19 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
原材料检验岗位职责
2014/03/15 职场文书
分家协议书
2014/04/21 职场文书
承诺书模板大全
2015/05/04 职场文书
运动会新闻报道稿
2015/07/22 职场文书
写给同事的离职感言
2015/08/04 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书