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开发windows GUI程序入门实例
Oct 23 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
Python解惑之整数比较详解
Apr 24 Python
python实现kNN算法
Dec 20 Python
基于tensorflow加载部分层的方法
Jul 26 Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 Python
简单了解python反射机制的一些知识
Jul 13 Python
简单了解python协程的相关知识
Aug 31 Python
wxPython实现列表增删改查功能
Nov 19 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
PO模式在selenium自动化测试框架的优势
Mar 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 图片加水印与上传图片加水印php类
2010/05/12 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
PHP多个文件上传到服务器实例
2014/10/29 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Python中的高级数据结构详解
2015/03/27 Python
Python语法快速入门指南
2015/10/12 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
Python实现代码块儿折叠
2020/04/15 Python
浅谈django 重载str 方法
2020/05/19 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
CSS3 边框效果
2019/11/04 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
一道Delphi面试题
2016/10/28 面试题
财务会计应届生求职信
2013/11/24 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
yy生日主持词
2014/03/20 职场文书
初二英语教学反思
2016/02/15 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL