openai gym 复古游戏是如何获奖的
how openai gym retro game gets award
我已经安装了 Gym Retro Mario Game。我 运行 处于交互模式,可以看到奖励打印在我手动进行的每一步操作上。想知道这个奖项是如何计算的。如果有人可以指向任何 py 文件(位置,行号)那就太好了。
完成了之前的类似问题并完成了代码 retro_env.py。找不到 Mario Step and Reward 的代码
当我原路返回时,我到达了文件retro_env.py。下面是应该 return 奖励的步骤函数:
def step(self, a):
if self.img is None and self.ram is None:
raise RuntimeError('Please call env.reset() before env.step()')
for p, ap in enumerate(self.action_to_array(a)):
if self.movie:
for i in range(self.num_buttons):
self.movie.set_key(i, ap[i], p)
self.em.set_button_mask(ap, p)
if self.movie:
self.movie.step()
self.em.step()
self.data.update_ram()
ob = self._update_obs()
rew, done, info = self.compute_step()
return ob, rew, bool(done), dict(info)
但是它正在调用 self.compute_step(),即:
def compute_step(self):
if self.players > 1:
reward = [self.data.current_reward(p) for p in range(self.players)]
else:
reward = self.data.current_reward()
done = self.data.is_done()
return reward, done, self.data.lookup_all()
此函数调用 retro._retro 下的 GameDataGlue 的 current_reward()。但是,站点包中没有 _retro 文件夹。不确定 current_reward 是如何计算出来的
我应该能够理解马里奥奖励是如何计算的。然后我就可以应用到其他游戏甚至我自己的自定义环境
我找到了答案。 scenario.json in Lib\site-packages\retro\data\stable\SuperMarioBros-Nes 包含奖励计算。例如,原始条目是:
"reward": {
"variables": {
"xscrollLo": {
"reward": 1
}
}
因此,当马里奥向右移动时,奖励分数会更新,但取金币分数不会更新。
我是这样制作的:
"reward": {
"variables": {
"xscrollLo": {
"reward": 2
},
"coins": {
"reward": 1
}
}
现在,当我开始拿硬币时,我的分数开始增加。以下示例输出:
steps=6720 episode_steps=6720 episode_returns_delta=80.0 episode_returns=3959.0
steps=6780 episode_steps=6780 episode_returns_delta=1.0 episode_returns=3960.0
steps=6840 episode_steps=6840 episode_returns_delta=1.0 episode_returns=3961.0
这里每增加1点,因为我在这一步拿了1个硬币。
(如果有人能给出_retro.pyd的代码就好了)
我已经安装了 Gym Retro Mario Game。我 运行 处于交互模式,可以看到奖励打印在我手动进行的每一步操作上。想知道这个奖项是如何计算的。如果有人可以指向任何 py 文件(位置,行号)那就太好了。
完成了之前的类似问题并完成了代码 retro_env.py。找不到 Mario Step and Reward 的代码
当我原路返回时,我到达了文件retro_env.py。下面是应该 return 奖励的步骤函数:
def step(self, a):
if self.img is None and self.ram is None:
raise RuntimeError('Please call env.reset() before env.step()')
for p, ap in enumerate(self.action_to_array(a)):
if self.movie:
for i in range(self.num_buttons):
self.movie.set_key(i, ap[i], p)
self.em.set_button_mask(ap, p)
if self.movie:
self.movie.step()
self.em.step()
self.data.update_ram()
ob = self._update_obs()
rew, done, info = self.compute_step()
return ob, rew, bool(done), dict(info)
但是它正在调用 self.compute_step(),即:
def compute_step(self):
if self.players > 1:
reward = [self.data.current_reward(p) for p in range(self.players)]
else:
reward = self.data.current_reward()
done = self.data.is_done()
return reward, done, self.data.lookup_all()
此函数调用 retro._retro 下的 GameDataGlue 的 current_reward()。但是,站点包中没有 _retro 文件夹。不确定 current_reward 是如何计算出来的
我应该能够理解马里奥奖励是如何计算的。然后我就可以应用到其他游戏甚至我自己的自定义环境
我找到了答案。 scenario.json in Lib\site-packages\retro\data\stable\SuperMarioBros-Nes 包含奖励计算。例如,原始条目是:
"reward": {
"variables": {
"xscrollLo": {
"reward": 1
}
}
因此,当马里奥向右移动时,奖励分数会更新,但取金币分数不会更新。
我是这样制作的:
"reward": {
"variables": {
"xscrollLo": {
"reward": 2
},
"coins": {
"reward": 1
}
}
现在,当我开始拿硬币时,我的分数开始增加。以下示例输出:
steps=6720 episode_steps=6720 episode_returns_delta=80.0 episode_returns=3959.0
steps=6780 episode_steps=6780 episode_returns_delta=1.0 episode_returns=3960.0
steps=6840 episode_steps=6840 episode_returns_delta=1.0 episode_returns=3961.0
这里每增加1点,因为我在这一步拿了1个硬币。
(如果有人能给出_retro.pyd的代码就好了)