【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:
【强化学习】(47)---《深入理解多智能体近端策略优化(MAPPO)算法与调参》
深入理解多智能体近端策略优化(MAPPO)算法与调参
目录
0 前言
1 MAPPO核心特点
2 On-Policy 和 Off-Policy
2.1. On-Policy 算法
2.2 Off-Policy 算法
对比总结
形象比喻
On-Policy 的小孩
Off-Policy 的小孩
它们的关键区别:
3 MAPPO 是 On-Policy,如何学习历史经验?
4 MAPPO 算法的调参建议
超参数相关
网络结构相关
环境相关
更新频率
[Python] On-Policy 和 Off-Policy 实现
[Notice] 注意事项
5 总结
0 前言
MAPPO 是一种多智能体强化学习算法,基于单智能体的 PPO (Proximal Policy Optimization) 算法进行了扩展,专门设计用于解决多智能体协作和竞争环境中的决策问题。
如果对于MAPPO算法不了解,可以查看这篇文章(代码):
【MADRL】多智能体近端策略优化(MAPPO)算法
1 MAPPO核心特点
-
集中价值网络(Centralized Critic)
- MAPPO 使用一个 centralized critic,将多个智能体的状态、动作信息整合在一起,用于计算价值函数。
- 政策(policy)仍然是每个智能体独立的(decentralized),适合分布式执行。
-
分布式执行与集中式学习
- 在训练时,所有智能体共享全局信息,进行集中式学习。
- 在执行时,每个智能体仅依赖自己的局部观察,保持分布式决策的能力。
-
对 PPO 的优化
- PPO 的核心是通过 clip range 限制策略更新的幅度,确保训练稳定。MAPPO 在多智能体环境中保留了这一优点。
- 针对多智能体场景,对网络结构、数据处理等进行了调整,优化了 PPO 在该场景下的性能。
2 On-Policy 和 Off-Policy
要想更好的理解MAPPO算法的原理机制,得先从On-Policy 和 Off-Policy 两种算法类型出发。在强化学习中,on-policy 和 off-policy 算法根据策略更新时是否依赖当前策略的经验来区分。
以下是两类算法的定义和常见算法列表:
2.1. On-Policy 算法
定义:
- On-policy 算法依赖于当前策略生成的经验进行更新。
- 每次策略更新需要使用最新的采样数据,不能直接利用历史经验。
- 强调策略与数据分布的一致性。
常见的 On-Policy 算法
-
Policy Gradient (PG)
- 基本策略梯度方法。
-
Trust Region Policy Optimization (TRPO)
- 提高策略更新的稳定性,限制更新幅度。
-
Proximal Policy Optimization (PPO)
- TRPO 的改进版本,具有更简单的实现。
- 两种变体:clip-PPO 和 adaptive KL-PPO。
-
Actor-Critic 系列
- A2C (Advantage Actor-Critic):同步更新的 Actor-Critic。
- A3C (Asynchronous Advantage Actor-Critic):异步更新版本。
-
MAPPO (Multi-Agent PPO)
- 专为多智能体场景设计的 PPO 变种。
优点
- 理论收敛性强。
- 更新稳定,适合复杂策略。
缺点
- 样本利用率低(每条数据通常只用一次)。
- 对环境交互的需求较高。
2.2 Off-Policy 算法
定义:
- Off-policy 算法利用历史经验进行策略更新,数据采样可以来自不同策略。
- 借助经验回放(replay buffer)提高样本利用率。
常见的 Off-Policy 算法
-
Q-Learning 系列
- DQN (Deep Q-Network):结合神经网络的 Q-learning。
- Double DQN:解决 DQN 过估计问题。
- Dueling DQN:分离状态价值和动作优势。
-
Deterministic Policy Gradient (DPG)
- 专为连续动作空间设计。
-
Deep Deterministic Policy Gradient (DDPG)
- DPG 的深度强化学习版本,结合 replay buffer 和目标网络。
-
Twin Delayed Deep Deterministic Policy Gradient (TD3)
- DDPG 的改进版,缓解过估计问题。
-
Soft Actor-Critic (SAC)
- 基于最大熵的策略,适用于连续动作空间。
-
Q-Learning with Function Approximation
- Fitted Q、Neural Fitted Q 等。
优点
- 样本利用率高(数据可多次利用)。
- 更适合数据采样成本高的任务(如真实机器人交互)。
缺点
- 更新的稳定性较差(需要经验回放和目标网络)。
- 训练复杂度较高。
对比总结
特性 | On-Policy | Off-Policy |
---|---|---|
样本利用率 | 低(一次性使用) | 高(可重复利用) |
缓冲区 | 无长期缓冲区 | 使用 replay buffer |
策略一致性 | 必须与当前策略一致 | 可利用任意策略生成的数据 |
学习效率 | 依赖高频环境交互 | 适合数据采样成本高的场景 |
收敛性 | 理论收敛性强 | 收敛性依赖数据分布 |
应用场景 | 实时决策、多智能体 | 复杂连续动作、高成本环境 |
形象比喻
on-policy有点像个调皮的小孩子,被打了/奖励了,当场就长记性的那种。而off-policy这种小孩子,被打了/奖励了,它还得回味下,这是一次偶然的惩罚还是这样做就是不好的,他还会去调皮的捣蛋,直到被打怕了(学习到了)。
On-Policy 的小孩
- “被打了/奖励了,当场就长记性”
贴合 on-policy 的特点:- on-policy 是即时性学习,完全依赖于当前策略的反馈进行调整。
- 它专注于当前的策略表现,而不会回头复盘过去的错误或奖励。
- 优点:即时调整,学习过程直接且明确。
- 缺点:缺乏对历史的反思和利用,样本效率低。
Off-Policy 的小孩
-
“回味一下,这是一场偶然的惩罚还是这样做就是不好的”
- 描述了 off-policy 的核心机制:利用经验回放。off-policy 会保存大量的历史经验,在反复回顾和分析中找到优化策略的方法。
- 这种行为类似一个喜欢“钻牛角尖”的小孩,经过无数次试验才明白真正的规律。
-
“调皮地捣蛋,直到被打怕了”
- off-policy 算法在学习时确实会反复尝试甚至冒险探索(如 DQN 的 ϵϵ-greedy 策略),不断调整对环境的理解。
- 它的学习过程可能显得缓慢,但通过深入分析历史数据,它最终会学得更全面和稳定。
它们的关键区别:
- 即时性 vs 历史性:on-policy 专注于当前,而 off-policy 反思过去。
- 效率 vs 深度:on-policy 快速适应环境,而 off-policy 更深刻地理解长期规律。
3 MAPPO 是 On-Policy,如何学习历史经验?
有了上面的基础,MAPPO 是 on-policy。它的缓冲区(buffer)在每次新的 episode 开始时会被清空,而不像 off-policy 算法那样长期保留数据。这主要体现在以下几点:
为什么会清空缓冲区?
On-Policy 的约束
On-policy 算法(如 PPO 和 MAPPO)的策略更新只能依赖最新策略采样的数据,历史数据与当前策略分布不一致,因此被舍弃。这确保了策略更新的稳定性。
如何应对这个问题?
尽管无法直接使用历史经验,仍然可以通过以下方法弥补:
-
加大采样量(buffer size)
增加单次采样的episode_length
或batch_size
,让模型在每次采样时接触更多样本。 -
使用 advantage 标准化
通过标准化 GAE 或 Q 值来减小不同 episode 数据间的方差,从而稳定更新。 -
调整训练步数
MAPPO 的一个优势是,它通常以 centralized critic 方式加速策略学习。通过适当增加训练步数,可以弥补无法利用历史经验的缺陷。 -
环境重置机制
对于训练环境,确保多样性,例如引入 domain randomization 或多种初始化状态,间接增加训练数据的广度。
4 MAPPO 算法的调参建议
MAPPO 的核心参数调节分为以下几类:
超参数相关
-
学习率(learning rate)
适当调低学习率可以提高稳定性,尤其在多智能体环境中噪声较大的情况下。通常建议从 1e−4或 5e−4开始测试。 -
折扣因子(gamma)
γγ 控制长期回报的权重,推荐从 0.95 或 0.99开始,根据任务的时间跨度调整。 -
GAE λ(lambda for Generalized Advantage Estimation)
通常设置为 0.95 左右,平衡偏差与方差的影响。 -
clip range(裁剪范围)
PPO 的核心超参数,通常设置为 0.1 到 0.3 之间,越小代表对策略更新的限制越强。
网络结构相关
-
隐藏层大小(hidden size)
可以调试网络的层数和每层的单元数。典型设置为两层,每层 64 到 256 个单元,视环境复杂度而定。 -
共享网络与独立网络
MAPPO 支持共享网络(centralized critic)或独立网络(decentralized critic)。如果任务需要高效协作,建议使用共享网络。
环境相关
-
batch size
批量大小对训练效率有很大影响,推荐设置为每次采样 2048 到 4096 个 time steps,或者按环境规模调整。 -
episode length
对于 MAPPO,episode_length
确实非常关键,因为它决定了每次采样的数据量。可以根据环境复杂度和任务长度动态调整,通常从 200 到 1000 步之间。
更新频率
- policy update iterations
每次采样后,建议进行 4 到 10 次梯度更新(epochs),以保证策略能够充分利用每批数据。
[Python] On-Policy 和 Off-Policy 实现
以 Proximal Policy Optimization (PPO) 为例:
🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。
"""《on-Policy》时间:2024.11作者:不去幼儿园
"""
Initialize policy network πθ with parameters θ
Initialize value network Vϕ with parameters ϕfor iteration = 1, 2, ..., N do# Collect trajectories (states, actions, rewards) using current policy πθtrajectories = []for episode = 1, ..., M dostate = environment.reset()episode_trajectory = []for t = 1, ..., T doaction = πθ(state) # Sample action from current policynext_state, reward, done = environment.step(action)episode_trajectory.append((state, action, reward))if done:breakstate = next_statetrajectories.append(episode_trajectory)# Compute advantages using GAE or Monte Carlo returnsadvantages, returns = compute_advantages(trajectories, Vϕ)# Update policy πθ using clipped surrogate objectivefor _ in range(policy_update_epochs):policy_loss = compute_policy_loss(πθ, advantages)θ = θ - α_policy * ∇(policy_loss)# Update value network Vϕfor _ in range(value_update_epochs):value_loss = compute_value_loss(Vϕ, returns)ϕ = ϕ - α_value * ∇(value_loss)
以 Deep Q-Learning (DQN) 为例:
"""《off-Policy》时间:2024.11作者:不去幼儿园
"""
Initialize Q-network Qθ with parameters θ
Initialize target network Qθ' with parameters θ' = θ
Initialize replay buffer Dfor iteration = 1, 2, ..., N dostate = environment.reset()for t = 1, ..., T do# ε-greedy policy for explorationif random() < ε:action = random_action()else:action = argmax(Qθ(state))next_state, reward, done = environment.step(action)# Store transition in replay bufferD.append((state, action, reward, next_state, done))# Sample minibatch from replay bufferminibatch = random_sample(D, batch_size)# Compute target valuestarget_values = []for (s, a, r, s_, done) in minibatch:if done:target = relse:target = r + γ * max(Qθ'(s'))target_values.append(target)# Update Q-network Qθloss = compute_loss(Qθ, minibatch, target_values)θ = θ - α * ∇(loss)# Update stateif done:breakstate = next_state# Periodically update target networkif iteration % target_update_freq == 0:θ' = θ
[Notice] 注意事项
on-policy 关键点:
- 数据从环境实时采样,不存储历史数据。
- 更新策略和价值网络时仅使用当前采样的数据。
- 每次策略更新后,之前的数据会被丢弃。
off-policy 关键点:
- 使用 replay buffer 保存历史数据,重复利用经验。
- 策略与目标网络更新分离,数据可以来自不同的策略。
- 数据利用率高,但需要经验回放和目标网络来稳定训练。
由于博文主要为了介绍相关算法的原理和应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳或者无法运行,一是算法不适配上述环境,二是算法未调参和优化,三是没有呈现完整的代码,四是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。
5 总结
MAPPO 是一个高效、稳定且适应性强的多智能体强化学习算法,通过结合 PPO 的稳定性和多智能体环境的需求,为协作与竞争场景提供了强有力的解决方案。
博客都是给自己看的笔记,如有误导深表抱歉。文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者添加VX:Rainbook_2,联系作者。✨
相关文章:
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
3.2.1.2 汇编版 原子操作 CAS
基本原理说明 在 x86 和 ARM 架构上,原子操作通常利用硬件提供的原子指令来实现,比如 LOCK 前缀(x86)或 LDREX/STREX(ARM)。以下是一些关键的原子操作(例如原子递增和比较交换)的汇…...
关于llama2:从原始llama-2-7b到llama-2-7b-hf的权重转换教程
1.首先,我是从各个教程里面选了一个实际操作的教程(这样更加靠谱):下载llama2-7b并转hf模型_huggingface 下载llama2-7b-chat-hf-CSDN博客 2.但是,其实我在另外一篇更好的教程里面看到过一个坑(这篇好像是腾…...
物理机内网穿透
前言: 本文主要讲述如何使用内网穿透以及其安全性。 将带领大家在公网上搭建几个常用靶场。 一,什么是内网穿透。 大多数情况下,我们的个人电脑都处于内网,即没有可公开访问的独立 IP 地址,因此其他内网用户找不到…...
构建一个rust生产应用读书笔记四(实战1)
我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者? 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。姓名:虽然这不是强制性的,但我们希望收集一个名字…...
[LeetCode-Python版]206. 反转链表(迭代+递归两种解法)
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3࿱…...
shardingsphere分库分表跨库访问 添加分片规则
shardingsphere分库分表跨库访问 添加分片规则 建立 JDBC 环境 创建表 t_order: CREATE TABLE t_order (tid bigint(20) NOT NULL,tname varchar(255) DEFAULT NULL,goods_id bigint(20) DEFAULT NULL,tstatus varchar(255) DEFAULT NULL,PRIMARY KEY (tid) ) E…...
【NLP 15、深度学习处理文本】
目录 一、反向传播 编辑 1.反向传播运算过程 2.前向传播和反向传播的作用 前向传播 反向传播 3.定义模型(torch包) 4.手动实现 ① 线性层 ② sigmoid激活函数 ③ 手动实现MSE均方差损失函数 ④ 前向传播 ⑤ 手动实现梯度计算 ⑤ 权重的更新:…...
Android Studio创建新项目并引入第三方so外部aar库驱动NFC读写器读写IC卡
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单,选择 要创建的项目模版,点击 Next 二、输入项目名称…...
3D视觉[一]3D计算机视觉
3D视觉[一]3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D视觉[一]3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像ÿ…...
Linux权限(超详细彻底搞懂Linux的权限)
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:Linux常见指令(初学者必看) 🔖流水不争,争的是滔滔不 一、Linux下的两种用户超级用户&…...
Ubuntu22.04安装docker desktop遇到的bug
1. 确认已启用 KVM 虚拟化 如果加载了模块,输出应该如下图。说明 Intel CPU 的 KVM 模块已开启。 否则在VMware开启宿主机虚拟化功能: 2. 下一步操作: Ubuntu | Docker Docs 3. 启动Docker桌面后发现账户登陆不上去: Sign in | …...
网新恒天八股总结
Java的基本数据类型 四类八种 整数类型:byte,short,int,long 浮点类型:float,double 字符类型:char 布尔类型:boolean char类型的范围 0 ~ 65535,可以表示16位无符号整数 equals和的区别 &,&&a…...
【AIGC】与模型对话:理解与预防ChatGPT中的常见误解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯模型的工作原理和用户期望差异人工智能模型的基本工作原理认知上的局限与误解用户期望与模型实际能力的差距精确理解用户意图的重要性实际应用中的建议 &…...
09篇--图片的水印添加(掩膜的运用)
如何添加水印? 添加水印其实可以理解为将一张图片中的某个物体或者图案提取出来,然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图,并进行二值化处理,去除背景部分,得到一个类似掩膜的图像。然后…...
Qt 使用modbus协议
Qt 框架下 使用modbus协议 一,使用Qt原生的 QModbusClient ,比如QModbusTcpClient 1,因为modbus的读写 需要在同一个线程中,所以需要在主线程中利用moveToThread的方式,将业务逻辑封装到 子线程中。 2,m…...
pip离线安装一个github仓库
要使用pip安装一个本地Git仓库,你可以按照以下步骤操作: 确保你已经克隆了Git仓库到本地。 进入仓库所在的目录。 使用pip安装。 以下是具体的命令: 克隆Git仓库到本地(替换下面的URL为你的仓库URL) git clone https…...
【ETCD】【源码阅读】深入分析 storeTxnWrite.Put方法源码
该方法是 storeTxnWrite 类型中的核心方法,负责将键值对存储到数据库,同时处理键的元数据(如版本、修订号、租约)并管理租约关联。 目录 一、完整代码二、方法详解方法签名1. 计算修订号并初始化变量2. 检查键是否已存在3. 生成索…...
桥接模式的理解和实践
桥接模式(Bridge Pattern),又称桥梁模式,是一种结构型设计模式。它的核心思想是将抽象部分与实现部分分离,使它们可以独立地进行变化,从而提高系统的灵活性和可扩展性。本文将详细介绍桥接模式的概念、原理…...
【Rust自学】3.2. 数据类型:标量类型
3.2.0. 写在正文之前 欢迎来到Rust自学的第三章,一共有6个小节,分别是: 变量与可变性数据类型:标量类型(本文)数据类型:复合类型函数和注释控制流:if else控制流:循环 通过第二章…...
【Leetcode Top 100】199. 二叉树的右视图
问题背景 给定一个二叉树的 根节点 r o o t root root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 数据约束 二叉树的节点个数的范围是 [ 0 , 100 ] [0,100] [0,100] − 100 ≤ N o d e . v a l ≤ 100…...
Java并发编程框架之其他并发工具
选错了就选错了,不要一遍一遍的后悔,总是一遍遍的想,当时怎么样就好了,不要欺负当时的自己,当时你一个人站在迷雾中,也很迷茫,就算重新来一遍,以你当时的阅历和心智,还是…...
MinerU:PDF文档提取工具
目录 docker一键启动本地配置下载模型权重文件demo.py使用命令行启动GPU使用情况 wget https://github.com/opendatalab/MinerU/raw/master/Dockerfile docker build -t mineru:latest .docker一键启动 有点问题,晚点更新 本地配置 就是在Python环境中配置依赖和…...
Unity性能优化---使用SpriteAtlas创建图集进行批次优化
在日常游戏开发中,UI是不可缺少的模块,而在UI中又使用着大量的图片,特别是2D游戏还有很多精灵图片存在,如果不加以处理,会导致很高的Batches,影响性能。 比如如下的例子: Batches是9࿰…...
wazuh-modules-sca-scan
sca模块主函数wm_sca_main -> wm_sca_start 检查policy文件中的每一个项目wm_sca_check_policy static int wm_sca_check_policy(const cJSON * const policy, const cJSON * const checks, OSHash *global_check_list) {if(!policy) {return 1;}const cJSON * const id c…...
力扣-图论-15【算法学习day.65】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
JS萤石云录像回放拖动进度条无法正常播放
问题描述: 本项目版本:vue2.6.12,webpack3.6.0,ezuikit-js0.7.2 在使用萤石云的JavaScript SDK做监控的直播、录像回放时,遇到部分设备的录像回放,无法根据控制面板的拖动进度条查看某时间段的录像。 官方…...
Spring Boot 启动时间优化全攻略
引言 随着 Spring Boot 的广泛应用,开发者享受到了快速开发和自动化配置的便利。然而,随着项目复杂度的增加,Spring Boot 项目启动时间也变得越来越长,这在开发、调试和部署阶段可能会成为效率瓶颈。如何优化 Spring Boot 的启动…...
ubuntu服务器木马类挖矿程序排查、及安全管理总结
版本 24.04 由于GPU多卡服务器多人使用,需要链接隧道ssh等,容易中招挖矿脚本。 总的思路是,顺着进程的PID回溯最终的程序运行起点,这里可以先看一下日志: journalctl -u PID 通过 PID 精确定位进程的信息,…...
redis 使用Lettuce 当redis挂掉重启之后 网络是怎么重新连接
Lettuce是一个高性能的Java Redis客户端,支持同步、异步和反应式编程模式 Lettuce的核心功能包括: 高性能:通过使用Netty作为底层网络通信框架,实现了非阻塞IO,提高了性能。丰富的API:提供了丰富…...
【PyTorch】实现在训练过程中自定义动态调整学习率
问题描述: 在使用 PyTorch 训练自定义神经网络时,我们希望能够动态地调整学习率,以便在训练过程中逐渐优化模型,避免过拟合并加速收敛。那么,如何在 PyTorch 中实现这一功能呢? 解决方案: 在训…...
【Flink-scala】DataStream编程模型总结
系列文章目录 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器 4.【Flink-scala】DataStream编程模型之水位线 5.【…...
语音芯片赋能可穿戴设备:开启个性化音频新体验
在科技日新月异的今天,语音芯片与可穿戴设备的携手合作,正引领我们步入一个前所未有的个性化音频时代。这一创新融合,用户可以享受到更加个性化、沉浸式的音频体验。下面将详细介绍语音芯片与可穿戴设备合作的优点和具体应用。 1. 定制化音效…...
JavaFX使用jfoenix的UI控件
jfoenix还是一个不错的样式,推荐使用,而且也可以支持scene builder中的拖拖拽拽 需要注意的是过高的javafx版本可能会使得某些样式或控件无法使用 比如alert控件,亲测javaFX 19版本可以正常使用 1.在pom.xml中引入依赖 GitHub地址https://gi…...
SpringBoot集成ENC对配置文件进行加密
在线MD5生成工具 配置文件加密,集成ENC 引入POM依赖 <!-- ENC配置文件加密 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.2</ver…...
基于AI对话生成剧情AVG游戏
游戏开发这个领域,一直有较高的学习门槛。作为一个非专业的游戏爱好者,如果想要开发游戏,往往受制于游戏引擎的专业程度,难以完成复杂的游戏项目。 AI IDE的诞生,提供了另外的一种思路,即通过AI 生成项目及…...
MAVEN--Maven的生命周期,pom.xml详解,Maven的高级特性(模块化、聚合、依赖管理)
目录 (一)Maven的生命周期 1.Maven的三套生命周期 2.Maven常用命令 (二)pom.xml详解 (三)Maven的高级特性(模块化、聚合、依赖管理) 1.Maven的依赖范围 2.版本维护 3.依赖传…...
SpringBoot的事务钩子函数
如果需要在A方法执行完成之后做一个不影响主方法运行的动作B,我们需要判断这个A方法是否存在事务,并且使用异步执行动作B; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transa…...
uniapp滚动消息列表
两个相同的循环列表,循环滚动 <view class"winners_list uni-flex uni-column" :animation"animationData"><view v-for"(item, index) in winnersList" :key"index" class"li uni-flex uni-column"&g…...
基于python对pdf文件进行加密等操作
利用python对pdf文件进行操作 读取pdf-源码 import PyPDF2 # 读取pdf格式的文件 reader PyPDF2.PdfFileReader(示例文件/aaa.pdf) print(reader)# 读取指定页面的文件 page reader.getPage(0) # 输出当前页面的文本数据 print(page.extractText())读取pdf-源码解析 这段代…...
Three.js材质纹理扩散过渡
Three.js材质纹理扩散过渡 import * as THREE from "three"; import { ThreeHelper } from "/src/ThreeHelper"; import { LoadGLTF, MethodBaseSceneSet } from "/src/ThreeHelper/decorators"; import { MainScreen } from "/src/compone…...
【Leetcode 每日一题 - 扩展】45. 跳跃游戏 II
问题背景 给定一个长度为 n n n 的 0 0 0 索引 整数数组 n u m s nums nums。初始位置为 n u m s [ 0 ] nums[0] nums[0]。 每个元素 n u m s [ i ] nums[i] nums[i] 表示从索引 i i i 向前跳转的最大长度。换句话说,如果你在 n u m s [ i ] nums[i] nums[i…...
被裁20240927 --- YOLO 算法
背景 在云端部署ViSP,ViSP实现视觉伺服、yolo实现视觉跟踪。 开源的2d视觉跟踪算法有哪些? 开源的2D视觉跟踪算法有很多呢,这里给你推荐一些比较知名和常用的吧。 ByteTrackV2:这是一个通用2D跟踪算法,提出了分层的…...
AI技术架构:从基础设施到应用
人工智能(AI)的发展,正以前所未有的速度重塑我们的世界。了解AI技术架构,不仅能帮助我们看懂 AI 的底层逻辑,还能掌握其对各行业变革的潜力与方向。 一、基础设施层:AI 技术的坚实地基 基础设施层是 AI 技…...
植物大战僵尸辅助【控制台版本】
前面介绍了使用CE和OD的简单使用:CE和OD介绍和使用CE查找阳光的教学:阳光基地址和偏移地址,下面先使用最简单的控制台程序来实现修改阳光的功能。 项目地址 1.分析程序 我们的控制台程序想要修改植物大战僵尸游戏内的数据,它们…...
css中样式前加 css样式前面加个圆点
创建CSS样式,样式名称的前面需要加什么 1、我们只知道符号代表的意思是at,其翻译是 在... 例如media就是 在媒介上。没人规定本身具有什么意义,或者说就算规定了我们也改变不了,只需要知道其规定属性的用法即可。 2、px;}然后根据你自己索要…...
算法刷题Day18: BM41 输出二叉树的右视图
题目链接 描述 思路: 递归构造二叉树在Day15有讲到。复习一下,就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点,可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点,每次从队列里…...
如何实现规范化LabVIEW编程
规范编写LabVIEW程序的目的是提高代码的可读性、可维护性、可扩展性,并确保团队成员能够高效地理解和修改代码。以下是一些关键建议,帮助您编写更专业的LabVIEW代码,并确保它易于后续的升级和维护: 1. 合理的项目结构 目录结构…...
TQ15EG开发板教程:使用SSH登录petalinux
本例程在上一章“创建运行petalinux2019.1”基础上进行,本例程将实现使用SSH登录petalinux。 将上一章生成的BOOT.BIN与imag.ub文件放入到SD卡中启动。给开发板插入电源与串口,注意串口插入后会识别出两个串口号,都需要打开,查看串…...
Springboot+vue实现大文件上传
背景:为了实现大文件上传的功能 1新建数据表sql file_chunk CREATE TABLE file_chunk (id bigint UNSIGNED NOT NULL AUTO_INCREMENT,file_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NULL DEFAULT NULL COMMENT 文件名,chunk_nu…...