Python编程实现粒子群算法(PSO)详解


Posted in Python onNovember 13, 2017

1 原理

粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的。假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位置)。最好的策略就是结合自己的经验在距离鸟群中距离食物最近的区域搜索。

利用粒子群算法解决实际问题本质上就是利用粒子群算法求解函数的最值。因此需要事先把实际问题抽象为一个数学函数,称之为适应度函数。在粒子群算法中,每只鸟都可以看成是问题的一个解,这里我们通常把鸟称之为粒子,每个粒子都拥有:

位置,可以理解函数的自变量的值;
经验,也即是自身经历过的距离食物最近的位置;
速度,可以理解为自变量的变化值;
适应度,距离食物的位置,也就是函数值。

粒子群算法的过程

Python编程实现粒子群算法(PSO)详解

                                              PSO流程图

初始化。包括根据给定的粒子个数,初始化粒子,包括初始化一下的值:

位置:解空间内的随机值;
经验:与初始位置相等;
速度:0;
适应度:根据位置,带入适应度函数,得到适应度值。
更新。包括两部分:
粒子自身信息:包括根据下面的公式更新粒子的速度、位置,根据适应度函数更新适应度,然后和用更新后的适应度和自身经验进行比较,如果新的适应度由于经验的适应度,就利用当前位置更新经验;

Python编程实现粒子群算法(PSO)详解

速度更新公式

Python编程实现粒子群算法(PSO)详解

位置更新公式

上面公式中:i表示粒子编号;t表示时刻,反映在迭代次数上;w是惯性权重,一般设置在0.4左右;c表示学习因子,一般都取值为2;Xpbest表示的是粒子i的经验,也即是粒子i所到过最佳位置;Xgbest代表的是全局最优粒子的位置;r是0到1之间的随机值。

种群信息:把当前适应度和全局最优位置的适应度进行比较,如果当前适应度优于全局最优的适应度,那么久用当前粒子替换群居最优。

判断结束条件。结束条件包括最大迭代次数和适应度的阈值。

2 代码

实验环境为python 2.7.11。

这个代码最初是用于求解一维最大熵分割图像问题的,因此是求解函数最大值,如果需要求解最小值,把代码中的大于号全部改成小于号就可以了。

首先需要解决的是粒子的存储,我第一反应是利用结构体来存储,但是python并没有相应的数据结构,所以我选择用一个类来表示粒子结构,该类的一个对象就是一个粒子,上代码:

class bird:
 """
 speed:速度
 position:位置
 fit:适应度
 lbestposition:经历的最佳位置
 lbestfit:经历的最佳的适应度值
 """
 def __init__(self, speed, position, fit, lBestPosition, lBestFit):
  self.speed = speed
  self.position = position
  self.fit = fit
  self.lBestFit = lBestPosition
  self.lBestPosition = lPestFit

接下来就是粒子群算法的主干部分,用一个类来封装,代码:

import random

class PSO:
 """
 fitFunc:适应度函数
 birdNum:种群规模
 w:惯性权重
 c1,c2:个体学习因子,社会学习因子
 solutionSpace:解空间,列表类型:[最小值,最大值]
 """
 def __init__(self, fitFunc, birdNum, w, c1, c2, solutionSpace):
  self.fitFunc = fitFunc
  self.w = w
  self.c1 = c1
  self.c2 = c2
  self.birds, self.best = self.initbirds(birdNum, solutionSpace)

 def initbirds(self, size, solutionSpace):
  birds = []
  for i in range(size):
   position = random.uniform(solutionSpace[0], solutionSpace[1])
   speed = 0
   fit = self.fitFunc(position)
   birds.append(bird(speed, position, fit, position, fit))
  best = birds[0]
  for bird in birds:
   if bird.fit > best.fit:
    best = bird
  return birds,best

 def updateBirds(self):
  for bird in self.birds:
   # 更新速度
   bird.speed = self.w * bird.speed + self.c1 * random.random() * (bird.lBestPosition - bird.position) + self.c2 * random.random() * (self.best.position - bird.position)
   # 更新位置
   bird.position = bird.position + bird.speed
   # 跟新适应度
   bird.fit = self.fitFunc(bird.position)
   # 查看是否需要更新经验最优
   if bird.fit > bird.lBestFit:
    bird.lBestFit = bird.fit
    bird.lBestPosition = bird.position

 def solve(self, maxIter):
  # 只考虑了最大迭代次数,如需考虑阈值,添加判断语句就好
  for i in range(maxIter):
   # 更新粒子
   self.updateBirds()
   for bird in self.birds:
    # 查看是否需要更新全局最优
    if bird.fit > self.best.fit:
     self.best = bird

有了以上代码,只需要自定义适应度函数fitFunc就可以进行求解,但是需要注意的是只适用于求解 一维问题 。

总结

以上就是本文关于Python编程实现粒子群算法(PSO)详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python算法输出1-9数组形成的结果为100的所有运算式、Python内存管理方式和垃圾回收算法解析、Python随机生成均匀分布在单位圆内的点代码示例等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

Python 相关文章推荐
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 Python
python中requests使用代理proxies方法介绍
Oct 25 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
python+os根据文件名自动生成文本
Mar 21 Python
python安装scipy的方法步骤
Jun 26 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
python SocketServer源码深入解读
Sep 17 Python
python 调用Google翻译接口的方法
Dec 09 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 Python
人工智能最火编程语言 Python大战Java!
Nov 13 #Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 #Python
python、java等哪一门编程语言适合人工智能?
Nov 13 #Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 #Python
python通过opencv实现批量剪切图片
Nov 13 #Python
flask + pymysql操作Mysql数据库的实例
Nov 13 #Python
django之session与分页(实例讲解)
Nov 13 #Python
You might like
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
js 字符串操作函数
2009/07/25 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
python检测服务器端口代码实例
2019/08/31 Python
python数据化运营的重要意义
2019/11/25 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python测试线程应用程序过程解析
2019/12/31 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
python链表类中获取元素实例方法
2021/02/23 Python
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
大学生个人自我鉴定
2013/12/03 职场文书
团日活动总结范文
2014/04/25 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
综艺节目策划方案
2014/06/13 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
sql中mod()函数取余数的用法
2021/05/29 SQL Server
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript