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简单判断序列是否为空的方法
Jun 30 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
Python数据拟合与广义线性回归算法学习
Dec 22 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
深入了解Python iter() 方法的用法
Jul 11 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
Python 实现敏感目录扫描的示例代码
May 21 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
js 操作select与option(示例讲解)
2013/12/20 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
详解vuex的简单使用
2018/03/12 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
python版百度语音识别功能
2019/07/09 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
判断单链表中是否存在环
2012/07/16 面试题
2015年校本培训工作总结
2015/07/24 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
Docker下安装Oracle19c
2022/04/13 Servers