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

【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核心特点

  1. 集中价值网络(Centralized Critic)

    • MAPPO 使用一个 centralized critic,将多个智能体的状态、动作信息整合在一起,用于计算价值函数。
    • 政策(policy)仍然是每个智能体独立的(decentralized),适合分布式执行。
  2. 分布式执行与集中式学习

    • 在训练时,所有智能体共享全局信息,进行集中式学习。
    • 在执行时,每个智能体仅依赖自己的局部观察,保持分布式决策的能力。
  3. 对 PPO 的优化

    • PPO 的核心是通过 clip range 限制策略更新的幅度,确保训练稳定。MAPPO 在多智能体环境中保留了这一优点。
    • 针对多智能体场景,对网络结构、数据处理等进行了调整,优化了 PPO 在该场景下的性能。

2 On-PolicyOff-Policy

        要想更好的理解MAPPO算法的原理机制,得先从On-PolicyOff-Policy 两种算法类型出发。在强化学习中,on-policyoff-policy 算法根据策略更新时是否依赖当前策略的经验来区分。

以下是两类算法的定义和常见算法列表:


2.1. On-Policy 算法

定义

  • On-policy 算法依赖于当前策略生成的经验进行更新。
  • 每次策略更新需要使用最新的采样数据,不能直接利用历史经验。
  • 强调策略与数据分布的一致性。
常见的 On-Policy 算法
  1. Policy Gradient (PG)

    • 基本策略梯度方法。
  2. Trust Region Policy Optimization (TRPO)

    • 提高策略更新的稳定性,限制更新幅度。
  3. Proximal Policy Optimization (PPO)

    • TRPO 的改进版本,具有更简单的实现。
    • 两种变体:clip-PPO 和 adaptive KL-PPO。
  4. Actor-Critic 系列

    • A2C (Advantage Actor-Critic):同步更新的 Actor-Critic。
    • A3C (Asynchronous Advantage Actor-Critic):异步更新版本。
  5. MAPPO (Multi-Agent PPO)

    • 专为多智能体场景设计的 PPO 变种。
优点
  • 理论收敛性强。
  • 更新稳定,适合复杂策略。
缺点
  • 样本利用率低(每条数据通常只用一次)。
  • 对环境交互的需求较高。

2.2 Off-Policy 算法

定义

  • Off-policy 算法利用历史经验进行策略更新,数据采样可以来自不同策略。
  • 借助经验回放(replay buffer)提高样本利用率。
常见的 Off-Policy 算法
  1. Q-Learning 系列

    • DQN (Deep Q-Network):结合神经网络的 Q-learning。
    • Double DQN:解决 DQN 过估计问题。
    • Dueling DQN:分离状态价值和动作优势。
  2. Deterministic Policy Gradient (DPG)

    • 专为连续动作空间设计。
  3. Deep Deterministic Policy Gradient (DDPG)

    • DPG 的深度强化学习版本,结合 replay buffer 和目标网络。
  4. Twin Delayed Deep Deterministic Policy Gradient (TD3)

    • DDPG 的改进版,缓解过估计问题。
  5. Soft Actor-Critic (SAC)

    • 基于最大熵的策略,适用于连续动作空间。
  6. Q-Learning with Function Approximation

    • Fitted QNeural Fitted Q 等。
优点
  • 样本利用率高(数据可多次利用)。
  • 更适合数据采样成本高的任务(如真实机器人交互)。
缺点
  • 更新的稳定性较差(需要经验回放和目标网络)。
  • 训练复杂度较高。

对比总结

特性On-PolicyOff-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)的策略更新只能依赖最新策略采样的数据,历史数据与当前策略分布不一致,因此被舍弃。这确保了策略更新的稳定性。

如何应对这个问题?

