【问题标题】:how openai gym retro game gets awardopenai 健身房复古游戏如何获奖
【发布时间】:2019-03-23 19:52:32
【问题描述】:

我已经安装了 Gym Retro Mario 游戏。我在交互模式下运行,可以看到我手动做出的每一个动作都会打印出奖品。想知道这个奖项是如何计算的。如果有人可以指向任何 py 文件(位置,行号),那就太好了。

浏览过之前的类似问题,浏览过代码 retro_env.py。找不到Mario Step and Reward的代码

当我回溯时,我到达了文件 retro_env.py。以下是应该返回奖励的阶梯函数:

    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下GameDataGluecurrent_reward()。但是,站点包中没有 _retro 文件夹。不确定 current_reward 是如何计算的

我应该能够理解马里奥奖励是如何计算的。然后我就可以应用到其他游戏甚至我自己的自定义环境中

【问题讨论】:

  • 发现存在 _retro.pyd 文件。谁能告诉如何获取这个模块的内容/代码。

标签: openai-gym


【解决方案1】:

我想出了答案。 Lib\site-packages\retro\data\stable\SuperMarioBros-Nes 中的 scenario.json 包含奖励计算。例如,原始条目是:

  "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 的代码,那就太好了)

【讨论】:

  • 现在另一个问题出现了.. Retro 如何找到输入键.. 没有 JSON 文件列出游戏可能的输入键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2019-02-05
  • 2019-10-16
  • 2018-03-27
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多