Нейронные сети глубоко проникли в жизни простых людей,  однако на ум все еще не приходит ни одной игры, основанной на их обучении. Именно это недоразумение мы и хотели исправить своим недоразумением проектом. Основная идея проекта: игра, в которой пользователю дается возможность регулировать процесс обучения нейронных сетей. Задачей агентов является прохождение модульных трасс. Задача игрока - подбирать оптимальные параметры обучения для победы в заездах против нейронных сетей других игроков. Очевидно, что неизвестно, какой должен быть вывод у нейронной сети. Таким образом, единственный подходящий для нас метод обучения - обучение с подкреплением (Reinforcement learning). Многопользовательский режим было решено реализовать при помощи библиотеки Photon. Первым делом было решено определиться с входами и выходами нейронной сети. На входе: Расстояние от переда гоночного болида до стен, ограничивающих трассу Скорость, с которой болид двигается на момент предсказания  На выходе две переменные: ускорение (тормоз) и поворот. Далее было просто необходимо определиться с функцией оценки приспособленности агентов. Мы выписали несколько характеристик, которые определенно влияли бы на оценку:  Пройденное расстояние - этот параметр будет больше всего влиять на оценку Время которое болид упирался в стену Так же награда будет даваться, если болид касается финиша и за каждую секунду после его пересечения В это время мой товарищ уже накидал элементы для нашей блочной трассы Для аппроксимации пройденного расстояния каждый элемент трассы был разделен на прямые отрезки при помощи триггеров, касаясь которого агент получал бы награду за расстояние, пройденное с последнего триггера + константную награду. Так же триггеры необходимы для того, чтобы понять, что водитель развернулся и едет в обратную сторону. Таким образом, если он развернется и проедет там, где уже был, то процесс подсчета его очков завершается и отключает в нем все компоненты, что просто необходимо для оптимизации. После реализации класса, отвечающего за многослойный перцептрон, мы побежали генерировать случайные нейронные сети и смотреть, что получилось. Воодушевленные успехом, мы сразу же пошли выбирать алгоритм обучения для нашего проекта. После просмотров видео на YouTube исследования были выбран генетический алгоритм обучения. В нашем случае он подходит по следующим причинам: Он более наглядный. Смотреть на большое число болидов кажется более захватывающим. Принцип обучения генетического алгоритма легко объяснить неподготовленному пользователю. Он относительно прост в реализации. В время реализации алгоритма мой товарищ сделал генератор трасс, и после ее окончания мы, наконец, получили первые результаты.   Оставалось придумать, как именно игрок может влиять на обучение. Было решено позволить игроку полностью управлять всеми переменными, отвечающими за генетический алгоритм: процент мутации, количество отобранных особей для селекции, количество новых особей и т.д. Так-же полное управление коэффициентами, необходимыми для вычисления оценки, такими как награждение за соприкосновение с триггером, штраф за касание со стеной и т.д. Самым сложным была и есть объективная оценка водителей, при помощи которой мы можем определить, какой из водителей лучше, даже когда они проезжают на разных треках. Самой лучшей аппроксимацией, которую мы получили, была средняя уверенность в том, что они нажимают на газ у лучших n особей. Этот рейтинг мы так же решили выводить в графике. Здесь s -  число записанных решений агента, v_j - ускороние в j записи.  Для того чтобы ощущать прогрессию, был добавлен гараж, в котором можно улучшать характеристики болида, что будет изменять управление для водителя, и его необходимо будет переучивать.   На вход подавалось 9 значений - 8 значений лучей и скорость. Первой нашей догадкой было выбрать сеть с двумя скрытыми слоями по 6 и 3 нейрона соответственно. В качестве функции активации изначально стояла сигмоида. Прочитав про различные функции активации, мы решили попробовать ReLU в качестве основной функции активации. Сразу после этого агенты начали показывать отличные результаты на первой же генерации. Уже буквально на 18-ой генерации такие болиды смогли проходить самые сложные элементы трассы. Это делало игру бессмысленной, так что от ReLU пришлось отказаться.  Так же стало интересно, как зависит количество нейронов в сети от ее качества. Были испробованы сети 4 слоя в глубину с постепенно уменьшающимся числом нейронов, сети с двумя скрытыми слоями по 20 нейронов в каждой и т.д. Существенное различие заключалось только в том, сколько времени будет затрачено на обучение, а качество как будто бы значительно не отличалось. Таким образом, было решено взять 2 скрытых слоя по 9 нейронов в каждом, чтобы время, затраченное на обучение, было и не слишком коротким, и не слишком долгим. Еще одной из идей (таких идей, которые появляются перед самым сном) было добавить синус и косинус угла между вектором направления болида и вектором направления к следующему триггеру. Да, это повлияло на поведения сети, однако вместо того, чтобы в случае столкновения она понимала, куда ей необходимо ехать, агент просто пытался минимизировать эти значения и ехал через центр трассы, что совсем не оптимально для прохождения на скорость. В конце концов, мы потратили еще уйму времени на создание одиночного и многопользовательского режима, добавили обучение и небольшой справочник и, наконец, выпустили игру в свободное плаванье. Google play RuStore Спасибо за внимание!