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

问题描述 投票:0回答:1

我试图在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和记录这些状态,我真的很感激帮助我找出我做错了什么。谢谢!我正在努力实现MCTS的功能。

deep-learning reinforcement-learning openai-gym monte-carlo-tree-search
1个回答
0
投票

对于以后遇到这个问题的人。雅达利体育馆的街机学习环境(ale)有一个bug. 这个bug在用C语言写的原始代码中,从快照中恢复原始状态会把整个状态改回原来的状态,而没有改回观察的图片或ram。不过,如果你在恢复上一个状态后再做一个动作,你会得到下一个有正确图片和ram的状态。所以基本上,如果你不需要从游戏中画出图像,或者保存特定状态的ram,你可以毫无问题地玩还原。如果你确实需要看到当前状态的图像或内存,以用于学习算法,那么这就是一个问题。你需要在克隆时保存并记住正确的图像,并在还原状态后使用该保存的图像,而不是使用 restoreState() 函数后从 getScreenRGB() 得到的图像。

© www.soinside.com 2019 - 2024. All rights reserved.