PyMARL框架解析:基于PyTorch的多智能体强化学习实战指南
发布时间:2026/9/4 3:44:06 锦皓数字建站

简介本资源是面向多智能体强化学习MARL研究者与高校AI方向研究生的PyTorch开源框架PyMARL完整实现包聚焦星际争霸IIStarCraft II复杂协作任务建模与算法对比实验。资源集成QMIX、COMA、VDN、IQL、QTRAN五大主流价值分解与协同学习算法并深度适配SMAC环境支持在统一基准下开展策略训练、性能评估与消融分析。压缩包共88个文件含32个核心Python源码如learners、controllers、runners模块、11个YAML配置文件定义算法超参与环境设置、4个Shell脚本含install_sc2.sh与run.sh等自动化部署/运行工具以及LICENSE、README.md和说明文档等总大小仅125KB结构清晰、模块解耦便于算法复现、调试与二次开发。目前已有156人学习下载读者可直接运行SMAC场景、复现论文结果、替换自定义网络结构或扩展新算法显著降低MARL实验门槛。1. 项目背景与核心价值如果你对多智能体强化学习MARL感兴趣尤其是想复现《星际争霸II》中那些令人惊叹的AI协作表现那么你大概率绕不开一个名字PyMARL。这个基于PyTorch的开源框架几乎是过去几年里学术界和工业界研究多智能体协作的“标准实验台”。我第一次接触它是为了复现一篇顶会论文中关于QMIX算法的结果当时市面上能找到的、集成度如此之高、且直接对接SMAC星际争霸多智能体挑战环境的框架PyMARL几乎是唯一的选择。这个框架的核心价值在于它把一套复杂的研究基础设施给打包好了。你不用再从头去写环境交互、经验回放、网络结构、训练循环这些底层轮子更不用自己去费力实现QMIX、COMA、VDN、IQL、QTRAN这些听起来就头大的算法。PyMARL把这些都封装成了可配置的模块你只需要改改配置文件就能在不同的算法和环境之间快速切换、对比实验。这对于研究者来说意味着可以把精力集中在算法创新或问题分析上对于学习者来说则意味着有一条相对清晰的路径能让你亲手跑通那些经典论文里的实验直观地理解不同算法在协作任务上的表现差异。我最初用它的时候文档还不算特别完善很多细节需要扒源码才能搞懂。但正是这个过程让我对MARL的工程实现有了更深的理解。这次我就结合自己的使用和踩坑经验来拆解这个“基于PyTorch的深度多智能体强化学习框架PyMARL”看看它到底是怎么工作的以及如何用它来开展你自己的星际争霸II多智能体协作实验。2. PyMARL框架的架构与核心组件拆解PyMARL的架构设计体现了典型的研究型框架思路高度模块化、配置驱动、算法与环境解耦。理解这个架构是高效使用它的前提。2.1 整体工作流与目录结构当你解压PyMARL的代码包后通常会看到类似如下的核心目录结构不同版本可能有细微差别pymarl/ ├── src/ │ ├── components/ │ │ ├── action_selectors.py # 动作选择策略如epsilon-greedy │ │ └── episode_buffer.py # 经验回放缓冲区 │ ├── controllers/ # 智能体控制器核心调度逻辑 │ ├── learners/ # 算法学习器如QLearner, QMIXLearner │ ├── modules/ # 神经网络模块如RNN、混合网络 │ └── runners/ # 环境运行器负责与环境交互 ├── config/ # 算法与环境配置文件 ├── envs/ # 环境封装主要是SMAC └── scripts/ # 训练和评估脚本它的工作流非常清晰配置加载通过一个YAML或JSON配置文件指定要使用的算法如qmix、环境如sc2、超参数、网络结构等。环境初始化根据配置创建SMAC环境实例。SMAC本身是对星际争霸II游戏引擎的Python封装提供了标准的Gym接口。智能体与算法初始化根据算法配置创建对应的Learner负责计算损失和更新网络和Controller负责在每一步为每个智能体选择动作。训练循环由Runner驱动。在每个episode中Runner让Controller与环境交互收集经验数据存入EpisodeBuffer。达到一定步数后将数据传递给Learner进行模型更新。评估与保存定期或在训练结束后使用训练好的策略在测试地图上运行评估性能并保存模型检查点。这个流程的关键在于Learner和Controller是算法相关的而Runner和Buffer相对通用。当你从QMIX切换到VDN时本质上只是换了一个Learner和对应的网络模块。2.2 核心算法模块的实现逻辑PyMARL集成的几个算法可以大致分为两类值分解Value Decomposition类和策略梯度Policy Gradient类。值分解类QMIX, VDN, QTRAN 这类算法的核心思想是通过学习一个联合动作值函数Q_tot来指导协作同时保证这个联合Q值与个体Q值之间存在某种可分解的关系从而实现集中训练、分散执行CTDE。VDNValue Decomposition Networks最简单直接假设联合Q值是各个智能体个体Q值的和Q_tot sum(Q_i)。其Learner计算损失时是用联合奖励和下一状态的联合Q值来更新Q_tot然后通过求和关系反向传播到每个Q_i网络。实现简单但表达能力有限无法处理一些非线性的协作关系。QMIX这是PyMARL的标志性算法。它不再简单求和而是使用一个混合网络Mixing Network以单调性约束确保Q_tot随每个Q_i单调递增将个体Q值非线性地混合成Q_tot。混合网络的权重由超网络Hypernetwork根据全局状态生成。这允许了更复杂的价值融合同时仍满足CTDE要求。在代码里你会看到QMixer和HyperNet这两个关键模块。QTRAN为了克服QMIX的单调性限制有些协作关系可能不满足单调性QTRAN提出了另一种分解方式。它引入了两个辅助网络来保证分解的有效性理论上表达能力更强但实现更复杂训练也更不稳定。在实际使用中QMIX的稳定性和性能往往更受青睐。策略梯度类COMACOMACounterfactual Multi-Agent Policy Gradients这是基于Actor-Critic的策略梯度算法。每个智能体有自己的策略网络Actor和一个中心化的评论家网络Critic。Critic会评估联合动作的价值并计算一个“反事实基线”Counterfactual Baseline——即评估如果某个智能体采取默认动作而其他智能体动作不变时的价值。这个基线用于计算每个智能体动作的优势函数从而更新其策略网络。COMA直接优化策略在处理高维或连续动作空间时可能有优势。独立学习类IQLIQLIndependent Q-Learning作为基线方法它把其他智能体视为环境的一部分每个智能体独立学习自己的Q函数。这显然不是真正的协作算法但常用来对比凸显协作算法的必要性。在PyMARL中每个算法都对应一个Learner类如QMIXLearner和一套特定的网络模块。阅读这些Learner的train方法是理解算法更新细节的最佳途径。2.3 环境接口SMAC的集成与使用SMAC环境是PyMARL的“主战场”。集成过程主要涉及几个方面环境安装这是一个经典的踩坑点。SMAC依赖于特定版本的星际争霸II游戏本体SC2和PySC2库。你需要先下载SC2游戏文件暴雪提供免费地图包并设置正确的环境变量SC2PATH指向其路径。PyMARL的envs目录下通常有starcraft2子目录里面封装了与SMAC环境的交互逻辑。观察与动作空间SMAC为每个单位智能体提供了局部观察如视野内的敌人、盟友血量、地形等和一组可执行的动作如移动、攻击、停止、释放技能等。PyMARL的Controller需要将这些原始观察编码成神经网络输入并将网络输出的动作ID解码为SMAC能执行的动作。状态信息除了局部观察算法如QMIX的混合网络还需要全局状态信息。SMAC提供了state向量包含所有单位的完整信息即使不在视野内这仅在训练时可用完美契合CTDE范式。奖励与终止SMAC环境的奖励通常是稀疏的比如在击败所有敌方单位时获得正奖励己方单位全部死亡时获得负奖励并结束episode。有些地图也有形奖励如每一步的时间惩罚。PyMARL的Runner会处理这些信号并计算每一步用于更新的折扣回报。注意SMAC环境的运行对机器性能有一定要求尤其是单位数量多的地图如3s5z_vs_3s6z。确保你有足够的CPU核心和内存。在Linux系统上运行通常比Windows更稳定。3. 从零开始环境搭建与第一个训练实验理论说了这么多不如动手跑一个。这里我以在Linux系统上使用conda环境为例带你走通全流程。假设我们的目标是使用QMIX算法在SMAC的简单地图3m3个海军陆战队对战3个海军陆战队上进行训练。3.1 基础环境与依赖安装第一步是搭建一个干净的Python环境避免包冲突。# 1. 创建并激活conda环境假设使用Python 3.8这是一个兼容性较好的版本 conda create -n pymarl python3.8 -y conda activate pymarl # 2. 安装PyTorch。请根据你的CUDA版本去PyTorch官网选择对应命令。 # 例如对于CUDA 11.3 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 如果没有GPU安装CPU版本 # pip install torch1.12.1 torchvision0.13.1 torchaudio0.12.1 # 3. 克隆PyMARL仓库这里以GitHub上的一个流行复现版本为例原牛津版本可能已归档 git clone https://github.com/xxx/pymarl2.git # 请替换为当前活跃的仓库地址 cd pymarl2为什么选择PyTorch 1.12左右版本因为SMAC和早期PyMARL基于的PySC2等库对新版本PyTorch的兼容性测试可能不足。选择一个经过社区验证的稳定版本能避开很多不必要的麻烦。这也是从无数“安装失败”帖子中总结出的经验。3.2 SMAC游戏环境安装这是最关键也最容易出错的一步。# 1. 安装SMAC pip install githttps://github.com/oxwhirl/smac.git # 或者 pip install smac # 2. 下载星际争霸II游戏本体和地图。 # 前往 https://github.com/Blizzard/s2client-proto#downloads 获取Linux包如SC2.4.10.zip。 # 解压到某个目录例如 /home/yourname/StarCraftII/ wget https://github.com/Blizzard/s2client-proto/releases/download/v4.10.0/SC2.4.10.zip unzip SC2.4.10.zip -d /home/yourname/StarCraftII/ # 3. 下载SMAC专用地图包。 # 从 https://github.com/oxwhirl/smac/releases 下载 SMAC_Maps.zip wget https://github.com/oxwhirl/smac/releases/download/v0.1-beta1/SMAC_Maps.zip unzip SMAC_Maps.zip # 将解压出的 SMAC_Maps 文件夹移动到游戏本体的 Maps 目录下。 mv SMAC_Maps /home/yourname/StarCraftII/Maps/ # 4. 设置环境变量让SMAC知道游戏在哪。 echo export SC2PATH/home/yourname/StarCraftII ~/.bashrc source ~/.bashrc踩坑实录地图路径不对是最常见的问题。确保SC2PATH/Maps/目录下存在SMAC_Maps文件夹并且里面是.SC2Map文件。你可以通过运行一个简单的Python脚本来测试from smac.env import StarCraft2Env env StarCraft2Env(map_name3m) env.close() print(SMAC环境测试成功)如果报错找不到地图请仔细检查路径。另外首次运行会启动SC2游戏进程可能会比较慢。3.3 安装PyMARL依赖并测试# 在PyMARL项目根目录下 pip install -r requirements.txt # requirements.txt通常包含numpy, matplotlib, sacred, omegaconf等现在你可以尝试运行一个简单的训练命令了。PyMARL通常使用python3 src/main.py加参数的方式启动但更规范的是使用其配置文件。# 查看配置文件目录 ls config/algs/ # 这里存放算法配置如qmix.yaml ls config/envs/ # 这里存放环境配置如sc2.yaml # 运行一个最简单的测试训练可能需要在src目录下 python3 src/main.py --configqmix --env-configsc2 with env_args.map_name3m参数解析--configqmix指定使用config/algs/qmix.yaml中的算法配置。--env-configsc2指定使用config/envs/sc2.yaml中的环境配置。with env_args.map_name3m覆盖环境配置中的map_name参数指定训练地图为3m。如果一切顺利你会看到终端开始输出训练信息包括episode回报、损失值等。首次运行会下载一些必要的资源并启动SC2进程请耐心等待。4. 深度配置解析与算法调优实战能跑起来只是第一步要想得到好结果或者进行自己的研究必须深入理解配置文件。PyMARL的强大之处就在于其高度可配置性。4.1 核心配置文件解剖以qmix.yaml为例我们看几个关键部分# config/algs/qmix.yaml --- name: qmix # 算法名 env: sc2 # 默认环境 # --- 神经网络相关 --- agent: rnn # 智能体网络类型可选rnn, cnn等 rnn_hidden_dim: 64 # RNN隐藏层维度 qmix_hidden_dim: 32 # QMIX混合网络隐藏层维度 # --- 训练超参数 --- batch_size: 32 # 从回放缓冲区采样的批次大小 buffer_size: 5000 # 回放缓冲区大小episode数 lr: 0.0005 # 学习率 gamma: 0.99 # 折扣因子 # --- 探索策略 --- epsilon_start: 1.0 epsilon_finish: 0.05 epsilon_anneal_time: 50000 # 探索率从1.0衰减到0.05所需的时间步 # --- 实验设置 --- test_nepisode: 32 # 每次测试运行的episode数 test_interval: 2000 # 每多少训练步测试一次 log_interval: 2000 # 每多少训练步记录一次日志 runner: episode # 运行器类型按episode运行环境配置sc2.yaml同样重要# config/envs/sc2.yaml --- env_args: map_name: 3m # 默认地图 difficulty: 7 # 游戏难度1-107VeryHard seed: null # 随机种子 replay_dir: # 录像保存路径 replay_prefix: # 录像前缀 state_last_action: False # 状态是否包含上一时刻动作 obs_last_action: False # 观察是否包含上一时刻动作 obs_timestep_number: False # 观察是否包含时间步 obs_agent_id: True # 观察是否包含智能体IDone-hot编码4.2 关键超参数调优经验调参是多智能体强化学习的“玄学”也是科学。以下是我在多次实验中总结的一些经验buffer_size与batch_size问题SMAC环境奖励稀疏一个成功的episode赢包含大量步数。如果buffer_size太小好的经验最终胜利的轨迹很快会被覆盖模型学不到。建议对于中等复杂度地图如2s3zbuffer_size至少设为5000episode数。batch_size通常设为32或64。可以尝试batch_size_run并行环境数为8这样收集经验更快。原理更大的缓冲区能保留更多样化的策略经验尤其是那些导致胜利的“长策略链”有助于稳定训练。epsilon_anneal_time探索衰减时间问题探索衰减太快智能体容易过早陷入局部最优比如所有单位挤在一起衰减太慢学习效率低下。建议这是一个需要仔细调整的参数。对于简单地图3m50000步可能足够。对于复杂地图如corridor需要微操集火可能需要100000甚至更多步。一个实用的技巧观察训练曲线如果测试胜率在达到一个平台期后突然下降可能是探索不足导致过拟合需要增加epsilon_anneal_time或提高epsilon_finish如从0.05调到0.1。lr学习率与优化器PyMARL默认使用RMSprop优化器。对于QMIX学习率lr0.0005是一个不错的起点。如果训练不稳定损失剧烈震荡尝试降低到0.0001。也可以尝试使用Adam优化器有时在复杂任务上收敛更快但需要调整lr如0.001并注意可能的不稳定。修改优化器这通常需要修改src/learners/qmix_learner.py中的__init__方法将self.optimiser RMSprop(...)改为self.optimiser torch.optim.Adam(...)。这是一个进阶操作。agent网络结构rnn_hidden_dim个体RNN的隐藏层大小决定了智能体记忆历史信息的能力。对于需要记忆对手位置或技能冷却的地图增大此值如从64到128可能有益。qmix_hidden_dim混合网络的隐藏层大小影响联合价值函数的表达能力。通常保持比rnn_hidden_dim小或相等即可。4.3 如何设计并运行自己的实验假设你想比较QMIX和VDN在2s3z地图上的性能复制并修改配置cp config/algs/qmix.yaml config/algs/my_qmix_2s3z.yaml cp config/algs/vdn.yaml config/algs/my_vdn_2s3z.yaml在两个新文件中你可以调整超参数比如针对2s3z2个追猎者3个狂热者将buffer_size增加到8000。使用脚本批量运行 创建一个脚本run_experiments.sh#!/bin/bash # 实验1: QMIX on 2s3z python3 src/main.py --configmy_qmix_2s3z --env-configsc2 with env_args.map_name2s3z seed42 tagqmix_2s3z_exp1 # 实验2: VDN on 2s3z python3 src/main.py --configmy_vdn_2s3z --env-configsc2 with env_args.map_name2s3z seed42 tagvdn_2s3z_exp1seed用于固定随机种子确保实验可复现。tag用于在结果目录中标识本次实验。结果分析与可视化 PyMARL使用sacred框架管理实验结果默认保存在./results目录下每个实验一个子文件夹里面有config.json、metrics.json和model.pt等文件。 你可以编写Python脚本使用pandas和matplotlib读取多个metrics.json文件绘制平均测试胜率随训练步数的变化曲线进行直观对比。5. 常见问题排查与Debug指南即使按照步骤操作也难免会遇到各种问题。这里汇总一些高频坑点和排查思路。5.1 环境与安装类问题问题1运行时报错ModuleNotFoundError: No module named smac或pymarl内部模块找不到。原因Python路径问题。你可能在错误的目录下运行或者没有安装依赖。解决确保在项目根目录下运行或者将项目路径添加到PYTHONPATHexport PYTHONPATH/path/to/pymarl:$PYTHONPATH。确认已激活正确的conda环境并且用pip install -e .开发模式安装或pip install -r requirements.txt安装了所有依赖。问题2SMAC环境启动失败报错关于地图文件找不到。原因SC2PATH环境变量设置错误或地图文件放置位置不对。解决echo $SC2PATH检查变量是否正确指向SC2游戏根目录。检查$SC2PATH/Maps/下是否有SMAC_Maps文件夹且里面有.SC2Map文件。尝试在代码中硬编码路径不推荐长期使用import os os.environ[SC2PATH] /home/yourname/StarCraftII问题3训练时GPU内存溢出OOM。原因batch_size太大或RNN序列长度即episode最大步数t_max太长。解决首先减小batch_size如从32减到16。在配置中调整runner的t_max参数如果可配置限制单个episode的最大步数。也可以在SMAC环境初始化时设置step_mul每步游戏帧数来间接控制。检查模型参数规模特别是rnn_hidden_dim和qmix_hidden_dim适当调小。5.2 训练过程类问题问题4训练损失loss不下降或者测试胜率始终为0。排查步骤检查奖励信号在src/runners/episode_runner.py的run()函数中添加日志打印每个episode的原始奖励。确认环境确实在给出正确的奖励胜利时为正失败时为负。SMAC的默认奖励是稀疏的可能很长时间都是0。检查探索确认epsilon_start和epsilon_anneal_time设置合理。在训练初期智能体应该以高随机率接近1.0探索。你可以打印出每一步的epsilon值来确认它在衰减。检查网络更新在Learner的train方法中打印出损失值和梯度范数。如果损失一直是0或梯度范数极小可能是网络没有正确更新检查优化器和学习率。简化问题换到最简单的地图3m并大幅减少epsilon_anneal_time如1000步看能否快速学到一点策略比如靠近敌人。如果还是不行可能是代码或环境根本性错误。问题5训练后期测试胜率波动巨大或突然崩溃。原因过拟合或探索不足。智能体学到了一个在训练轨迹上表现很好但泛化能力差的策略或者探索率降为0后无法跳出局部最优。解决增加buffer_size让回放缓冲区包含更多样化的经验。提高最终的epsilon_finish如从0.05到0.1保留一点持续探索的能力。使用策略正则化技术如在损失函数中加入策略熵Entropy鼓励项这需要修改算法代码对于QMIX这类值函数方法不是标准操作但在Actor-Critic如COMA中常见。5.3 算法实现相关疑惑问题6QMIX的“单调性”约束到底是怎么实现的解答这是QMIX算法的精髓。在代码src/modules/mixers/qmix.py中混合网络QMixer的所有权重w1,w2和偏置b1,b2都是由超网络HyperNetwork生成的。关键点在于这些权重在生成后会通过一个绝对值函数abs或指数函数exp确保其为非负。这样混合网络对每个个体Q值的偏导数就是非负的因为权重非负激活函数Elu/ReLU的导数也非负从而保证了Q_tot关于每个Q_i是单调递增的。你可以仔细查看forward函数中权重的处理部分。问题7如何修改网络结构比如给智能体网络增加注意力机制操作路径在src/modules/agents/下找到对应的智能体网络类如RNNAgent。修改其__init__和forward方法加入注意力层。在src/controllers/下的控制器中确保正确调用了修改后的智能体网络。在配置文件中可能需要增加新的网络结构参数。这是一个高级修改需要对PyTorch和MARL有较深理解。建议先在一个简单自定义环境上测试新网络的有效性。6. 超越默认设置自定义环境与算法拓展PyMARL不仅是一个实验复现工具更是一个可以扩展的研究平台。6.1 集成新的自定义多智能体环境假设你有一个自己的多智能体环境例如一个多机器人网格世界想用PyMARL来训练。你需要确保你的环境遵循与SMAC类似的接口。核心是实现以下方法模仿smac.env中的StarCraft2Env类class MyCustomEnv: def __init__(self, **kwargs): self.n_agents 4 # 智能体数量 self.n_actions 5 # 每个智能体的离散动作数 self.episode_limit 100 # 每个episode最大步长 # ... 其他初始化 def reset(self): # 重置环境返回所有智能体的初始观察和全局状态 observations [...] # 列表长度为n_agents state [...] # 全局状态向量 return observations, state def step(self, actions): # actions: 列表长度为n_agents每个元素是动作ID # 执行动作返回 # reward: 浮点数全局奖励 # terminated: 布尔值episode是否结束 # info: 字典包含额外信息 reward, terminated, info ... observations [...] # 新的观察列表 state [...] # 新的全局状态 available_actions [...] # 每个智能体可执行动作的掩码可选但推荐 return reward, terminated, info, observations, state, available_actions def get_obs(self): # 获取当前所有智能体的观察与step返回的observations一致 return [...] def get_state(self): # 获取当前全局状态 return [...] def get_avail_actions(self): # 获取每个智能体可执行动作的掩码可选 return [...]然后你需要在PyMARL中注册这个环境。通常是在src/envs/__init__.py或src/main.py中修改环境注册的字典将你的环境类添加进去并创建一个对应的环境配置文件如myenv.yaml。6.2 实现一个新的多智能体强化学习算法如果你想在PyMARL中实现一篇新论文的算法步骤更清晰确定算法类别是值分解类如QMIX变体还是策略梯度类如COMA变体这决定了你继承哪个基类。创建新的Learner在src/learners/下新建一个文件例如my_algorithm_learner.py。参考qmix_learner.py或coma_learner.py。继承BaseLearner或对应的父类。实现__init__方法初始化算法特有的网络模块、优化器。实现train方法这是核心包含从batch数据中计算损失和反向传播的逻辑。实现_update_targets方法如果需要目标网络。创建新的网络模块在src/modules/下根据算法需要创建新的混合器Mixer、评论家Critic或智能体网络Agent。注册算法在src/learners/__init__.py中导入你的新Learner并添加到learner_registry字典中。创建配置文件在config/algs/下创建my_algorithm.yaml定义所有超参数。修改Controller如果需要如果算法的动作选择逻辑与现有算法不同例如需要采样而不是argmax可能还需要修改或新建对应的Controller。这个过程要求你对PyTorch和强化学习有扎实的功底。最好的学习方式就是仔细阅读QMIX或COMA的现有实现理解每一行代码的作用。7. 实验管理、结果记录与可视化有效的实验管理能极大提升研究效率。PyMARL默认使用sacred框架但你可能需要更强大的工具。使用Tensorboard进行实时监控虽然PyMARL默认输出文本日志和metrics.json但实时可视化更直观。你需要稍微修改代码在Learner的train方法中和Runner的测试环节将标量如loss, win_rate写入Tensorboard。示例在qmix_learner.py的train方法末尾添加if self.args.use_tensorboard: self.logger.add_scalar(loss, loss.item(), self.train_step)然后在src/main.py中初始化Tensorboard的SummaryWriter并通过参数传递下去。这样你就可以在训练时运行tensorboard --logdir ./results来查看曲线了。结果分析与对比训练结束后results文件夹里每个实验都有一个metrics.json文件。你可以用Pandas加载并分析import json, pandas as pd, glob, matplotlib.pyplot as plt data {} for exp_dir in glob.glob(./results/*qmix*): with open(f{exp_dir}/metrics.json, r) as f: data[exp_dir] pd.DataFrame(json.load(f)) # 假设我们对比测试胜率 for name, df in data.items(): plt.plot(df[test_win_rate_mean], labelname) plt.legend() plt.xlabel(Training Steps (x1000)) plt.ylabel(Test Win Rate) plt.title(QMIX on different maps) plt.show()除了胜率还应关注test_return_mean回报、train_loss等指标。模型保存与加载PyMARL会定期保存模型检查点.pt文件。你可以使用以下代码加载模型并进行演示或进一步训练import torch from src.main import _get_config from src.learners import REGISTRY as LEARNER_REGISTRY # 加载配置 config, _ _get_config(qmix, sc2, {map_name: 3m}) # 创建Learner learner LEARNER_REGISTRY[config[name]](...) # 加载权重 checkpoint torch.load(path/to/model.pt) learner.load_state_dict(checkpoint[model_state_dict]) # 现在可以用learner.policy来获取动作了使用PyMARL的过程是一个不断在理论、代码和实践之间循环的过程。理解算法原理能帮你更好地调试代码而代码实践中的现象又会反过来加深你对理论的理解。这个框架就像一座桥梁连接了MARL论文中精美的数学公式和实际运行中充满噪声的训练曲线。当你第一次看到自己训练的智能体在星际争霸II中完成一次漂亮的集火或包抄时那种成就感就是对所有折腾最好的回报。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。