Несколько статей на данную тему будут посвящены возможностям управления объектами нейросетью. Объекты свободно перемещаются по пространственному полю, не выходя за его границы. На этом же поле находятся и другие объекты - еда для ботов. Сделаю один вид еды, но без проблем количество видов еды можно увеличить с различными характеристиками (растительная еда, животная еда, токсическая еда (яды) и т.д.). Боты при движении расходуют энергию и восполняют ее поедая пищу. Также боты могут размножаться. В размножении участвуют два бота (без гендерной привязки) и они порождают двух ботов, которые наследуют определенные гены родителей. При их рождении для обеспечения их начальным уровнем здоровья родители передают им 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:
Весь код закомментирован, поэтому разобраться в нем будет совсем не сложно и каждую строчку описывать здесь не буду. Кому что будет непонятно - можно узнать через комментарии.
Каждый бот наделен определенными первоначальными характеристиками (атрибутами), которые инициализируются методом __init__ класса Bot. В других методах класса в процессе работы программы атрибуты могут быть изменены, что будет влиять на поведение ботов.
Основные атрибуты бота - имя, уровень текущего здоровья, возраст, потребность в размножении, координаты бота, картинка бота, цвет бота, радар бота, нейросеть бота, синапсы бота, команды бота, а также совокупность некоторых атрибутов, которые помещаются в тег картинки бота при его создании.
Практически все атрибуты (параметры) ботов можно изменять на свой вкус - размер бота, его цвет, начальный уровень здоровья, радиус радара, скорость бота, сколько вычитается за каждый прожитый день (1 секунду) от общего здоровья, в общем, методом научного "тыка" изменить необходимый параметр для личных экспериментов.
Пока нет параметра - сколько здоровья расходуется ботом при его движении за каждый шаг и вообще, может быть еще какие параметры надо будет добавить - программа в процессе создания...
Следующий метод класса позволяет отобразить создаваемых ботов на поверхности:
Для того, чтобы разместить ботов на поверхности, необходимо создать координаты этой поверхности. Для создания координат пишем следующий код:
Следующий код создает непосредственно ботов:
Этот блок кода чуть более развернуто прокомментирую... При создании бота задаются такие характеристики, как имя бота (b_name) и его идентификатор (bot_id). Временно я пока использую b_name - для правильности работы кода и отслеживания отдельных ботов. Но в последствии будет использоваться только идентификатор бота, так как именно благодаря ему боты будут распознавать другие боты и этот идентификатор будет отправляться на вход нейросети. Для объектов еды также будет свой идентификатор (1), который также будет подаваться на нейросеть, но временно используется имя еды - "food", для лучшего наблюдения за правильностью работы кода.
Все боты "складируются" в словарь (bots) и из него они достаются при помощи списка ключей (bots_key). Ключи - имя бота.
populations - количество ботов в первоначальной популяции
food_count - количество еды (оно постоянно и при поедании определенного количества еды новое появляется в любом свободном месте, а съеденное исчезает).
net - нейросеть бота. Нейросеть можно делать абсолютно любую, с любым количеством слоев и любым количеством нейронов в каждом слое, за исключением входного слоя и выходного. Но если кто пожелает вводить в нейросеть больше данных - можно изменить количество входных нейронов. Также можно увеличить количество выходных нейронов - будет больше команд для бота и большее разнообразие в их поведении. Но в моем коде я сделал пока столько входных\выходных нейронов.
Генерация синапсов происходит в соответствии с количеством слоев нейросети и количеством нейронов в слое. При изменении количества нейронов количество сгенерированных синапсов также изменится.
Что еще сказать про нейросеть.... В принципе, она не большая и для обсчитывания 100 ботов не тормозит. При большем количестве ботов (от 150) - бывает заметно небольшое торможение, но пробовал 400 ботов - вполне приемлемо наблюдать.
Класс еды:
Генерация еды:
На сегодня заканчиваю, завтра будет продолжение.
На последок - небольшое видео, как только созданная и необученная нейросеть управляет ботами.