Когда то сделал игру и теперь решил прикрутить к зенитке из игры нейронную сеть. Это вторая статья, описывающая проект.
Ссылка на первую статью.
Я не специалист в этой области, здесь я просто буду описывать своё опыт, свои трудности, которые возникали во время реализации этого проекта. Статья идёт в поддержку видеоролика, который я выпустил на YouTube.
Результат обучения
Результат работы нейросети можно представить графически.
Можно каждому пикселю присвоить цвет от черного до белого, в зависимости от угла выстрела по объекту, находящемуся по тем же координатам, что и сам пиксель. Получится две картинки, для объектов со скоростью в 1 пиксель за кадр и для скорости в 3 пикселя за кадр. Я также добавил карту для объектов со скоростью 2 пикселя за кадр. Хотя нейросеть этому не обучалась, но благодаря своему свойству обобщать, может выдать картинку и для других скоростей. Картинка для объектов со скоростью 3 светлее, так как стрелять нужно под большим углом. В последней картинке я сделал нарезку из двух картинок, для скорости 1 и 2, что бы наглядней была видна разница.
Что бы ещё наглядней было, уменьшил количество вариантов цвета
Как видно, градиент не очень ровный. Видимо это связано с малым количеством нейронов в скрытых слоях, а я старался сделать их поменьше. Для интереса, я попробовал использовать то же количество нейронов, но использовать логистическую функцию активации. Как я и ожидал, картинка получилась значительно глаже.
Думаю, такую же картинку можно получить, если использовать функцию RELU, но увеличить количество нейронов. При этом нейросеть будет всё равно требовать меньше ресурсов, чем при использовании логистической функции.
Нейросеть в этой игре должна давать достаточно ограниченное количество ответов, поэтому вместо нейросети можно использовать пару картинок, картинка для скорости цели в 1 пиксель и картинка для скорости цели в 3 пикселя за кадр. Просто берём цвет пикселя по тем же координатам, что и цель и на основе цвета пикселя и вычисляем угол для зенитки.
При чёрно-белом изображении получится только 256 вариантов для угла выстрела. Так что в этом случае стоит использовать другой способ кодирования, что бы использовать все 3 байта цвета пикселя.
Запускаем игру
Пришло время использовать нейросеть в игре. Сейчас нейросеть может указать, под каким углом стоит стрелять объекту с указанными координатами и скоростью.
Каждый ход игры мы берём один (или несколько) НЛО и проверяем, находится ли он в зоне контроля. Я ограничил зону, по которой стреляю с правой и левой стороны. По объектам, которые близки к правовому краю, стрелять нет смысла, так как снаряд всё равно не догонит их.
Если НЛО находится в зоне контроля, то я измеряю расстояние до него и до всех дирижаблей, которые есть в небе.
Если какой то дирижабль находится ближе к зенитке, чем НЛО, то от нейросети получаем угол выстрела, что бы попасть по НЛО, и угол, что бы попасть по дирижаблю. Сравниваем эти углы и если разница больше некоторого значения, то производим выстрел по НЛО, снаряд, предположительно, не заденет дирижабль.
Ну а теперь, как вычисляется "некоторое значение", на которое должны отличаться углы выстрела по дирижаблю и по НЛО, что бы произвести выстрел.
Самый простой вариант - фиксированное значение. Например, при разнице в углах в 0,12 - снаряд пролетает вплотную к дирижаблю, летящему на самой низкой высоте ( рисунок a ), в 220 пикселях от зенитки. Но для дирижаблей на других высотах расстояние слишком велико и можно сделать угол поменьше.
Опытным путем подобрал такую формулу:
минимальный угол = 0,12 - ( (дистанция-220) / 6000)
Результат работы формулы виден на рисунках b и c для средней и максимальной высоты.
Чем больше расстояние до дирижабля, тем меньший угол требуется для разрешения выстрела
Итоги
Зенитка неплохо справляется с работой, хотя случаются промахи и страдают дирижабли, но в наше время никого не напугаешь сопутствующим ущербом.
Сопутствующий ущерб - неумышленный или дополнительный ущерб, нанесенный людям или объектам, которые на тот момент не являлись правомерной военной целью. Такого рода ущерб не является незаконным, поскольку не является чрезмерным, учитывая военное преимущество, обретенное с помощью военного действия.
Министерство обороны США
Для игры получилось вполне удачно.
Слабые места:
- Разница в углах выстрела определена только для объектов над зениткой. Большинство промахов происходят с правой стороны от зенитки.
- Зенитка выпускает только один снаряд по одному НЛО и дальше считает его сбитым. Проверки не происходит
- Зенитка проверяет, если дирижабли на пути выстрела по НЛО(1), но не проверяет наличие на пути других НЛО. Если снаряд, летевший в НЛО(1) сбивает НЛО(2), то возможный снаряд, летевший в НЛО(2), попадёт неизвестно в кого.
Исходники
Все исходники написаны на Pixilang.
Изначальная игра
Два режима, с дирижаблями и без. Зенитка мобильная, что бы заставить её двигаться, нужно кликать по земле с нужной стороны. Снаряды могут попадать по зенитке и наносить её урон. Игра рассчитана на разрешение 800х480.
Зенитка стреляет очередями
Зенитка стреляет от угла в -0.1 до угла 1.1
Обучение
Создание и обучение нейросети
Бой
Зенитка охраняет наш покой :)