粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解
1 原理
粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的。假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位置)。最好的策略就是结合自己的经验在距离鸟群中距离食物最近的区域搜索。
利用粒子群算法解决实际问题本质上就是利用粒子群算法求解函数的最值。因此需要事先把实际问题抽象为一个数学函数,称之为适应度函数。在粒子群算法中,每只鸟都可以看成是问题的一个解,这里我们通常把鸟称之为粒子,每个粒子都拥有:
位置,可以理解函数的自变量的值;
经验,也即是自身经历过的距离食物最近的位置;
速度,可以理解为自变量的变化值;
适应度,距离食物的位置,也就是函数值。
粒子群算法的过程
PSO流程图
初始化。包括根据给定的粒子个数,初始化粒子,包括初始化一下的值:
位置:解空间内的随机值;
经验:与初始位置相等;
速度:0;
适应度:根据位置,带入适应度函数,得到适应度值。
更新。包括两部分:
粒子自身信息:包括根据下面的公式更新粒子的速度、位置,根据适应度函数更新适应度,然后和用更新后的适应度和自身经验进行比较,如果新的适应度由于经验的适应度,就利用当前位置更新经验;
速度更新公式
位置更新公式
上面公式中: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编程实现粒子群算法(PSO)详解
本文地址: http://www.cppcns.com/jiaoben/python/210803.html
粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解相关推荐
- Python编程实现粒子群算法(PSO)详解
1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...
- 粒子群算法(PSO)详解以及使用
1 PSO原理(particle swarm optimazition) 1.1 算法使用范围 根据名字: 粒子群优化,其实就界定了该算法是作为一个优化算法的,优化的目的是什么?使得某个loss 函数 ...
- 海龟画图 python太阳花_python 简单的绘图工具turtle使用详解
目录 1. 画布(canvas) 1.1 设置画布大小 2. 画笔 2.1 画笔的状态 2.2 画笔的属性 2.3 绘图命令 3. 命令详解 4. 绘图举例 4.1 太阳花 4.2 绘制小蟒蛇 4.3 ...
- base6 python 字节_Python使用base64模块进行二进制数据编码详解
前言 昨天团队的学妹来问关于POP3协议的问题,所以今天稍稍研究了下POP3协议的格式和Python里面的poplib.而POP服务器往回传的数据里有一部分需要用到Base64进行解码,所以就顺便看了 ...
- 中文分词算法python代码_python实现中文分词FMM算法实例
本文实例讲述了python实现中文分词FMM算法.分享给大家供大家参考.具体分析如下: FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n- ...
- python菱形_python如何输出菱形与空心菱形详解与巧妙地使用center方法
首先应该了解菱形在输出时,每一行的组成有哪些规律,并且除了中间的一行,上部分和下半部分应该是对称的 这是一个我们要准备输出的一个菱形的模板 ,一共有7行 7列 我们设菱形上半部分的总行数为rows,当 ...
- python程序实例讲解_Python编程之属性和方法实例详解
本文实例讲述了Python编程中属性和方法使用技巧.分享给大家供大家参考.具体分析如下: 一.属性 在python中,属性分为公有属性和私有属性,公有属性可以在类的外部调用,私有属性不能在类的外部调用 ...
- python区块_python区块及区块链的开发详解
接着上一篇交易记录整合交易类,这里描述区块的开发. 首先我们要明白一个区块,需要的内容,包括交易记录集合,时间戳,哈希,上一个区块的哈希.明白了这个,下面就容易代码开发了. import dateti ...
- python 连通域_python中验证码连通域分割的方法详解
实现思路 是用深度遍历,对图片进行二值化处理,先找到一个黑色像素,然后对这个像素的周围8个像素进行判断,如果没有访问过,就保存起来,然后最后这个数组的最小x和最大x就是x轴上的切割位置.这种分割的方法 ...
最新文章
- pugixml读取unicode编码的xml文件的做法
- VC,Windbg,gdb执行到指定代码行方法
- 报告!我还有几个阿里同事也去了亚运会
- 【原创】iframe与父页面之间,变量、方法互相调用
- C++ public、protected、private区别
- 【Python】学习笔记总结1(Python基础)
- 测试Open Live Writer
- # 定义四边形_对特殊平行四边形核心梳理,拓展提升思维
- CEF使用的几个注意点
- codeigniter中base_url和site_url
- c++类之间的基本关系
- 大学生涯规划800字计算机,我的大学生活规划(我的大学生活规划800字作文)
- Linux 添加802.11n网卡驱动
- 束缚游戏 html,束缚游戏
- maptalk地图以及自定义标点的引入
- [转载]中华桥梁先驱——茅以升
- 如何开通个人微信公众号(订阅号)
- 用C语言开发NES游戏(CC65)03、VRAM缓冲区
- 计算机上的游戏怎么不见了怎么办,电脑桌面上的游戏图标不见了怎么办
- php下载视频文件怎么打开,后缀名为php的视频文件用什么播放器?
热门文章
- 一主双从同步错误 error connecting to master ‘slave@192.168.81.158:3306‘ - retry-time: 60 retries: 1
- 二、生理信号处理 ——1.心电信号(含Matlab代码及数据)
- CSS单行/多行文本溢出显示省略号(...)
- MDCC王戈点爆全场:Smule乐器王是怎样炼成的
- mysql查看数据库的容量及表容量
- 这13个GIS开源软件,你了解吗?
- wifi无线网卡(zd1211b芯片)移植到mini2440全过程(一)
- Vue.js 3 ssr 中报错Hydration node mismatch: - Client vnode: div - Server rendered DOM:已解决
- python词频统计GUI(thinter)
- (学习笔记)PCL点云库的基本使用