Найти в Дзене
Berckut

Нейросеть управляет объектом, ч. 1

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

Несколько статей на данную тему будут посвящены возможностям управления объектами нейросетью. Объекты свободно перемещаются по пространственному полю, не выходя за его границы. На этом же поле находятся и другие объекты - еда для ботов. Сделаю один вид еды, но без проблем количество видов еды можно увеличить с различными характеристиками (растительная еда, животная еда, токсическая еда (яды) и т.д.). Боты при движении расходуют энергию и восполняют ее поедая пищу. Также боты могут размножаться. В размножении участвуют два бота (без гендерной привязки) и они порождают двух ботов, которые наследуют определенные гены родителей. При их рождении для обеспечения их начальным уровнем здоровья родители передают им 50% своего здоровья, у родителей здоровье соответственно уменьшается на 50%. Продолжительность жизни ботов - пока не определился с этим, но они могут умереть при уменьшении уровня здоровья до 0. Также не определился с продолжительностью эволюции...

Для чего это делаю - просто так, интересно наблюдать за ботами))). И пока данная программ не закончена...

Весь код будет на языке программирования Python и опубликован здесь, но разбит на 3-4 части.

Подключаемые библиотеки - стандартные для python, но одна - numpy - загружается посредством pip install numpy.

Графическое отображение сделано через tkinter при помощи класса Сanvas. Размер поверхности обитания ботов - 1000*800 пикселей, но кому необходимы другие размеры - изменить не составит труда.

Первым делом импортируем необходимые библиотеки и устанавливаем необходимое для визуального наблюдения:

Создание графического поля для ботов
Создание графического поля для ботов

При создании графического поля я разместил один канвас внутри другого и все боты будут бегать во втором канвасе - так просто удобнее их отслеживать и управлять ими. Размер первого канвас - 1250*830, второго - 1000*800.

root.resizable(width=False, height=False) - данный код запрещает изменять размеры корневого окна и, соответственно - все элементы внутри него.

Все боты - это экземпляры класса Bot:

Класс Bot, инициализация объектов при их создании
Класс Bot, инициализация объектов при их создании

Весь код закомментирован, поэтому разобраться в нем будет совсем не сложно и каждую строчку описывать здесь не буду. Кому что будет непонятно - можно узнать через комментарии.

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

Основные атрибуты бота - имя, уровень текущего здоровья, возраст, потребность в размножении, координаты бота, картинка бота, цвет бота, радар бота, нейросеть бота, синапсы бота, команды бота, а также совокупность некоторых атрибутов, которые помещаются в тег картинки бота при его создании.

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

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

Следующий метод класса позволяет отобразить создаваемых ботов на поверхности:

отображение ботов на поверхности
отображение ботов на поверхности

Для того, чтобы разместить ботов на поверхности, необходимо создать координаты этой поверхности. Для создания координат пишем следующий код:

создание пространства координат
создание пространства координат

Следующий код создает непосредственно ботов:

создание ботов, генерация начальных значений синапсов для каждого бота
создание ботов, генерация начальных значений синапсов для каждого бота

Этот блок кода чуть более развернуто прокомментирую... При создании бота задаются такие характеристики, как имя бота (b_name) и его идентификатор (bot_id). Временно я пока использую b_name - для правильности работы кода и отслеживания отдельных ботов. Но в последствии будет использоваться только идентификатор бота, так как именно благодаря ему боты будут распознавать другие боты и этот идентификатор будет отправляться на вход нейросети. Для объектов еды также будет свой идентификатор (1), который также будет подаваться на нейросеть, но временно используется имя еды - "food", для лучшего наблюдения за правильностью работы кода.

Все боты "складируются" в словарь (bots) и из него они достаются при помощи списка ключей (bots_key). Ключи - имя бота.

populations - количество ботов в первоначальной популяции

food_count - количество еды (оно постоянно и при поедании определенного количества еды новое появляется в любом свободном месте, а съеденное исчезает).

net - нейросеть бота. Нейросеть можно делать абсолютно любую, с любым количеством слоев и любым количеством нейронов в каждом слое, за исключением входного слоя и выходного. Но если кто пожелает вводить в нейросеть больше данных - можно изменить количество входных нейронов. Также можно увеличить количество выходных нейронов - будет больше команд для бота и большее разнообразие в их поведении. Но в моем коде я сделал пока столько входных\выходных нейронов.

Генерация синапсов происходит в соответствии с количеством слоев нейросети и количеством нейронов в слое. При изменении количества нейронов количество сгенерированных синапсов также изменится.

Что еще сказать про нейросеть.... В принципе, она не большая и для обсчитывания 100 ботов не тормозит. При большем количестве ботов (от 150) - бывает заметно небольшое торможение, но пробовал 400 ботов - вполне приемлемо наблюдать.

Класс еды:

Класс еды, атрибуты и методы, некоторые из которых еще не прописаны
Класс еды, атрибуты и методы, некоторые из которых еще не прописаны

Генерация еды:

создание еды и наделение ее определенными характеристиками
создание еды и наделение ее определенными характеристиками

На сегодня заканчиваю, завтра будет продолжение.

На последок - небольшое видео, как только созданная и необученная нейросеть управляет ботами.