基于PettingZoo与SuperSuit的异构观测空间多智能体强化学习问题
多智能体强化学习异构观测空间的帧堆叠解决方案
问题描述
我正尝试构建一个包含两类智能体的多智能体强化学习系统,两类智能体分别拥有不同的观测空间(尺寸各异的图像)与动作空间。我使用PettingZoo和SuperSuit封装自定义Gym环境,以实现向量化与帧跳变逻辑,并基于stable_baseline3实现了自定义PPO算法作为两类智能体的学习算法。环境创建代码如下:
import supersuit as ss from stable_baselines3.common.vec_env.vec_monitor import VecMonitor from pettingzoo.utils.env import ParallelEnv num_envs = 4 num_cpus = 4 env = ParallelEnv() # this line is just to show the dataType of variable env. env = ss.frame_stack_v1(env, 4) env = ss.pettingzoo_env_to_vec_env_v1(env) env = ss.concat_vec_envs_v1(env, num_vec_envs=num_envs, num_cpus=num_cpus, base_class="stable_baselines3") env = VecMonitor(env)
当前核心问题:环境需支持两种不同的动作与观测空间,但PettingZoo和SuperSuit暂不支持该特性。动作空间已通过gym的MultiDiscrete类解决,但观测空间处理受阻——需要对两类观测都应用帧跳变逻辑,尝试用gym.spaces.Dict存储两类智能体的观测空间时,SuperSuit的frame_stack_v1不支持Dict类型空间,导致运行报错。
可行解决思路
- 自定义环境内部帧堆叠逻辑:放弃依赖SuperSuit的
frame_stack_v1,在自定义ParallelEnv的step和reset方法中,为两类智能体分别维护独立的帧缓存缓冲区。每次获取观测时,将当前帧加入对应缓冲区,返回堆叠后的组合帧;重置环境时清空对应缓冲区并填充初始帧,确保每类智能体的帧堆叠逻辑独立运行。 - 扩展SuperSuit支持Dict空间:自定义一个兼容Dict观测空间的帧堆叠Wrapper。继承SuperSuit的基础Wrapper类,重写
observation_space属性,针对Dict内每个子空间单独计算堆叠后的空间维度;在observation方法中,遍历Dict的键值对,对每个子观测单独执行帧堆叠操作,最后返回包含堆叠后子观测的Dict结果。 - 拆分训练流程解耦智能体:将两类智能体的训练流程拆分,为每类智能体单独创建适配其观测空间的子环境,各自应用SuperSuit的帧堆叠与向量化处理。在训练循环中,分别收集两类智能体的经验数据,输入到各自的PPO模型中更新参数;主环境负责同步两类智能体的状态交互,保证全局环境状态的一致性。
内容的提问来源于stack exchange,提问作者assaf caftory
相关产品推荐
相关产品推荐

