python实现粒子群算
博客目录
-
引言
- 什么是粒子群算法(PSO)?
- 粒子群算法的应用场景
- 为什么使用粒子群算法?
-
粒子群算法的原理
- 粒子群算法的基本概念
- 粒子位置和速度的更新规则
- 粒子群算法的流程
- 粒子群算法的特点与优势
-
粒子群算法的实现步骤
- 初始化粒子群
- 计算适应度值
- 更新粒子速度和位置
- 寻找全局最优解
- 收敛条件
-
Python实现粒子群算法
- 面向对象思想设计
- 代码实现
- 示例与解释
-
粒子群算法应用实例:函数优化问题
- 场景描述
- 算法实现
- 结果分析与可视化
-
粒子群算法的优缺点
- 优点分析
- 潜在的缺点与局限性
- 如何改进粒子群算法
-
总结
- 粒子群算法在优化问题中的作用
- 何时使用粒子群算法
- 其他常用的优化算法
1. 引言
什么是粒子群算法(PSO)?
粒子群算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,由Kennedy和Eberhart在1995年提出。它受鸟群觅食行为的启发,通过模拟粒子群体在搜索空间中的移动来寻找最优解。每个粒子代表一个潜在的解决方案,它通过不断更新自己的速度和位置来趋向于局部最优解和全局最优解。
粒子群算法的应用场景
PSO算法通常应用于以下场景:
- 函数优化:在连续或离散空间中寻找函数的最优解。
- 机器学习参数优化:例如在神经网络中优化权重和偏差。
- 路径规划:在机器人导航中寻找最优路径。
- 图像处理:在图像分割中寻找最佳阈值。
为什么使用粒子群算法?
PSO算法是一种简单而高效的优化算法,它不依赖于问题的梯度信息,适用于非线性、多峰、复杂搜索空间的问题。与其他优化算法相比,PSO具有较少的参数设置,容易实现,并且能够快速收敛到全局最优解或次优解。
2. 粒子群算法的原理
粒子群算法的基本概念
在PSO算法中,解空间中的每个解被称为一个“粒子”。每个粒子都有自己的位置和速度,并在多维空间中搜索最优解。粒子通过以下两种方式更新位置:
- 个体最优位置(pBest):粒子本身搜索到的最佳位置。
- 全局最优位置(gBest):整个粒子群体中搜索到的最佳位置。
粒子位置和速度的更新规则
在每一次迭代中,粒子根据以下公式更新其速度和位置:
- 速度更新公式:
v i ( t + 1 ) = w ⋅ v i ( t ) + c 1 ⋅ r 1 ⋅ ( p B e s t i − x i ( t ) ) + c 2 ⋅ r 2 ⋅ ( g B e s t − x i ( t ) ) v_{i}(t+1) = w \cdot v_{i}(t) + c_1 \cdot r_1 \cdot (pBest_i - x_i(t)) + c_2 \cdot r_2 \cdot (gBest - x_i(t)) vi(t+1)=w⋅vi(t)+c1⋅r1⋅(pBesti−xi(t))+c2⋅r2⋅(gBest−xi(t))
- 位置更新公式:
x i ( t + 1 ) = x i ( t ) + v i ( t + 1 ) x_{i}(t+1) = x_i(t) + v_{i}(t+1) xi(t+1)=xi(t)+vi(t+1)
其中:
- v i ( t ) v_i(t) vi(t):粒子 i i i 在第 t t t 次迭代的速度。
- x i ( t ) x_i(t) xi(t):粒子 i i i 在第 t t t 次迭代的位置。
- w w w:惯性权重,控制粒子的速度变化。
- c 1 , c 2 c_1, c_2 c1,c2:加速常数,分别代表个体和全局的学习因子。
- r 1 , r 2 r_1, r_2 r1,r2:[0, 1] 之间的随机数,用于增加随机性。
粒子群算法的流程
- 初始化粒子群位置和速度。
- 计算每个粒子的适应度值(目标函数值)。
- 更新每个粒子的个体最优位置(pBest)和全局最优位置(gBest)。
- 根据更新公式调整每个粒子的速度和位置。
- 重复步骤2-4,直到满足终止条件(如达到最大迭代次数或达到预设误差范围)。
粒子群算法的特点与优势
- 简单易懂:PSO算法相对简单,易于实现。
- 快速收敛:PSO算法具有较强的全局搜索能力,能够快速逼近最优解。
- 参数少:相比于其他优化算法(如遗传算法),PSO的参数较少,便于调优。
3. 粒子群算法的实现步骤
以下是实现PSO算法的主要步骤:
初始化粒子群
随机初始化每个粒子的位置和速度,并计算初始适应度值。
计算适应度值
使用目标函数计算每个粒子的适应度值。适应度值通常用来衡量解的优劣程度。
更新粒子速度和位置
根据前述的更新公式,更新每个粒子的速度和位置。
寻找全局最优解
通过比较每个粒子的适应度值,找到当前群体中的全局最优解。
收敛条件
设置收敛条件,如达到最大迭代次数或达到期望误差范围,以停止算法。
4. Python实现粒子群算法
下面是一个面向对象的Python实现,用于演示PSO算法的实现过程。
面向对象思想设计
在面向对象的设计中,我们可以将PSO算法的组件划分为以下类:
Particle
类:表示单个粒子,包含位置、速度、适应度值、个体最优位置等属性。PSO
类:表示粒子群算法,包含粒子群初始化、适应度计算、位置和速度更新等方法。
代码实现
import numpy as npclass Particle:def __init__(self, dimensions, bounds):self.position = np.random.uniform(bounds[0], bounds[1], dimensions)self.velocity = np.random.uniform(-1, 1, dimensions)self.best_position = np.copy(self.position)self.best_score = float('inf')self.current_score = float('inf')def update_velocity(self, global_best_position, w=0.5, c1=1.5, c2=1.5):r1, r2 = np.random.rand(2)cognitive_component = c1 * r1 * (self.best_position - self.position)social_component = c2 * r2 * (global_best_position - self.position)self.velocity = w * self.velocity + cognitive_component + social_componentdef update_position(self, bounds):self.position += self.velocityself.position = np.clip(self.position, bounds[0], bounds[1])class PSO:def __init__(self, num_particles, dimensions, bounds, max_iter, fitness_func):self.num_particles = num_particlesself.dimensions = dimensionsself.bounds = boundsself.max_iter = max_iterself.fitness_func = fitness_funcself.particles = [Particle(dimensions, bounds) for _ in range(num_particles)]self.global_best_position = np.random.uniform(bounds[0], bounds[1], dimensions)self.global_best_score = float('inf')def optimize(self):for iteration in range(self.max_iter):for particle in self.particles:particle.current_score = self.fitness_func(particle.position)if particle.current_score < particle.best_score:particle.best_score = particle.current_scoreparticle.best_position = np.copy(particle.position)if particle.current_score < self.global_best_score:self.global_best_score = particle.current_scoreself.global_best_position = np.copy(particle.position)for particle in self.particles:particle.update_velocity(self.global_best_position)particle.update_position(self.bounds)print(f"Iteration {iteration + 1}/{self.max_iter}, Best Score: {self.global_best_score}")return self.global_best_position, self.global_best_score
示例与解释
-
Particle类:每个粒子对象具有随机初始化的位置和速度,并保存其个体最佳位置和适应度分数。
update_velocity
和update_position
方法用于更新粒子的速度和位置。 -
PSO类:PSO类用于初始化粒子群体、计算适应度值、更新全局最佳位置和粒子
位置。optimize
方法是核心优化过程。
5. 粒子群算法应用实例:函数优化问题
场景描述
假设我们要找到一个函数的最小值,例如以下简单的二次函数:
f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2
算法实现
使用上述代码中的PSO
类,我们可以定义适应度函数并运行优化过程。
# 定义适应度函数
def fitness_function(position):x, y = positionreturn x**2 + y**2# 参数设置
dimensions = 2
bounds = [-10, 10]
num_particles = 30
max_iter = 100# 初始化PSO
pso = PSO(num_particles, dimensions, bounds, max_iter, fitness_function)# 运行优化
best_position, best_score = pso.optimize()print(f"最佳位置: {best_position}, 最佳适应度值: {best_score}")
结果分析与可视化
通过上述实现,我们可以发现粒子群算法逐渐逼近函数的最小值。
import matplotlib.pyplot as plt# 可视化优化结果
positions = np.array([particle.position for particle in pso.particles])
plt.scatter(positions[:, 0], positions[:, 1], label="粒子位置")
plt.scatter(best_position[0], best_position[1], color='red', label="最佳位置")
plt.legend()
plt.show()
6. 粒子群算法的优缺点
优点分析
- 简单易用:PSO易于实现,适合初学者。
- 快速收敛:PSO具有较强的全局搜索能力,能够快速收敛到全局最优解或次优解。
- 参数较少:相比于遗传算法,PSO的参数更少,调优过程更为简单。
潜在的缺点与局限性
- 局部最优问题:PSO可能会陷入局部最优解,特别是在高维、多峰函数中。
- 缺乏多样性:随着迭代次数的增加,粒子群的多样性会减小,容易导致收敛速度减慢。
如何改进粒子群算法
- 引入动态参数:使用动态调整的惯性权重或加速常数来提高算法性能。
- 混合算法:将PSO与其他优化算法(如遗传算法、模拟退火)相结合,增强全局搜索能力。
- 引入局部搜索策略:在粒子达到局部最优时引入局部搜索策略,以防止陷入局部最优解。
7. 总结
粒子群算法是一种简单而高效的优化算法,在解决各种优化问题(如函数优化、路径规划等)中具有广泛应用。本文通过详细介绍PSO算法的原理,并使用Python面向对象的思想实现了PSO算法,演示了如何解决实际的优化问题。希望读者能够深入理解PSO算法的特点与优势,并在实际项目中有效应用这一算法。
如果你想了解更多关于其他优化算法的信息,请继续关注我们的系列博客!
相关文章:
python实现粒子群算
博客目录 引言 什么是粒子群算法(PSO)?粒子群算法的应用场景为什么使用粒子群算法? 粒子群算法的原理 粒子群算法的基本概念粒子位置和速度的更新规则粒子群算法的流程粒子群算法的特点与优势 粒子群算法的实现步骤 初始化粒子群…...

