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 初始化多维数组代码
Sep 06 Python
使用PDB模式调试Python程序介绍
Apr 05 Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
python线程定时器Timer实现原理解析
Nov 30 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
Django中ORM的基本使用教程
Dec 22 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 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 七大优势分析
2009/06/23 PHP
php生成QRcode实例
2014/09/22 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
(function($){...})(jQuery)的意思
2010/07/22 Javascript
js常用代码段收集
2011/10/28 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
js实现微信聊天效果
2020/08/09 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
python支持多线程的爬虫实例
2019/12/21 Python
python动态文本进度条的实例代码
2020/01/22 Python
Python短信轰炸的代码
2020/03/25 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
军训自我鉴定
2013/12/14 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
运动会1000米加油稿
2015/07/21 职场文书
老人院义工活动感想
2015/08/07 职场文书
社区干部培训心得体会
2016/01/06 职场文书
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers