当前位置: 首页 > news >正文

python实现粒子群算

博客目录

  1. 引言

    • 什么是粒子群算法(PSO)?
    • 粒子群算法的应用场景
    • 为什么使用粒子群算法?
  2. 粒子群算法的原理

    • 粒子群算法的基本概念
    • 粒子位置和速度的更新规则
    • 粒子群算法的流程
    • 粒子群算法的特点与优势
  3. 粒子群算法的实现步骤

    • 初始化粒子群
    • 计算适应度值
    • 更新粒子速度和位置
    • 寻找全局最优解
    • 收敛条件
  4. Python实现粒子群算法

    • 面向对象思想设计
    • 代码实现
    • 示例与解释
  5. 粒子群算法应用实例:函数优化问题

    • 场景描述
    • 算法实现
    • 结果分析与可视化
  6. 粒子群算法的优缺点

    • 优点分析
    • 潜在的缺点与局限性
    • 如何改进粒子群算法
  7. 总结

    • 粒子群算法在优化问题中的作用
    • 何时使用粒子群算法
    • 其他常用的优化算法

1. 引言

什么是粒子群算法(PSO)?

粒子群算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,由Kennedy和Eberhart在1995年提出。它受鸟群觅食行为的启发,通过模拟粒子群体在搜索空间中的移动来寻找最优解。每个粒子代表一个潜在的解决方案,它通过不断更新自己的速度和位置来趋向于局部最优解和全局最优解。

粒子群算法的应用场景

PSO算法通常应用于以下场景:

  1. 函数优化:在连续或离散空间中寻找函数的最优解。
  2. 机器学习参数优化:例如在神经网络中优化权重和偏差。
  3. 路径规划:在机器人导航中寻找最优路径。
  4. 图像处理:在图像分割中寻找最佳阈值。