【Unity案例】搭建射击系统与UI
上期将基础的移动系统搭建完毕后就可以开始搭建更加复杂的系统部分了 前排提示,由于一开始仅思考如何完成操作相关功能,以至于到后面重构稍微有些困难,继续写下去恐成屎山,故在搭完射击和武器UI后不再继续泛化到敌人和敌人状态机…...
Python使用zdppy_mysql操作MySQL和MariaDB数据库快速入门教程
zdppy_mysql 使用python操作MySQL 项目开源地址:https://github.com/zhangdapeng520/zdppy_mysql 安装 pip install zdppy_mysql使用教程 连接MySQL import zdppy_mysql from config import host, username, password, database, port# 连接数据库 db zdppy_…...
union 的正确食用方法
0.前情提要 (很久)之前上编译原理时,一次实验课需要补充完善一个用 c 写的词法分析器;而这个分析器在定义语法树结点时使用了 union 存储语言中不同表达式的类型标签或值本身。因为当时刚好学完了 cpp,拿着锤子看啥都…...

汇编语言在虚拟机中输出“Hello World!”
1.软件 Nasmide64.exe(李忠老师编写) Fixvhdw64.exe(李忠老师编写) VirtualBox虚拟机(免费 开源) 2.过程 01.Fixvhdw64.exe输入以下代码: mov ax,0xb800 mov ds,ax mov byte [0x00],H mov byte [0x02],e mov byte [0x04],l mov byte [0x06],l mov byte [0x08],o mov byte…...

JVM类的加载和类的加载器
JVM类的加载和类的加载器 一.类的加载过程 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于…...

MLM:多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略
MLM:多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略 目录 相关文章 AI之MLM:《MM-LLMs: Recent Advances in MultiModal Large Language Models多模态大语言模型的最新进展》翻译与解读 MLM之CLIP:CLIP…...

Java健康养老智慧相伴养老护理小程序系统源码代办陪诊陪护更安心
健康养老,智慧相伴 —— 养老护理小程序,代办陪诊陪护更安心 🌈【开篇:智慧养老,新时代的温馨守护】🌈 在这个快节奏的时代,我们总希望能给予家人更多的关爱与陪伴,尤其是家中的长…...

Python | Leetcode Python题解之第390题消除游戏
题目: 题解: class Solution:def lastRemaining(self, n: int) -> int:a1 1k, cnt, step 0, n, 1while cnt > 1:if k % 2 0: # 正向a1 stepelse: # 反向if cnt % 2:a1 stepk 1cnt >> 1step << 1return a1...

Github 2024-09-01 开源项目月报 Top16
根据Github Trendings的统计,本月(2024-09-01统计)共有16个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目9TypeScript项目5Dart项目2C项目1Jupyter Notebook项目1Rust项目1开发者职业成长指南 创建周期:2670 天开发语言:TypeScript协议类…...

