Глубокое обучение с подкреплением с помощью Python | Часть 1 | Создание окружающей среды

В этой серии руководств мы рассмотрим каждый этап создания опытного агента обучения с подкреплением (RL), способного играть в игры.

Эта серия разделена на три части:

  • Часть 1: проектирование и создание игровой среды. В этой части мы создадим игровую среду и настроим ее, чтобы агент RL мог на ней тренироваться.
  • Часть 2: создание и обучение нейронной сети Deep Q (DQN). В этой части мы определяем и строим различные уровни DQN и обучаем их.


Мы также можем попробовать создать другую простую игровую среду и использовать Q-Learning для создания агента, который сможет играть в эту простую игру.

Мотивация:

Однажды я был в кроличьей норе YouTube и мне порекомендовали ЭТО ВИДЕО, оно касалось самоощущения у человеческих младенцев, после просмотра видео мне в голову пришел похожий вопрос Могу ли я разработать умного агента, который будет достаточно умен, чтобы чувствовать свое тело, и способен изменять свои функции для выполнения определенной задачи?

Эта серия статей - мой способ ответить на этот вопрос.

Проектирование окружающей среды:

В этой среде мы хотим, чтобы агент развил чувство своего тела и то, как изменить его особенности, чтобы не проиграть игру.

Во-первых: элементы окружающей среды:

1- Поле содержит все остальные элементы. Мы представляем его в коде классом с именем «Поле» следующим образом:

Атрибуты поля:

  • width (int) : ширина поля (не в пикселях).
  • height (int: высота поля (не в пикселях)
  • body (np.array) : содержит представление массива игровых элементов (игрока и стен). Этот массив передается в DQN и также используется для рисования интерфейса с помощью pygame.

Field методы:

  • update_field (сам, стены, игрок): обновляет поле.

2- Стены:

Атрибуты стены:

Методы стены:

  • create_hole (self): создает отверстие в стене, ширина которого равна собственной ширине. hole_width.
  • move (self): перемещает стену по вертикали (при каждом вызове стена перемещается на n шагов вниз (n = self.speed)).

3- Игрок:

Атрибуты игрока:

Методы Player:

  • move (self, field, direction = 0): перемещает игрока:

- direction = 0 - ›Без изменений

- direction = 1 - ›влево

- direction = 2 - ›вправо

  • change_width (self, action = 0):

- action = 0 - ›Без изменений

- action = 3 - ›сузить на одну единицу

- action = 4 - ›увеличить на одну единицу

Класс Environment:

Этот класс облегчает связь между средой и агентом, он предназначен для использования с агентом RL или с игроком-человеком.

Основные компоненты, необходимые агенту RL:

1- Атрибут ENVIRONMENT_SHAPE: используется DQN для установки формы входного слоя.

Атрибут 2- ACTION_SPACE: используется DQN для установки формы выходного слоя.

3- НАКАЗАНИЕ и НАГРАДА: установите значения как наказания, так и вознаграждения, используемых для обучения агента (мы используем эти значения, чтобы сообщить агенту, были ли его предыдущие действия хорошими или плохими). ​​

4- Метод сброса: для сброса среды.

5- шаг: принимает действие в качестве аргумента и возвращает следующее состояние, вознаграждение, логическая переменная с именем game_over, которая сообщает нам, закончилась игра (игрок проиграл) или нет.

Понятно, что эта среда ничем не отличается, она включает в себя все необходимые компоненты и многое другое.

Атрибуты среды:

Методы Environment:

  • __init__ (self): инициализирует среду, инициализируя некоторые атрибуты и вызывая метод reset.
  • сброс (самостоятельно): сбрасывает среду и возвращает состояние игрового поля после его сброса.
  • print_text (self, WINDOW = None, text_cords = (0,0), center = False, text = «», color = (0,0,0), size = 32): печатает текст в заданном pygame.display (WINDOW) с заданными функциями.

+ шаг (собственное действие, действие):

1- Вызовите метод перемещения игрока, чтобы переместить игрока.

2- Вызовите метод change_width игрока, чтобы переместить игрока.

3- Переместите стену на один шаг.

4- Обновите поле.

5- Проверьте, успешно ли игрок прошел стену. Если да, дает игроку награду и увеличивает его выносливость.

6- Отметьте три условия проигрыша: игрок проигрывает, если выполнено хотя бы одно из этих трех условий.

когда игрок проигрывает, значение возвращаемой награды будет равно НАКАЗАНИЕ, а индикатор состояния игры (game_over ) изменяется с false на true.

7- Проверьте, попадает ли текущая стена в нижнюю часть поля, когда это происходит, стена вне диапазона заменяется новой стеной.

8- Возврат next_state normalized, reward, game_over

+ render (self, WINDOW = None, human = False):

Аргументы:

  • WINDOW (pygame.display): pygame.display, на котором будет отображаться игра.
  • human (bool): если в игру будет играть человек, этот аргумент имеет значение True, в этом случае pygame перехватывает нажатые клавиши клавиатуры, чтобы получить действие, которое будет выполнено. .

Объяснение метода render построчно:

1- Проверьте, является ли игрок человеком. Если это так, возьмите нажатую клавишу и преобразуйте ее в соответствующее действие (например, если нажата стрелка вправо, установите действие = 2, что означает перемещение игрока на шаг вправо), затем вызовите step для выполнения выбранного действия.

2- Обновите поле, затем начните рисовать стены и игрока в виде блоков.

3- Выведите счет и выносливость игрока.

4- Наконец, обновите дисплей, чтобы отобразить отображаемый экран.

Наконец: соберите все вместе

Теперь мы воспользуемся всем, что мы объяснили, и сыграем в игру:

Следующий код повторяет игру до тех пор, пока игрок не выиграет, набрав более или равный Win_score,, или не выйдет из игры.

Вы можете получить полный код ЗДЕСЬ.





Вы можете подписаться на меня в Twitter @ModMaamari

Вам также может понравиться: