как ретро-игра openai gym получит награду - PullRequest
0 голосов
/ 23 марта 2019

Я установил Gym Retro Mario Game.Я работаю в интерактивном режиме и вижу, что награда печатается на каждом шагу, который я делаю вручную.Хотите знать, как рассчитывается эта награда.Если кто-то может указать на любой py-файл (местоположение, строка №), это было бы замечательно.

Прошел предыдущие аналогичные вопросы и прошел через код retro_env.py.Не удалось найти код Марио Степа и Награды

Когда я вернулся, я достиг файла 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()

Эта функция вызывает current_reward () из GameDataGlue под ретро._retro.Однако в пакетах сайта нет папки _retro.Не уверен, как рассчитывается current_reward

Я должен понимать, как рассчитывается Марио.Тогда я смогу применить к другим играм или даже к моей собственной среде

1 Ответ

0 голосов
/ 23 марта 2019

Я разобрался с ответом. script.json в 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, это будетбольшой)

...