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语言的面相对象编程方式初步学习
Mar 12 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
Python自动生产表情包
Mar 17 Python
Python中enumerate函数代码解析
Oct 31 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
解决python爬虫中有中文的url问题
May 11 Python
Python GUI布局尺寸适配方法
Oct 11 Python
python使用suds调用webservice接口的方法
Jan 03 Python
解决python线程卡死的问题
Feb 18 Python
django重新生成数据库中的某张表方法
Aug 28 Python
Python列表list操作相关知识小结
Jan 29 Python
Numpy 多维数据数组的实现
Jun 18 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
做一个有下拉功能的留言版
2006/10/09 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
js静态方法与实例方法分析
2011/07/04 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
500行python代码实现飞机大战
2020/04/24 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
大学毕业生通用自荐信范文
2013/10/31 职场文书
十岁生日同学答谢词
2014/01/19 职场文书
公司晚会主持词
2019/04/17 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python