【python】利用python实现简单粒子群优化算法实例
前言
最近在准备复(bai)习(lan)智能信息处理ing……想着通过复现一些PPT上简单算法例子的方式加深自己对算法的理解,也作为大家使用粒子群这一算法的思路与代码参考hhh
算法简述
粒子群算法(PSO)是1995年由美国社会心理学家J.Kennedy和电气工程师R.Eberhart共同提出,其基本思想是受到鸟类群体行为研究结果的启发,由于计算的快速性和易于实现从而引起重视。
PSO算法是通过随机化一群粒子的位置和运动速度,通过群体之间的联系和不同微粒之间个体的速率差异,通过一定的迭代规则,使其不断趋近于优化目标的真实解或解集,即求取最(极)大值或是最(极)小值的过程。
在这里,我们可以将每一个微粒个体看作是在n维搜索空间中的一个没有质量和体积的微粒,并在搜索空间中以一定的速度飞行,而飞行的速度由个体的飞行经验和群体的飞行经验进行动态调整。
我们以求函数最小值的优化问题帮助理解粒子群优化算法并尝试通过代码实现。
实例
今有如下Rosenbrock函数,求解其最小值:
f(x,y)=100(y−x2)2+(1−x)2f(x,y)=100(y-x^2)^2+(1-x)^2f(x,y)=100(y−x2)2+(1−x)2
其中,限定定义域
x,y∈[−30,30]x,y\in[-30,30]x,y∈[−30,30]
粒子最大速度Vmax=60V_{max}=60Vmax=60
函数大致图示如下:
由于问题的维数为2(x和y),所以我们每个粒子的速度和位置都应该是2维的向量,例如:
对于第i个粒子,有:
locationi=(xi,yi)location_i=(x_i,y_i)locationi=(xi,yi)
v=(vxi,vyi)v=(v_{xi},v_{yi})v=(vxi,vyi)
紧接着对位置和速度进行随机数初始化,限定范围为[-30,30]即可。
接下来就是计算每个粒子的适应度(fitness)。
适应度这一概念应用比较广泛,在遗传算法等一些其它优化算法中,这一名词也经常出现。在这里它表征的是每个粒子对于优化问题结果的评价指标,比如,以本例来说,我们希望找到函数的最小值以及取得最小值的点,那么我们就可以把本次实例的粒子适应度确定为粒子当前位置的函数值,函数值越小,意味着我们可能越接近最小值,即离我们的优化目标越近。
综上,我们可以通过直接求每个粒子的当前函数值来作为粒子当前的适应度。
在求取适应度值后,选取对于当前问题的局部最优解(个体历史最优解)和全局最优解(群体历史最优解)。
其中局部最优解指的是每一轮迭代后,所有粒子当前状态的适应度最大(小)值;全局最优解指的是所有粒子从开始迭代优化一直到现在的这一大段时间里出现过的适应度最大(小)值;当算法完成迭代轮次后,应该输出的是最终状态的全局最优解以及取得最优解的点。
接下来是更新粒子的速度和位置。
我们采用如下速度和位置的更新函数:
vk+1=w∗vk+c1∗ξ(pk−xk)+c2∗η(pg−xk)v_{k+1}=w*v_k+c_1*\xi(p_k-x_k)+c_2*\eta(p_g-x_k)vk+1=w∗vk+c1∗ξ(pk−xk)+c2∗η(pg−xk)
xk+1=xk+vk+1x_{k+1}=x_k+v_{k+1}xk+1=xk+vk+1
其中www为惯性权重(调节对解空间搜索范围),本例取1,c1c_1c1和c2c_2c2系数为加速度常数,本例均取2,ξ\xiξ和η\etaη为(0,1)之间的随机数。
通过上述更新式完成对粒子位置和速度的更新(要注意一下,本例限定速度在任何一个维度不能超过60,但对于位置,一般不强行拉回解空间)。
重复上述步骤,直至达到迭代次数或迭代结果与真实值之间差值小于某一给定误差。
代码部分
这里直接给出全部过程代码,关键位置给出注释,欢迎大家有问题随时来讨论
# -*- coding:utf-8 -*-
# 2022/11/29
# Jonathan.K.Wolf
import numpy as np"""
每一个粒子的形式:
z:
[x, y]
"""
# 种群规模
m = 5
# 迭代参数
c0 = 1
c1 = 2
c2 = 2# 定义函数
def Rosenbrock(z):sum = 100.0 * np.power(z[1] - np.power(z[0], 2), 2) + np.power((1 - z[0]), 2)return sum# 初始化种群
def init_group(size):group = []for i in range(size):group.append([])for i in range(size):for j in range(2):group[i].append(np.random.uniform(-30.0, 30.0))return group# 初始化速度
def init_speed(size):speed = []for i in range(size):speed.append([])for i in range(size):for j in range(2):speed[i].append(np.random.uniform(-60.0, 60.0))return speed# 计算适应度
def calculate_fitness(group):fitness = []for item in range(len(group)):fitness.append(Rosenbrock(group[item]))return fitness, fitness.index(min(fitness))# 更新位置和速度
def update_loc_speed(group, speed, pk, pg):new_group = []new_speed = []for item in range(len(group)):new_group.append([])new_speed.append([])for item in range(len(group)):for index in range(len(group[0])):new_speed[item].append(speed[item][index] + 2 * np.random.rand() * (pk[index] - group[item][index]) + 2 * np.random.rand() * (pg[index] - group[item][index]))new_group[item].append(group[item][index] + new_speed[item][index])# 限定速度范围for item in range(len(speed)):for index in range(len(speed[0])):if new_speed[item][index] > 60.0:new_speed[item][index] = 60.0if new_speed[item][index] < -60.0:new_speed[item][index] = -60.0return new_group, new_speed# 主要过程迭代
def process():epoch = 100000group_real = init_group(5)speed_real = init_speed(5)# 历史最优解history_best = group_real[0]# 当前最优解p = []# print(group_real)# print(speed_real)for i in range(epoch):fitness_real, pg_ = calculate_fitness(group_real)p.append(group_real[pg_])if Rosenbrock(p[i]) <= Rosenbrock(history_best):history_best = p[i]group_real, speed_real = update_loc_speed(group_real, speed_real, p[i], history_best)if i % 100 == 0:# print("current epoch:%d, current solution:%e" % (i, Rosenbrock(history_best)))print("current epoch:{}, current solution:{}".format(i, history_best))print("the answer after {} epoch is ({},{}), and current value is {}".format(epoch, history_best[0], history_best[1],Rosenbrock(history_best)))if __name__ == '__main__':process()
运行结果
100000轮次下得到最小值点及结果如图,与真实点(1,1)和最小值0相差无几,成功印证了算法的可用性
当然本篇只是实现最基本的粒子群优化算法,针对于优化问题的更优算法和改进方式还有很多,篇幅有限,这里不再详细解读了hhh
最后也欢迎各位大佬有问题随时批评指正~
【python】利用python实现简单粒子群优化算法实例相关推荐
- 简单粒子群优化算法的函数寻优
原文链接:http://blog.csdn.net/on2way/article/details/44699223 一:关于粒子群算法 粒子群算法是一种智能优化算法.关于智能,个人理解,不过是在枚举法 ...
- 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用
粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...
- Python自定义:粒子群优化算法
Python中的粒子群算法 例子算法又被称作飞鸟觅食算法,是一种常见的现代启发式优化算法.在Python中,处于不同的情况考虑,我们都可能使用到该算法.在这里我给出三种情况下的解决方案或者替代方案. ...
- 优化算法 | 随机漂移粒子群优化算法(附标准PSO算法Python工具包)
目录 ▎标准PSO算法 ▎RDPSO算法 ▎标准PSO算法Python工具包 01 | 工具包适用范围 02 | 工具包安装方法 03 | 工具包使用实例 ▎参考文献 今天为各位讲解一种改进的粒子群优 ...
- 【项目实战】Python实现用PSO粒子群优化算法对KMeans聚类模型进行优化项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 粒子群优化算法(Particle Swarm optimizat ...
- 智能算法系列之粒子群优化算法
本博客封面由ChatGPT + DALL·E 2共同创作而成. 文章目录 前言 1. 算法思想 2. 细节梳理 2.1 超参数的选择 2.2 一些trick 3. 算法实现 3.1 问题场景 3. ...
- Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战
Particle Swarm Optimization 粒子群算法(PSO算法) 定义 粒子群算法,又称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近 ...
- 【优化算法】粒子群优化算法
粒子群优化算法 粒子群优化算法简介 粒子群优化算法原理 粒子群优化算法的数学描述 粒子群优化算法框架 PySwarms:Python中粒子群优化的研究工具包 PySwarms快速使用 示例:编写自己的 ...
- 一文搞懂什么是粒子群优化算法(Particle Swarm Optimization,PSO)【附应用举例】
Python代码链接放文末. 本文参考了很多张军老师<计算智能>的第六章知识. 本文来源:https://blog.csdn.net/qq_44186838/article/details ...
最新文章
- php-fpm配置详解
- 新闻标题 静态分页 (无刷新)
- 数据库查询:列出各个部门中工资高于本部门平均工资的员工信息,并按部门号排序。
- 不是css3新增的技术,CSS3中的5个有趣的新技术
- 大数据学习——mapreduce共同好友
- nodejs-基础:路由基础
- windows 版本 Appium 环境搭建
- java实现ssh_使用纯Java实现一个WebSSH项目
- GPU Pro 7——实时体积云(翻译,附Unity工程)
- NMOS与PMOS的区分及使用
- audit2allow命令提示No module named sepolgen.audit
- 分享一个能对java代码进行“tokenize”的python库
- 巧妙去掉多余的安全删除硬件图标
- 人脸识别《一》opencv人脸识别之人脸检测
- 存储过程中的异常处理
- form表单的enctype
- 线性空间的定义与性质
- YGG SEA 在越南成功启动
- 爱奇艺携手网心科技构建下一代混合CDN,入选IDC中国边缘云最佳实践
- 172-Next.js入门
热门文章
- B站韩顺平java学习笔记(六)--面向对象编程章节
- 深入浅出python系列(三):逻辑判断语句
- 计算机网络名为pc是什么意思啊,网络pc的意思 什么叫网络pc - 云骑士一键重装系统...
- AIX操作系统维护详解
- 降雨量(附我的SB调题过程)
- 晶体封装越小esr越大_晶振与晶体的参数详解
- RSA概念详解及工具推荐大全 - lmn
- [GWCTF 2019]pyre
- javaweb代码编译打包上架流程简易说明
- tomcat 7 最新版本 apache-tomcat-7.0.109