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 相关文章推荐
Python单链表的简单实现方法
Sep 23 Python
python实现拓扑排序的基本教程
Mar 11 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
基于python使用tibco ems代码实例
Dec 20 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
python定义类的简单用法
Jul 24 Python
Python爬取12306车次信息代码详解
Aug 12 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
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
firefox下input type="file"的size是多大
2011/10/24 Javascript
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
TensorFlow Session会话控制&Variable变量详解
2018/07/30 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
Python二元赋值实用技巧解析
2019/10/25 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
python高级特性简介
2020/08/13 Python
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
一年级数学教学反思
2014/02/01 职场文书
三项教育活动实施方案
2014/03/30 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书