如何将以前的状态还原到健身房环境

时间:2020-06-11 22:00:43

标签: deep-learning reinforcement-learning openai-gym monte-carlo-tree-search

我正在尝试在Openai的atari健身房环境中实施MCTS,这需要计划能力:在环境中行动并将其还原到以前的状态。我读到这可以通过游戏的ram版本完成:

在快照中记录当前状态: snapshot = env.ale.cloneState()

将环境还原到快照中记录的特定状态: env.ale.restoreState(snapshot)

所以我尝试使用突破的ram版本:

env = gym.make("Breakout-ram-v0")
env.reset()

print("initial_state:")
plt.imshow(env.render('rgb_array'))
env.close()

# create first snapshot
snap0 = env.ale.cloneState()

执行上面的代码将显示游戏开始的图像。我们用snap0记录了第一个状态。现在让我们玩到最后:

while True:
    #is_done = env.ale.act(env.action_space.sample())[2]
    r = env.ale.act(env.action_space.sample())
    is_done = env.ale.game_over()
    if is_done:
        print("Whoops! We died!")
        break

print("final state:")
plt.imshow(env.render('rgb_array'))

执行上面的代码,显示游戏结束的图像。 现在让我们再次将第一个状态加载到环境中:

env.ale.restoreState(snap0)
print("\n\nAfter loading snapshot")
plt.imshow(env.render('rgb_array'))

它没有显示游戏开始时的图像,而是显示了游戏结束时的相同图像。即使我加载了原始的第一个状态,环境也不会还原。

如果有人开始研究啤酒并记录这种状态,我将非常感谢您提供帮助以弄清我在做什么错。谢谢!

1 个答案:

答案 0 :(得分:1)

对于将来遇到此问题的任何人:atari健身房的街机学习环境(销售)中存在错误。该错误存在于用C编写的原始代码中。从快照还原原始状态会将整个状态更改回原始状态,而无需返回到观察图片或ram。但是,如果您在恢复上一个状态后又执行其他操作,则会获得具有正确图像和内存的下一个状态。因此,基本上,如果您不需要从游戏中绘制图像或保存特定状态的内存,则可以毫无问题地进行还原。如果确实需要查看当前状态的图像或内存以用于学习算法,那么这是一个问题。克隆时,您需要保存并记住正确的图像,还原状态后使用该保存的图像,而不是使用restoreState()函数后从getScreenRGB()获取的图像。