尽管无法直接使用历史经验,仍然可以通过以下方法弥补:

  1. 加大采样量(buffer size)
    增加单次采样的 episode_lengthbatch_size,让模型在每次采样时接触更多样本。

  2. 使用 advantage 标准化
    通过标准化 GAE 或 Q 值来减小不同 episode 数据间的方差,从而稳定更新。

  3. 调整训练步数
    MAPPO 的一个优势是,它通常以 centralized critic 方式加速策略学习。通过适当增加训练步数,可以弥补无法利用历史经验的缺陷。

  4. 环境重置机制
    对于训练环境,确保多样性,例如引入 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)算法与调参

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…...

深入探索Go语言中的sync.Mutex与sync.RWMutex:原理、应用与实践

深入探索Go语言中的sync.Mutex与sync.RWMutex:原理、应用与实践 在并发编程的世界里,Go语言以其独特的并发模型和简洁的语法赢得了广泛的关注。在Go语言的并发控制工具箱中,sync.Mutex和sync.RWMutex是两个至关重要的工具,它们帮助开发者保护共享资源,避免竞态条件,确保…...

15.postgresql--jsonb 数组进行打平,过滤

用jsonb_array_elements函数先展开数组&#xff0c;再用jsonb_each函数遍历元素中的键值对 例如&#xff1a; SELECT * FROM data_table, LATERAL jsonb_array_elements(json_column) WITH ORDINALITY as elem(element, idx) JOIN LATERAL jsonb_each(elem.element) as kv(ke…...

linux下i2c开发与框架源码分析

目录 1 概述 2 I2c子系统框架 3 I2C的使用流程 3.1 在驱动里使用 3.2 在应用层使用 3.3 I2ctool的使用 4 为硬件i2c注册一个适配器 5 i2c子系统源码流程分析 5.1 i2c device与driver绑定过程 5.1.1 Driver的注册与处理 5.1.2 Client device的生成 5.2 I2c的发送与接…...

[ruby on rails] 安装docker

1. docker安装 ubuntu14.04后自带docker安装包&#xff0c;可以直接安装docker.io sudo apt-get updatesudo apt-get install -y docker.io # 安装后启动sudo service docker start最新版本docker 安装docker-ce # 官方源 curl -fsSL https://download.docker.com/linux/ubun…...

I2C学习

详情学习 12. I2C通讯 — [野火]Linux基础与应用开发实战指南——基于LubanCat-RK系列板卡 文档 (embedfire.com) 问题 i2c总线中scl和sda两条线的作用以及区别 在 I2C 总线&#xff08;Inter-Integrated Circuit&#xff09;中&#xff0c;SCL 和 SDA 是两条核心信号线&am…...

VUE:基于MVVN的前端js框架

文章目录 vue框架v-show vue框架 注意是 先写函数名&#xff0c;再写function。 handle:function (){}下面是错误的 function:handle(){}3 v-show 本质上等于号后面还是判断条件&#xff0c;所以不能写赋值语句&#xff0c;下面是正确的 下面是错误的 v-show " ge…...

06、Spring AOP

在我们接下来聊Spring AOP之前我们先了解一下设计模式中的代理模式。 一、代理模式 代理模式是23种设计模式中的一种,它属于结构型设计模式。 对于代理模式的理解: 程序中对象A与对象B无法直接交互,如:有人要找某个公司的老总得先打前台登记传达程序中某个功能需要在原基…...

c语言学习26字符串的应用

