当前位置: 首页 > 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 提取码:…...

flume-将日志采集到hdfs

看到hdfs大家应该做什么&#xff1f; 是的你应该去把集群打开&#xff0c; cd /export/servers/hadoop/sbin 启动集群 ./start-all.sh 在虚拟机hadoop02和hadoop03上的conf目录下配置相同的日志采集方案&#xff0c;‘ cd /export/servers/flume/conf 切换完成之后&#…...

一文学习开源框架LeakCanary

LeakCanary 简介 LeakCanary 是一个由 Square 开发的开源工具&#xff0c;主要用于检测和诊断 Android 应用中的内存泄漏问题。它通过自动化的方式帮助开发者捕捉和分析可能导致内存泄漏的对象&#xff0c;简化了内存问题的排查过程。 LeakCanary 的功能 自动检测内存泄漏&a…...

jetson orin系列开发版安装cuda的gpu版本的opencv

opencv安装包下载地址&#xff1a; https://github.com/opencv/opencv/扩展库下载地址&#xff1a; https://github.com/opencv/opencv_contrib1. 删除jetpack包中的opencv版本 原先的opencv库安装在目录/usr/lib/aarch64-linux-gnu/下&#xff08;一般其他的第三方库也都安…...

数据结构-8.Java. 七大排序算法(中篇)

本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 中篇主要实现后三种排序算法: 冒泡排序,快速排序,下一篇讲 归并排序. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作…...

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…...

python基本数据类型 -- 元组tuple

在 Python 中&#xff0c;元组&#xff08;Tuple&#xff09;是一种轻量级的、不可变的数据结构。与列表类似&#xff0c;元组用于存储有序的数据集合&#xff0c;但它一旦创建&#xff0c;其内容就无法更改。这种特性让元组在某些场景下更加安全和高效。本文将从定义、操作、应…...

tcpdump交叉编译

TCPDUMP在Libpcap上开发。 首先需要编译libcap。 网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#xff0c; 你尽可以试试&#xff0c;从里面找到下载地址都要费半天时间。 \color{red}网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#…...

Spring IOC注入方式、Bean作用域

Spring IOC注入 手动注入 set方法注入 需要提供set方法 public class UserService {private UserDao userDao; ​public void setUserDao(UserDao userDao) {this.userDao userDao;} } 设置属性字段的值 <bean id"userService" class"com.shsxt.servi…...

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…...

利用uniapp开发鸿蒙:运行到鸿蒙模拟器—踩坑合集

从uniapp运行到鸿蒙模拟器上这一步&#xff0c;就有非常多的坑&#xff0c;一些常见的坑&#xff0c;官网都有介绍&#xff0c;就不再拿出来了&#xff0c;这里记录一下官网未记录的大坑 1.运行路径从hbuilderx启动鸿蒙模拟器 解决方法&#xff1a; Windows系统&#xff0c;官…...