Skip to content
This repository has been archived by the owner on Nov 30, 2020. It is now read-only.

kodo-pp/evolution-neural

Repository files navigation

evolution-neural

Симуляция мира с живыми существами.

Краткое описание

Мир представляет из себя прямоугольник, разделённый на ячейки. В каждой ячейке может находиться не больше одного живого существа одновременно. Каждое живое существо управляется своим мозгом, являющимся вариацией нейронной сети. Для жизни им нужна энергия. Когда её становится меньше 0, существо погибает. Когда энергии больше определённого числа, появляется новое живое существо с немного мутировавшим мозгом.

Сборка, запуск и управление

Сборка: ./build.sh. Нужен компилятор, поддерживающий C++17. Можно также определить следующие переменные среды:

Переменная Значение Описание
FORCE_REBUILD yes/no Пересобрать файл, даже если он не менялся (при yes)
DEBUG yes/no Включить режим отладки (рекомендуется). Отключает оптимизации и strip бинарника

Запуск: ./run.sh. Запуск со сборкой: ./run.sh -f. Запускайте в терминале с поддержкой 24-битного цвета через escape-последовательности (что-то вроде mate-terminal или gnome-terminal их поддерживает) и большим числом колонок и строк.

Управление: по большому счёту, основные параметры задаются в константах в коде. Во время исполнения можно только задать задержку между итерациями. Для этого нажмите Ctrl+\ (или пошлите SIGQUIT), и введите задержку между итерациями в микросекундах (например 100000 мкс == 0.1 с). Затем нажмите Enter

Индикаторы сверху:

  • Epoch: текущая итерация

  • Population: количество существ на данной итерации

  • Sun strength: яркость света солнца, зависит от времени года

Законы мира

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

Живые существа

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

  1. Выбирается случайная свободная клетка, соседняя с нашим существом. Соседними здесь считаются 4 клетки по сторонам и 4 по углам (всего 8 клеток). Если такой клетки не нашлось, существо умирает

  2. На этой клетке создаётся копия данного существа, но не совсем точная, а с некоторыми мутациями (см. Мозг).

  3. Каждому из этих существ присваивается запас энергии, равный половине запаса энергии первого существа (т.е. энергия делится между ними поровну)

Мозг

Здесь начинается самое интересное. Все действия существа определяются мозгом. Мозг состоит из определённого числа нейронов (по умолчангию 100), каждый из которых соединён с каждым другим связью с определённым весом. В каждом нейроне хранится число, так что нейроны здесь - это ячейки памяти. Когда нужно получить ответ от мозга, что делать, происходит следующее:

  1. Значения первых нескольких нейронов заменяются на информацию об окружающей среде: что вокруг, координаты существа и т.д.

  2. Происходит процесс, при котором значения нейронов "смешиваются" со значениями от других нейронов, с которыми связан данный нейрон, с учётом весов связей и весом значения самого нейрона (memory_strength)

  3. Берутся значения N последних нейронов, где N - число команд, которые может исполнить существо

  4. Среди них ищется максимальное значение. Индекс этого максимума и будет номером команды, которую нужно исполнить

Команды следующие:

Номер Описание
0 Ничего не делать, получить энергию от солнца и от еды
1 Сдвинуться влево
2 Сдвинуться вправо
3 Сдвинуться вверх
4 Сдвинуться вниз
5 Атаковать существо слева
6 Атаковать существо справа
7 Атаковать существо сверху
8 Атаковать существо снизу

Движение возможно только на свободную клетку, если клетка занята, то ничего не произойдёт, но энергия на движение потратится. Атака позволяет украсть некоторое (достаточно большое) количество энергии у другого существа. Если с на соседней клетке с нужной стороны не окажется другого существа, то ничего не произойдёт, но энергия потратится.

При размножении у потомка появляется копия родительского мозга, но с некоторыми изменениями - мутациями. В этом и есть вся суть задумки. Мутации случайны, их скорость зависит от прираодных условий (в частности, от глубины). Случайным образом изменяются веса связей между нейронами в мозге, веса значений нейронов (a.k.a. memory_strength) и сами значения нейронов.

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

В итоге получим приспособленных к условиям мира (а может и не только) существ.

Благодарности

На идею меня навели этот пост на Хабрахабре и этот комментарий к нему

TODO

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

Ваши идеи

Если у вас есть какие-то предложения или пожелания делайте Pull Requests и открывайте Issues.

Лицензия

Unlicense ( == Public domain), см. LICENSE.txt

Releases

No releases published

Packages

No packages published