字符串在stm32串口中的应用 串口控制流水灯 pc通过串口发送字符串命令控制流水灯 open 流水灯打开 close 流水灯关闭 speed 1~9速度控制 if(strcmp((char *)usart1_rec_buff,"open")0) { led_flag 1; } else if(strcmp((char *)usart1_rec_buff,"close&qu…...

法语旅游常用口语-柯桥学外语到蓝天广场泓畅学校

以下是一些实用的法语旅游常用口语&#xff0c;帮助你在法国旅行时能够进行基本的交流&#xff1a; 问候与道别 Bonjour: 用于日常问候。Au revoir: 用于告别。 请求帮助 S’il vous plat: 用于请求帮助&#xff0c;例如在需要寻找某个地点或服务时。 询问信息 Excusez-moi: 用…...

Kafka 生产者优化与数据处理经验

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…...

MySQL 主从复制之多线程复制

一、MySQL 多线程复制的背景 MySQL 的主从复制延迟一直是受开发者最为关注的问题之一&#xff0c;MySQL 从 5.6 版本开始追加了并行复制功能&#xff0c;目的就是为了改善复制延迟问题&#xff0c;并行复制称为enhanced multi-threaded slave&#xff08;简称MTS&#xff09;。…...

Linux2.6内核进程调度队列

文章目录 前言运行队列 runqueue优先级活动队列过期队列活跃队列 VS 过期队列active指针和expired指针O(1)调度算法 前言 在前面学习并认识了进程之后&#xff0c;我们会发出一个疑问&#xff1a;Linux内核是如何调度进程的呢&#xff1f; 接下来我们就以Linux2.6内核为例深入探…...

Infineon(英飞凌) TLE985xQX 芯片电机工作电流、电压AD采样

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 单片机芯片合集 文章目录 其他系列文章导航 文章目录 前言 一、选取合适的端口 1.通过 OP1、OP2 电流采集运放输入端口进行H桥驱动的电流采集。 2.通过 O_D_VBAT_AD_EN、I_A_VBAT_A…...

Sparrow系列拓展篇:对信号量应用问题的深入讨论

前言 笔者之前已经介绍过了Sparrow信号量的源码&#xff0c;但是对于信号量的使用&#xff0c;并没有讲得非常详细&#xff0c;仅仅讲了同步与互斥的概念。 本章让笔者介绍如何使用Sparrow的信号量&#xff0c;深入探讨一下信号量在同步、计数与互斥中的应用。 使用信号量解…...

图文详解Docker下配置、测试Redis

文章目录 前言实测环境&#xff1a;实验思路&#xff1a; 正文1.准备工作2. 配置、运行 Redis 容器3. 配置测试 总结 前言 配置、测试redis数据库服务器&#xff0c;首先确保正确安装docker&#xff0c;并且已启动运行&#xff0c;具体安装docker方法见笔者前面的博文《OpenEu…...

Python编程艺术:优雅与实用的完美平衡(推导式)

在Python这门优雅的编程语言中&#xff0c;处处体现着"简洁即是美"的设计哲学。今天我们深入探讨Python中那些让代码更优雅、更高效的编程技巧&#xff0c;这些技巧不仅能提升代码的可读性&#xff0c;还能让编程过程充满乐趣。 列表推导式的魔力 Python的列表推导…...

Spring Boot框架Starter组件整理

在Spring Boot框架中&#xff0c;starter是一种预定义的依赖集合&#xff0c;旨在简化Maven或Gradle等构建工具中的依赖管理。每个starter都包含了实现特定功能所需的库和组件&#xff0c;以及相应的配置文件。开发者只需在项目中引入相应的starter依赖&#xff0c;即可快速搭建…...

C/C++基础知识复习(27)

1) 移动语义和拷贝语义的区别 拷贝语义和移动语义是C中对象所有权管理的两种机制&#xff0c;主要在对象初始化、赋值或传参时体现。 拷贝语义 (Copy Semantics) 行为&#xff1a;通过深拷贝或浅拷贝&#xff0c;创建一个新对象&#xff0c;并将原对象的值或资源复制到新对象…...

IEC61850实现方案和测试-2

IEC61850实现方案和测试-1作为介绍实现方案和测试的第二篇文章&#xff0c;后续会继续更新&#xff0c;欢迎关注。 第一篇是&#xff1a;IEC61850实现方案和测试-1-CSDN博客 UCA详细测试用例下载&#xff1a; 链接: https://pan.baidu.com/s/1TTMlYRfzKITgrkWwwtcrDg 提取码:…...

stm32G473的flash模式是单bank还是双bank?

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

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...