【问题标题】:How to restore previous state to gym environment如何恢复以前的状态到健身房环境
【发布时间】:2020-10-01 16:20:56
【问题描述】:

我正在尝试在 Openai 的 atari 健身房环境中实施 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 并记录这些状态,我将非常感谢帮助我找出我做错了什么。谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢!有完全相同的问题。请问你是怎么知道这个bug的?还有一种方法,比如说,给定一个 atari 游戏中的 4 个动作,为每个动作提取所有可能的奖励,而无需每次都尝试和恢复状态?
    • 我刚刚查看了 env 属性,发现除了 ram 和状态图像外,一切都发生了变化。所以我尝试在恢复快照后再做一步,并意识到它就像恢复了一样工作。我不认为您可以在不实际执行该操作的情况下为该操作提取奖励。最后,健身房环境就是环境。不是环境模型。因此,如果您想知道某些事情,就必须在环境中采取行动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2018-04-30
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多