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通过定义一个类实例作为ftp回调方法
May 04 Python
Python实现快速多线程ping的方法
Jul 15 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
Python定时器实例代码
Nov 01 Python
python环形单链表的约瑟夫问题详解
Sep 27 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
在Python中获取操作系统的进程信息
Aug 27 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
pytorch Dropout过拟合的操作
May 27 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实现的CSS更新类实例
2014/09/22 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
PHP检测用户语言的方法
2015/06/15 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
javascript五图轮播切换实用版
2012/08/17 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
python字符串的index和find的区别详解
2020/06/20 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
大四学年自我鉴定
2013/11/13 职场文书
网络编辑职责
2014/03/01 职场文书
公共场所禁烟标语
2014/06/25 职场文书
作风建设剖析材料
2014/10/06 职场文书
学习十八大标语
2014/10/09 职场文书
出国留学导师推荐信
2015/03/26 职场文书
民事调解书范文
2015/05/20 职场文书
银行工作心得体会范文
2016/01/23 职场文书
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
Nginx安装配置详解
2022/06/25 Servers