首页 > 解决方案 > 从gym-minigrid中获取状态以进行Q-learning

问题描述

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

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

{'image': array([[[2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0]],

   [[2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0]],

   [[2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0],
    [2, 5, 0]],

   [[2, 5, 0],
    [2, 5, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0]],

   [[2, 5, 0],
    [2, 5, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0]],

   [[2, 5, 0],
    [2, 5, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0]],

   [[2, 5, 0],
    [2, 5, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 0],
    [1, 0, 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-table 让我的代理在环境中学习。这里唯一的缺点是,这对于不是空环境的其他环境变得更加棘手,比如“MiniGrid-DoorKey-8x8-v0”环境,我们在其中随机放置了墙、钥匙和门。在那种情况下,我将如何获取状态空间来制作我的 Q 表?

标签: pythonopenai-gymq-learning

解决方案


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

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

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

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

推荐阅读