从健身房迷你网格中获取状态以进行 Q 学习

问题描述

我正在尝试根据我在网上找到的 gym-minigridan implementation 环境中创建 Q-learner。该实现工作得很好,但它使用了普通的 Open AI Gym 环境,该环境可以访问一些不存在的变量,或者不像在健身房迷你网格库中那样以相同的方式呈现。例如,在“Taxi-v3”环境中,我可以使用 env.s 获取当前状态并使用 env.observation_space.n 获取状态空间,但是这两种方法都无法在健身房迷你网格中使用。

这对我来说尤其具有挑战性,因为我不能简单地执行 new_state,reward,done,info = env.step(action) 并使用该 new_state获取 Q 表中的值。例如,使用“MiniGrid-Empty-8x8-v0”环境,执行一个动作的步骤,并打印下一个状态,我得到以下输出

{'image': array([[[2,5,0],[2,0]],[[2,[1,0]]],dtype=uint8),'direction': 0,'mission': 'get to the green goal square'}

如您所见,对于我可以使用并插入到我的 Q 表中的状态,这不是单个值。有什么方法可以将上述内容转换为特定状态的单个值,然后我可以使用它来获取 Q 表中的条目?同样,是否有一种简单的非硬编码方式,我可以使用它来获取状态空间,类似于 env.observation_space.n

我最初想从(位置,方向)变量中创建元组,为每个动作创建一个具有 6 个位置的新条目(字典),由 state_tup = ((tuple(env.agent_pos),env.agent_dir)) 给出,并将它们用作一个字典。有了它,我可以构建一个 Q 表,让我的代理学习环境。这里唯一的缺点是,这对于不是 Empty Environment 的其他环境变得更加棘手,比如“MiniGrid-DoorKey-8x8-v0”环境,我们在其中随机放置了墙壁、钥匙和门。在这种情况下,我将如何获取状态空间来制作我的 Q 表?

解决方法

您可以使用 ImgObsWrapper 摆脱观察中的“任务”场,只留下图像场张量:

from gym_minigrid.wrappers import *
env = gym.make('MiniGrid-Empty-8x8-v0')
env = ImgObsWrapper(env) 

使用这个新环境,您可以简单地运行:

obs,reward,done,info = env.step(action)