Python实现粒子群算法的示例


Posted in Python onFebruary 14, 2021

粒子群算法是一种基于鸟类觅食开发出来的优化算法,它是从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质。

Python实现粒子群算法的示例

PSO算法的搜索性能取决于其全局探索和局部细化的平衡,这在很大程度上依赖于算法的控制参数,包括粒子群初始化、惯性因子w、最大飞翔速度和加速常数与等。

PSO算法具有以下优点:

不依赖于问题信息,采用实数求解,算法通用性强。

需要调整的参数少,原理简单,容易实现,这是PSO算法的最大优点。

协同搜索,同时利用个体局部信息和群体全局信息指导搜索。

收敛速度快, 算法对计算机内存和CPU要求不高。

更容易飞越局部最优信息。对于目标函数仅能提供极少搜索最优值的信息,在其他算法无法辨别搜索方向的情况下,PSO算法的粒子具有飞越性的特点使其能够跨过搜索平面上信息严重不足的障碍,飞抵全局最优目标值。比如Generalized Rosenbrock函数全局最小值在原占附近.但是此函数全局最优值与可到达的局部最优值之间右一条独长的山路,曲面山谷中点的最速下降方向几乎与到函数最小值的最佳方向垂直,找到全局最小值的可能性微乎其微, 但是PSO算法完全有可能找到全局最优值。

同时, PSO算法的缺点也是显而易见的:

算法局部搜索能力较差,搜索精度不够高。

算法不能绝对保证搜索到全局最优解。

PSO算法设计的具体步骤如下:

  • 初始化粒子群(速度和位置)、惯性因子、加速常数、最大迭代次数、算法终止的最小允许误差。
  • 评价每个粒子的初始适应值。
  • 将初始适应值作为当前每个粒子的局部最优值,并将各适应值对应的位置作为每个粒子的局部最优值所在的位置。
  • 将最佳初始适应值作为当前全局最优值,并将最佳适应值对应的位置作为全局最优值所在的位置。
  • 依据公式更新每个粒子当前的飞翔速度。
  • 对每个粒子的飞翔速度进行限幅处理,使之不能超过设定的最大飞翔速度。
  • 依据公式更新每个粒子当前所在的位置。
  • 比较当前每个粒子的适应值是否比历史局部最优值好,如果好,则将当前粒子适应值作为粒子的局部最优值,其对应的位置作为每个粒子的局部最优值所在的位置。
  • 在当前群中找出全局最优值,并将当前全局最优值对应的位置作为粒子群的全局最优值所在的位置。
  • 重复步骤(5)~(9),直到满足设定的最小误差或最大迭代次数
  • 输出粒子群的全局最优值和其对应的位置以及每个粒子的局部最优值和其对应的位置。

本文中我们假设要求解一个维度为10的向量,这里的适应度函数采用简单的线性误差求和。

#基本粒子群算法
#vi+1 = w*vi+c1*r1*(pi-xi)+c2*r2*(pg-xi)  速度更新公式
#xi+1 = xi + a*vi+1  位置更新公式(一般a=1)
#w = wmax -(wmax-wmin)*iter/Iter 权重更新公式
#iter当前迭代次数 Iter最大迭代次数 c1、c2学习因子 r1、r2随机数 pi粒子当前最优位置 pg粒子群全局最优
#初始化 wmax=0.9 wmin=0.4 通常c1=c2=2 Iter对于小规模问题(10,20)对于大规模(100,200)
#算法优劣取决于w、c1和c2,迭代结束的条件是适应度函数的值符合具体问题的要求
#初始化粒子群,包括尺寸、速度和位置
#本算法假设想要的输出是长度为10的矩阵,y=[1.7]*10,适应度函数f(x)= |x-y| <=0.001符合要求

import numpy as np

swarmsize = 500
partlen = 10
wmax,wmin = 0.9,0.4
c1 = c2 = 2
Iter = 400

def getwgh(iter):
  w = wmax - (wmax-wmin)*iter/Iter
  return w

