vool
@vool
Разработчик

Как научить нейронку выигрывать в моей Phaser.js игре?

Привет, я разработал свою небольшую мини-игру на Phaser.js 3, как мне внедрить в неё ИИ и научить его выигрывать?
Вот демка игры: https://jump.teleweb.repl.co/
Суть игры: собирать как можно больше звёзд и не наткнуться на бомбу
Код игры на гитхабе: https://github.com/teenagerbot/JumpAI

В нейронках я новенький, ОЧЕНЬ прошу - помогите
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 3
freeExec
@freeExec
Участник OpenStreetMap
Для игр обычно используют подход https://en.wikipedia.org/wiki/Reinforcement_learning
Ответ написан
@AlexSku
не буду отвечать из-за модератора
Курс по RL.
Ответ написан
@rPman
Если RL для тебя сложно, используй менее эффективный но очень простой подход - генетический алгоритм.
Это очень тупой и простой для реализации подход, ты реализуешь свою игру в виде метода (ты его всеравно должен бы сделать для RL), с помощью которого ты будешь тестировать своего бота:
* независящего от реального времени (т.е. внутренний таймер есть но игра проходит максимально быстро в реальном времени без пауз)
* фиксированным сидом для случайных событий (т.е. повторный запуск с теми же параметрами должен выдать тот же результат)
* пропускающего вывод графики
* на вход которого подается твой алгоритм управления (не важно чем он будет, главное чтобы он однозначно описывался какими то числами), т.е. управлением занимается метод который ты передашь в вызове
* на выход этот метод выдавал бы давал оценку, на сколько хорошо выбранный алгоритм прошел игру (0 - умер, и плюс число за звезду)
* добавляешь в этот метод лимит по внутреннему времени (т.е. чтобы - возвращало за невыполнение задания, в твоем случае это не собрал звезды)
* можно привязать оценку ко времени, например разделить собранные звезды на затраченное время (добавь какой-нибудь коэффициент влияния времени на итог).

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

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

Задача будет решена, но времени (вычислительных ресурсов) для этого может потребоваться очень много.

Если интеллект твоего робота будет из двух сетей, то та что моторная можно обучить отдельно, другими алгоритмами, так как для нее легче сделать функцию ошибки (1/расстояние до цели например), это значительно сэкономит время. Так же можно вместо управляющей нейронки написать тупой код (например управляющая принимает решение, какие звезды собрать и когда уворачиваться от бомбы, просчитывая ее положение на основе известных тебе игровых алгоритмов)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы