Dino Game. World record!

пишем самообучаемый алгоритм к популярной браузерной игре "dino game" by Grossmend (Май 5, 2019 в 16:50)

Всем доброго времени суток. Решил я на майские праздники отдохнуть от машинного обучения и заняться реализацией какой-нибудь идеи, которую давно хотел воплотить в реальность. Одной из таких реализованных идей стала dino game. Это браузерная в google chrome игра. Когда падает сеть можно поиграться в нее, либо можно поиграть введя в адресную строку: chrome://dino

Суть игры - как можно больше набрать кол-во очков (руками я как-то максимум набрал 11831). Скорость игры со временем увеличивается, происходит смена дня и ночи и т.д. Вообщем настоятельно рекомендую поиграть в нее

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

Но у меня все равно остался какой-то осадок, сеть выдавала на пике около ~3100, обучение длилось часами, сохранение весов сети занимало приличный объем памяти. В целях повышения скилла ML это конечно неплохо, но для такой простой задачи должны быть реализованы простые методы решения. Более того в интернете я особо не нашел каких-то объяснений как достичь «честным способом» высокие результаты простыми методами

Итак, вот список поставленных целей на реализацию:

1. Высокие результаты (от 100 тыс. и до бесконечности)
2. Точность (каждый запуск алгоритма гарантирует пункт 1)
3. Простота (тут очень могли бы помочь генетические алгоритмы, тот же метод обучения с подкреплением и т. д. но именно выбирался максимально простой алгоритм)
4. Игра должна играться из коробки (не должно происходить никаких изменений в конфиге игры и т. д.)
5. Алгоритм должен «самообучаться», не должно быть никаких «подгонок параметров руками».
6. Получение на вход алгоритму только скриншота с экрана, больше никакой информации (в предыдущей реализации методом обучения с подкреплением использовал Selenium, на вход алгоритму подавал кол-во очков, парсенные из тега «canvas»)
7. Повторить NumPy (NumPy — мне, как бывшему Matlab-исту очень нравится данный пакет, поэтому максимально эффективно старался применять функции данного пакета)
8. Получить кол-во просмотров на YouTube больше 10 тыс.

Все пункты я успешно выполнил, остался только 8-ой. Вы можете помочь с ним, посмотрев видео в конце статьи

Расскажу кратко основу алгоритма: (полный код алгоритма выложу по достижении пункта 8, либо когда отрефакторю его). Мы оптимизируем просто 1 переменную, расстояние от динозавра до препятствия, когда нужно совершить прыжок. Все. Очень просто, даже без «нагиба» динозавра, просто прыжок. Прыжок может быть длинным, либо коротким, это зависит от скорости функции

Подумав немного, я пришел к выводу, что самая важная часть алгоритма это определение скорости игры, зная скорость можно вывести функцию зависимости прыжка от расстояния до препятствия

Конечно, первое что пришло в голову это то что кол-во очков по логике пропорциональна скорости игры (чем выше очков, тем больше скорость). Но я считаю что подобные алгоритмы нужно реализовывать похожим методом с работой мозга людей. Когда играю в эту игру, я не смотрю на очки (на высоких скоростях нет времени), а просто оцениваю скорость игры и, видя препятствие, принимаю решение о действии динозавра

Поэтому скорость игры определил по разнице дистанций одних и тех же объектов от пройденного времени. Тут очень важна была скорость вычисления, так как количество кадров на больших скоростях нужно высокое. Вообщем NumPy оказался как всегда на высоте

скриншот n

Responsive image

скриншот n+1

Responsive image

Визуализация функции скорости игры


Далее зная в любой момент времени скорость игры, вывел (хватило 25 запусков) функцию дистанции для прыжка от скорости. Данную функцию также можно выводить «слёту», поэтому пункт 5 соблюдается (для примера в обучении с подкреплением у меня алгоритм обучался около 6-8 часов, здесь же чтобы вывести функцию потребовалось 20 минут)

небольшой момент: скорость игры в определенный момент становится статичной

Конечно есть там много мелочей, такие как смена дня и ночи, «смещение» картинки при смене дня и ночи, лаги ФПС, выбросы в функции скорости и т. д. Но это все легко решилось

Вот так все просто и эффективно оказалось. Впрочем как и всегда. Для каждой задачи всегда можно найти максимально простое и эффективное решение

Тут урезанное видео первых 50000, помогите выполнить 8-ой пункт, посмотрите видео)



Алгоритм не ошибся ни разу, набирал свыше 100000 очков
ссылка на полное видео первых 50000 очков (продолжительность - 43 мин).

До новых встреч!

обновлено: Декабрь 15, 2019 в 22:58


Количество комментариев: 0

Комментариев нет



Добавить комментарий: