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