Обучение Змеи есть пищу за определенное количество шагов c, используя обучение Усилению - PullRequest
0 голосов
/ 02 мая 2020

В эти дни я пробую свои силы в изучении подкрепления / глубокого обучения. И я начал с основной игры «Снейк». С помощью этой статьи: https://towardsdatascience.com/how-to-teach-an-ai-to-play-games-deep-reinforcement-learning-28f9b920440a, которую я успешно обучил есть пищу. Теперь я хочу, чтобы он ел еду с указанием c числа шагов, скажем «20», не больше, не меньше. Как изменится система вознаграждений и Политика для этого? Я перепробовал много вещей, практически безрезультатно. Например я попробовал это:

 def set_reward(self, player, crash):
    self.reward = 0
    if crash:
        self.reward = -10
        return self.reward
    if player.eaten:
        self.reward = 20-abs(player.steps - 20)-player.penalty
        if (player.steps == 10):
            self.reward += 10 #-abs(player.steps - 20)
        else:
            player.penalty+=1
            print("Penalty:",player.penalty)

Спасибо. Вот программа: https://github.com/maurock/snake-ga

1 Ответ

1 голос
/ 02 мая 2020

Я бы предположил, что этот подход проблематичен c, потому что, несмотря на изменение функции вознаграждения, вы не включили количество шагов в пространство наблюдения. Агенту нужна эта информация в пространстве наблюдения, чтобы иметь возможность различать, в какой момент он должен врезаться в цель. На самом деле, если ваш агент находится рядом с целью и все, что ему нужно сделать, это повернуть направо, но пока все, что он сделал, - это пять ходов, это точно такое же наблюдение, как если бы он сделал 19 ходов. Дело в том, что вы не можете кормить агента в одном и том же состоянии и ожидать, что он будет выполнять другие действия, потому что агент не видит вашу функцию вознаграждения, он получает вознаграждение только на основе состояния. Поэтому вы противоречите действиям.

Подумайте, когда вы приступите к тестированию производительности агентов. Больше нет награды. Все, что вы делаете, передаете сеть в состояние, и вы ожидаете, что она выберет различные действия для одного и того же состояния.

Я предполагаю, что ваше пространство состояний - это некий 2D-массив. Должно быть просто изменить код, чтобы он содержал количество шагов в пространстве состояний. Тогда функция вознаграждения будет выглядеть примерно так, если наблюдение [num_steps] = 20: вознаграждение = 10. Спросите, нужна ли вам дополнительная помощь для ее кодирования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...