1

我们正在为我们的班级制作强化学习算法。在这个过程中,我们希望为使用 gym-retro 包制作的 nes-game 创建一个保存状态。我们尝试使用 pickle 来保存游戏环境,但它不会 pickle gamedate 对象。

TypeError: can't pickle GameData objects

有什么方法可以保存我们不知道的游戏状态吗?这是我们使用的代码的一部分:

def SaveEnv(self, env, level):
    self.env[level] = open('store.pckl', 'wb')
    envDict = {}
    envDict[level] = env
    pk.dump(envDict, self.env[level])
    self.env[level].close()
    print("Save Successful")    

env = retro.make(game='TinyToonAdventures-Nes')
env.reset()
SaveEnv(env,level)
4

1 回答 1

0

我认为我有点晚了,不知道它是否对您有用,但是,对于遇到相同问题的任何人,这是我的解决方案。

为了保存您的状态,您需要导入gzip库,并在模拟中(当您处于所需状态时),执行以下操作:

content = env.em.get_state()
with gzip.open("the_saved_state.state", 'wb') as f:
    f.write(content)

现在,加载:

f = gzip.open('the_saved_state.state','rb')
file_content = f.read()
f.close()
env.em.set_state(file_content)

此外,我想感谢这个家伙:https ://github.com/openai/retro/issues/235 (我基于此)

于 2021-09-29T11:56:39.237 回答