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正则抓取网易新闻的方法示例
Apr 21 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
python递归函数绘制分形树的方法
Jun 22 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
Python适配器模式代码实现解析
Aug 02 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
python生成requirements.txt的两种方法
Sep 18 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
在python中做正态性检验示例
Dec 09 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
python mock测试的示例
Oct 19 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
IStream与TStream之间的相互转换
2008/08/01 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
javascript jQuery插件练习
2008/12/24 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
详解vue组件开发脚手架
2018/06/15 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
python中列表元素连接方法join用法实例
2015/04/07 Python
Python向excel中写入数据的方法
2019/05/05 Python
如何定义TensorFlow输入节点
2020/01/23 Python
Python插件机制实现详解
2020/05/04 Python
django正续或者倒序查库实例
2020/05/19 Python
深入分析python 排序
2020/08/24 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
维德科技C#面试题笔试题
2015/12/09 面试题
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
聊城大学毕业生自荐书
2014/02/01 职场文书
师德师风演讲稿
2014/05/05 职场文书
文艺演出策划方案
2014/06/07 职场文书
招标授权委托书样本
2014/09/23 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python
MySQL 数据表操作
2022/05/04 MySQL