为什么使用粒子群算法?

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)=wvi(t)+c1r1(pBestixi(t))+c2r2(gBestxi(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] 之间的随机数,用于增加随机性。
粒子群算法的流程
  1. 初始化粒子群位置和速度。
  2. 计算每个粒子的适应度值(目标函数值)。
  3. 更新每个粒子的个体最优位置(pBest)和全局最优位置(gBest)。
  4. 根据更新公式调整每个粒子的速度和位置。
  5. 重复步骤2-4,直到满足终止条件(如达到最大迭代次数或达到预设误差范围)。
粒子群算法的特点与优势
  1. 简单易懂:PSO算法相对简单,易于实现。
  2. 快速收敛:PSO算法具有较强的全局搜索能力,能够快速逼近最优解。
  3. 参数少:相比于其他优化算法(如遗传算法),PSO的参数较少,便于调优。

3. 粒子群算法的实现步骤

以下是实现PSO算法的主要步骤:

初始化粒子群

随机初始化每个粒子的位置和速度,并计算初始适应度值。

计算适应度值

使用目标函数计算每个粒子的适应度值。适应度值通常用来衡量解的优劣程度。

更新粒子速度和位置

根据前述的更新公式,更新每个粒子的速度和位置。

寻找全局最优解

通过比较每个粒子的适应度值,找到当前群体中的全局最优解。

收敛条件

设置收敛条件,如达到最大迭代次数或达到期望误差范围,以停止算法。


4. Python实现粒子群算法

下面是一个面向对象的Python实现,用于演示PSO算法的实现过程。

面向对象思想设计

在面向对象的设计中,我们可以将PSO算法的组件划分为以下类:

  1. Particle:表示单个粒子,包含位置、速度、适应度值、个体最优位置等属性。
  2. 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_velocityupdate_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. 粒子群算法的优缺点

优点分析
  1. 简单易用:PSO易于实现,适合初学者。
  2. 快速收敛:PSO具有较强的全局搜索能力,能够快速收敛到全局最优解或次优解。
  3. 参数较少:相比于遗传算法,PSO的参数更少,调优过程更为简单。
潜在的缺点与局限性
  1. 局部最优问题:PSO可能会陷入局部最优解,特别是在高维、多峰函数中。
  2. 缺乏多样性:随着迭代次数的增加,粒子群的多样性会减小,容易导致收敛速度减慢。
如何改进粒子群算法
  1. 引入动态参数:使用动态调整的惯性权重或加速常数来提高算法性能。
  2. 混合算法:将PSO与其他优化算法(如遗传算法、模拟退火)相结合,增强全局搜索能力。
  3. 引入局部搜索策略:在粒子达到局部最优时引入局部搜索策略,以防止陷入局部最优解。

7. 总结

粒子群算法是一种简单而高效的优化算法,在解决各种优化问题(如函数优化、路径规划等)中具有广泛应用。本文通过详细介绍PSO算法的原理,并使用Python面向对象的思想实现了PSO算法,演示了如何解决实际的优化问题。希望读者能够深入理解PSO算法的特点与优势,并在实际项目中有效应用这一算法。

如果你想了解更多关于其他优化算法的信息,请继续关注我们的系列博客!

相关文章:

python实现粒子群算

博客目录 引言 什么是粒子群算法&#xff08;PSO&#xff09;&#xff1f;粒子群算法的应用场景为什么使用粒子群算法&#xff1f; 粒子群算法的原理 粒子群算法的基本概念粒子位置和速度的更新规则粒子群算法的流程粒子群算法的特点与优势 粒子群算法的实现步骤 初始化粒子群…...

【Unity案例】搭建射击系统与UI

上期将基础的移动系统搭建完毕后就可以开始搭建更加复杂的系统部分了 前排提示&#xff0c;由于一开始仅思考如何完成操作相关功能&#xff0c;以至于到后面重构稍微有些困难&#xff0c;继续写下去恐成屎山&#xff0c;故在搭完射击和武器UI后不再继续泛化到敌人和敌人状态机…...

Python使用zdppy_mysql操作MySQL和MariaDB数据库快速入门教程

zdppy_mysql 使用python操作MySQL 项目开源地址&#xff1a;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.前情提要 &#xff08;很久&#xff09;之前上编译原理时&#xff0c;一次实验课需要补充完善一个用 c 写的词法分析器&#xff1b;而这个分析器在定义语法树结点时使用了 union 存储语言中不同表达式的类型标签或值本身。因为当时刚好学完了 cpp&#xff0c;拿着锤子看啥都…...

汇编语言在虚拟机中输出“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文件中的二进制数据读入到内存中&#xff0c;将其放在运行时数据区的方法区内&#xff0c;然后在堆区创建一个java.lang.Class对象&#xff0c;用来封装类在方法区内的数据结构。类的加载的最终产品是位于…...

MLM:多模态大型语言模型的简介、微调方法、发展历史及其代表性模型、案例应用之详细攻略

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

Java健康养老智慧相伴养老护理小程序系统源码代办陪诊陪护更安心

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

Python | Leetcode Python题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; 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 的使用 核心对象&#xff1a;XMLHttpRequest&#xff0c;AJAX 的所有操作都是通过该对象进行的。 1. 使用步骤 创建 XMLHttpRequest 对象 var xhr new XMLHttpRequest(); 设置请求信息 xhr.open(method, url);//可以设置请求头&#xff0c;一般不设置 xhr.setReques…...

ROS——视觉抓取

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

EPLAN2022基础教程

EPLAN2022软件介绍 EPLAN是一款专业的电气设计和绘图软件&#xff0c;它可以帮助我创建和管理电气项目&#xff0c;生成各种报表和文档&#xff0c;与其他软件和系统进行交互&#xff0c;优化工程流程和质量。与传统的CAD绘图对比&#xff0c;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作为分布式系统架构的重要基石&#xff0c;为大规模数据存储与处理提供了强大支持 基本信息 hadoop&#xff1a;一个存储和处理大数据的分布式系统框架 组成&#xff1a; HDFS&#xff08;数据存储&#xff09;、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的容器&#xff0c;并初始化一个testdb数据库&#xff0c;同时设置…...

应用层协议Http

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

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...