Простой искусственный интеллект, который научит автономного динозавра Google Chrome прыгать кактус, используя нейронные сети и простой генетический алгоритм.
Посмотрите это видео, чтобы увидеть его в действии и узнать, как он работает: искусственный интеллект с динозавром от Google.
Установите Node.js
на свой компьютер.
Клонируйте/загрузите эту папку на свой компьютер.
запустите npm install
в этой папке
Откройте игру динозавров в Chrome и отложите терминал (он ДОЛЖЕН быть на том же экране) (Совет: перейдите к инструментам разработчика и в разделе «Сеть» установите режим «офлайн»).
запустить node index
в этой папке. Если игра была расположена, курсор мыши переместится в начало floor
динозавра. Нажмите клавишу s
в терминале, чтобы начать обучение.
У нас есть 3 разных ввода, считываемых с пикселей экрана:
У нас также есть один вывод с 3 возможными состояниями:
Каждое поколение состоит из 12 нейронных сетей (геномов).
Каждый геном тестируется с помощью игры, постоянно сопоставляя входные данные чтения из игры со входами нейронной сети, а также получая выходные данные/активацию из сети и применяя их к клавишам клавиатуры.
Тестируя каждый геном, мы отслеживаем его «пригодность», подсчитывая в игре прыгнувшие кактусы.
Когда целое поколение завершено, мы удаляем худшие геномы, пока не получим N
геномов. Из этих N
геномов мы затем случайным образом выбираем два и сравниваем их значения/конфигурации. После этого мы применяем случайные мутации в значениях/конфигурациях нейронной сети, создавая новый геном.
Мы делаем кроссинговер/мутацию, пока снова не получим 12 геномов, и повторяем это постоянно.
Вся реализация была выполнена с использованием Node.js с Synaptic (библиотека нейронных сетей) и RobotJs (библиотека для чтения пикселей и имитации нажатия клавиш).
В проекте есть несколько файлов:
index.js
: он объединяет все вместе.
Scanner.js
: базовый уровень абстракции над библиотекой RobotJs, который читает экран как трассировку лучей. Также есть некоторые утилиты.
UI.js
: глобальная область управления пользовательским интерфейсом. Он инициализирует, а также обновляет экран при изменениях.
GameManipulator.js
: содержит весь необходимый код для чтения датчиков и применения выходных данных в игре. Также отвечает за подсчет очков, получение состояния игры и запуск обратных вызовов/прослушивателей для реальной реализации.
Learner.js
: это основная реализация генетического алгоритма. Именно здесь происходит «волшебство»: управляются поколения, происходит «естественный» отбор, скрещивание, мутация...
genomes
с расширением .json
enter
(затем, чтобы начать, нажмите s
)o
чтобы сохранить генерациюCc
чтобы завершить процесс.В игре с динозаврами есть неприятная ошибка: со временем он начинает «смещаться» вправо, из-за чего динозавр оказывается неправильным и смещен относительно начала игры. Это заставляет программу воспринимать динозавра как кактус, поскольку он того же цвета.
Вы можете это исправить, постоянно обновляя страницу или вставив этот код в консоль в инспекторе элементов:
// Make sure the dino does not drift to the right
setInterval(function (){Runner.instance_.tRex.xPos = 21}, 2000)
Пожалуйста, следуйте руководству по стилю Node.js от Феликса. Он не сложен и имеет отличный простой узор для вещей.