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(文件传输协议&#…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
