如何恢复健身房环境之前的状态

How to restore previous state to gym environment

我正在尝试在 Openai 的 atari gym 环境中实施 MCTS,这需要计划能力:在环境中行动并将其恢复到以前的状态。我读到这可以用游戏的 ram 版本来完成:

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

正在将环境恢复到快照中记录的特定状态: env.ale.restoreState(snapshot)

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

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'))

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

如果有人开始使用 ale 并记录这些状态,我将非常感谢您帮助我找出我做错了什么。谢谢!

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