我在 OpenAI 的健身房中编写了代码来模拟 Montezuma's Revenge 中的随机游戏,其中代理从动作空间中随机采样动作并尝试玩游戏。对我而言,成功定义为代理至少能够成功检索密钥(获得 100 的奖励)的情况。这种情况我转储到一个泡菜文件中。当我让它运行一天左右时,我得到了 44 个成功的案例。这是我用来生成训练集的代码:
import numpy
import gym
import cma
import random
import time
import pickle as pkl
env = gym.make('MontezumaRevenge-ram-v0')
observation = env.reset()
#print(observation)
#print(env.action_space.sample())
obs_dict = []
action_dict = []
success_ctr = 0
for i in range(0, 1000000):
print('Reward for episode',i+1)
done = False
rew = 0
action_list = []
obs_list = []
while not done:
action = env.action_space.sample()
observation, reward, done, _ = env.step(action)
action_list.append(action)
obs_list.append(observation)
rew += reward
env.render()
time.sleep(0.01)
if done:
env.reset()
if rew > 0:
success_ctr += 1
print(action_list)
action_dict.append(action_list)
obs_dict.append(obs_list)
pkl.dump(obs_dict, open("obslist.pkl", "wb"))
pkl.dump(action_dict, open("action.pkl", "wb"))
print(rew)
time.sleep(1)
try:
print(obs_dict.shape)
except:
pass
print("Took key:", success_ctr)
我从生成的 pickle 文件中加载了成功案例,并使用这些完全相同的案例模拟了代理的播放。但是,代理从来没有收到 100 的奖励。我不明白为什么会这样。在网上搜索了一下,这可能是因为游戏中的噪音。所以,在运行每一集之前,我给了一个睡眠时间。不过,还是不行。有人可以解释为什么会这样吗?并建议一种我可以用来生成训练集的方法?