def getrange():
  randompv = (np.random.rand()-0.5)*2
  return randompv

def initswarm():
  vswarm,pswarm = np.zeros((swarmsize,partlen)),np.zeros((swarmsize,partlen))
  for i in range(swarmsize):
    for j in range(partlen):
      vswarm[i][j] = getrange()
      pswarm[i][j] = getrange()
  return vswarm,pswarm

def getfitness(pswarm):
  pbest = np.zeros(partlen)
  fitness = np.zeros(swarmsize)
  for i in range(partlen):
    pbest[i] = 1.7

  for i in range(swarmsize):
    yloss = pswarm[i] - pbest
    for j in range(partlen):
      fitness[i] += abs(yloss[j])
  return fitness

def getpgfit(fitness,pswarm):
  pgfitness = fitness.min()
  pg = pswarm[fitness.argmin()].copy()
  return pg,pgfitness

vswarm,pswarm = initswarm()
fitness = getfitness(pswarm)
pg,pgfit = getpgfit(fitness,pswarm)
pi,pifit = pswarm.copy(),fitness.copy()

for iter in range(Iter):
  if pgfit <= 0.001:
    break
  #更新速度和位置
  weight = getwgh(iter)
  for i in range(swarmsize):
    for j in range(partlen):
      vswarm[i][j] = weight*vswarm[i][j] + c1*np.random.rand()*(pi[i][j]-pswarm[i][j]) + c2*np.random.rand()*(pg[j]-pswarm[i][j])
      pswarm[i][j] = pswarm[i][j] + vswarm[i][j]
  #更新适应值
  fitness = getfitness(pswarm)
  #更新全局最优粒子
  pg,pgfit = getpgfit(fitness,pswarm)
  #更新局部最优粒子
  for i in range(swarmsize):
    if fitness[i] < pifit[i]:
      pifit[i] = fitness[i].copy()
      pi[i] = pswarm[i].copy()

for j in range(swarmsize):
  if pifit[j] < pgfit:
    pgfit = pifit[j].copy()
    pg = pi[j].copy()
print(pg)
print(pgfit)

下面的结果分别是迭代300次和400次的结果。

Python实现粒子群算法的示例

可以看到400次迭代虽然适应度没有达到预期,得到的向量已经很接近期望的结果了。

写在最后:粒子群算法最重要的参数就是惯性权重和学习因子,针对这两个参数有了新的优化粒子群算法(IPSO)。还有初始化粒子群时速度和位置范围的确定,包括种群的大小和迭代次数的选择,这些都是‘摸着石头过河',没有标准答案。

以上就是Python实现粒子群算法的示例的详细内容,更多关于Python 粒子群算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python魔术方法详解
Feb 14 Python
Python正则表达式使用范例分享
Dec 04 Python
Java分治归并排序算法实例详解
Dec 12 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
python中的函数递归和迭代原理解析
Nov 14 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
5款实用的python 工具推荐
Oct 13 Python
python实现不同数据库间数据同步功能
Feb 25 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
Python中对象的比较操作==和is区别详析
Feb 12 #Python
python绘图模块之利用turtle画图
Feb 12 #Python
Python列表的深复制和浅复制示例详解
Feb 12 #Python
Python就将所有的英文单词首字母变成大写
Feb 12 #Python
详解Java中一维、二维数组在内存中的结构
Feb 11 #Python
SpringBoot首页设置解析(推荐)
Feb 11 #Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 #Python
You might like
融入意大利的咖啡文化
2021/03/03 咖啡文化
MySQL修改密码方法总结
2008/03/25 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
php源码的使用方法讲解
2019/09/26 PHP
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
Javascript复制实例详解
2016/01/28 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
Python常用类型转换实现代码实例
2020/07/28 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
普天C++笔试题
2016/03/20 面试题
说明书范文
2014/05/07 职场文书
食品安全汇报材料
2014/08/18 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
2014年化验室工作总结
2014/11/21 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
财务部岗位职责
2015/02/03 职场文书
导游词之南京中山陵
2019/11/27 职场文书