我正在尝试基于我在网上找到的an implementation,在gym-minigrid环境中创建一个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, 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表,让我的代理在环境中学习。这里唯一的缺点是,对于不是空环境的其他环境来说,这会变得更加棘手,比如"MiniGrid-DoorKey-8x8-v0“环境,在这个环境中,我们随机放置了墙、钥匙和门。在这种情况下,我如何获得状态空间,以制作Q表?
发布于 2021-07-03 12:45:40
你可以使用ImgObsWrapper去掉观测值中的“任务”字段,只留下图像字段张量:
from gym_minigrid.wrappers import *
env = gym.make('MiniGrid-Empty-8x8-v0')
env = ImgObsWrapper(env) 使用这个新的env,您可以简单地运行:
obs, reward, done, info = env.step(action)https://stackoverflow.com/questions/65668406
复制相似问题