Как сохранить объекты Gamestate в Python?
Мы делаем алгоритм обучения с подкреплением для нашего класса. И в этом прогрессе мы хотим сделать сохранение для nes-игры, которая сделана с использованием пакета gym-retro. Мы пробовали использовать 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)
1 ответ
Я думаю, что я немного опоздал и не знаю, будет ли это полезно для вас, но для всех, кто сталкивается с той же проблемой, вот мое решение.
Для сохранения вашего состояния вам нужно будет импортировать библиотеку 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 (от кого я основывался)