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 03 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
Oct 16 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
Python下载网易云歌单歌曲的示例代码
Aug 12 Python
Python基础之数据类型知识汇总
May 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
分享PHP入门的学习方法
2007/01/02 PHP
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
分享PHP守护进程类
2015/12/30 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
[39:00]Optic vs VP 2018国际邀请赛淘汰赛BO3 第三场 8.24
2018/08/25 DOTA
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
python实现简单银行管理系统
2019/10/25 Python
python集合删除多种方法详解
2020/02/10 Python
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
水电工岗位职责
2014/02/12 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
个人党性锻炼总结
2015/03/05 职场文书
司机岗位职责范本
2015/04/10 职场文书
文明上网主题班会
2015/08/14 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
2019新员工心得体会
2019/06/25 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
Go语言空白表示符_的实例用法
2021/07/04 Golang