C++ 继承(二)
目录 1. 实现一个不能被继承的类 2. 友元与继承 3.继承与静态成员 4.多继承及其菱形继承问题 (1). 继承模型 (2). 虚继承 (2.1)虚继承解决数据冗余和二义性的原理 (3). 多继承中指针偏移问题 (4). IO库中的菱形虚拟继承 5. 继承和组合 1. 实现一个不能被继承的类 方法1…...

第 2 章:AJAX 的使用
AJAX 的使用 核心对象:XMLHttpRequest,AJAX 的所有操作都是通过该对象进行的。 1. 使用步骤 创建 XMLHttpRequest 对象 var xhr new XMLHttpRequest(); 设置请求信息 xhr.open(method, url);//可以设置请求头,一般不设置 xhr.setReques…...

ROS——视觉抓取
纲要 视觉抓取中的关键技术 内参标定 物体识别定位 抓取姿态分析 运动规划 外参标定 任意两个位姿之间的关系 眼在外 眼在内 手眼标定流程 robot 部分 标定效果 视觉抓取例程 grasping_demo.cpp 获取两个坐标系之间变换关系:waitForTransform 、 LookupTransform 求相…...

EPLAN2022基础教程
EPLAN2022软件介绍 EPLAN是一款专业的电气设计和绘图软件,它可以帮助我创建和管理电气项目,生成各种报表和文档,与其他软件和系统进行交互,优化工程流程和质量。与传统的CAD绘图对比,EPLAN更适合绘制电气原理图。 下…...
【JavaWeb】Servlet 详解(处理逻辑及常见方法)
文章目录 1. Tomcat1.1 常见的错误1.1.1 出现 4041.1.2 出现 4051.1.3 出现 500 1.2 HttpServlet1.2.1 Tomcat 的处理逻辑1.2.2 相关方法 1.3 HttpServletRequest1.3.1 常见方法1.3.2 jackson 处理逻辑 1.4 HttpServletResponse1.4.1 常见方法 1. Tomcat tomcat 是一个 HTTP 服…...
6 自研rgbd相机基于rk3566之深度计算库程序详解
自研rgbd相机基于rk3566之深度计算库详解 1 tof深度计算库框架读入深度图像参数配置tof模组标定参数读入及解析深度计算函数接口2 tof深度计算库程序详解深度计算程序头文件深度计算程序 源文件1 tof深度计算库框架 读入深度图像参数配置 支持raw8/raw10/raw16 格式 /*******…...
分布式系统框架hadoop3入门
分布式系统框架hadoop3入门 (qq.com) Hadoop3作为分布式系统架构的重要基石,为大规模数据存储与处理提供了强大支持 基本信息 hadoop:一个存储和处理大数据的分布式系统框架 组成: HDFS(数据存储)、MapReduce&…...
使用 i3.LayoutCell() 方法绘制版图并输出为 GDS 文件
使用 i3.LayoutCell 方法绘制版图并输出为 GDS 文件 引言正文引言 在 IPKISS i3.SRef() 函数 一文中我们介绍了如何使用 i3.SRef() 函数将 instance 对象添加到 i3.LayoutCell() 创建的 Cell 对象上。但是当我们使用 write_gdsii() 输出版图时代码就会报错。这里我们将介绍如何…...
mariadb容器
下载镜像 $ sudo docker pull mariadb启动容器 $ sudo docker run --name my-mariadb -d -e MARIADB_DATABASEtestdb -e MARIADB_ROOT_PASSWORDLetmein -p 3306:3306 mariadb上面命令会启动一个名为my-mariadb的容器,并初始化一个testdb数据库,同时设置…...

应用层协议Http
Http协议 1.1 什么是http协议 在进行网络通信时,应用层协议一般都是程序员自己写的,但是有一些大佬其实已经定义出了一些现成的应用层协议,例如:HTTP(超文本传输协议)、FTP(文件传输协议&#…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...