Всем привет. Решил рассказать про свои эксперименты с симуляцией эволюции.

Как это работает

Мир разделен на квадратные клетки. В каждой клетке может находиться объект(бот или органика).

У бота есть геном, он действует, согласно геному. Бот может смотреть в восьми направлениях вокруг себя. Также у бота есть 3 основных параметра: энергия, минералы и возраст.

Энергия получается от фотосинтеза или переработки минералов (хемосинтеза), каждый минерал дает 4 энергии, минералы накапливаются автоматически, при нахождении в нижней части мира. Ниже представлена карта распределения минералов и фотосинтеза.

Возраст при рождении бота равен 1000, каждый ход он уменьшается на 1. Если возраст <= 0, то бот умрет, оставив после себя органику. Энергия также уменьшается каждый ход, но если она кончится, то бот умрет, не оставив органики.

Если бот накопил много энергии (800), он автоматически поделится, создав на соседней клетке (по направлению взгляда) свою копию.

Сколько энергии и минералов будет получать бот в разных слоях мира
Сколько энергии и минералов будет получать бот в разных слоях мира

Деление

При делении бот тратит 150 ед. энергии. (понятно, что если у него < 150 ед. энергии, то он умрет).

Если энергии все же хватило, то на соседней с ботом клетке создается его копия. Если клетка занята, новый бот появляться не будет. Копия получает половину энергии и минералов родителя, его цвет и геном. С шансом 1/4 может произойти мутация. При мутации геном потомка немного меняется, а цвет меняется полностью.

Работа генома

Геном - массив из 64 команд от 0 до 63. У бота есть счетчик, который обозначает, какую команду бот будет сейчас выполнять. После выполнения команды(если она сама не смещает счетчик) он перепрыгивает через команду со всеми ее параметрами.

Существуют завершающие и не завершающие команды. Завершающие могут выполниться лишь раз за ход, не завершающие - до 5 раз, или пока не выполнится завершающая команда.

Ниже представлена таблица с названиями всех команд и их характеристиками.

Команда

Завершающая?

Кол-во параметров

Кол-во переходов

23 - повернуться

Нет

1

0

24 - сменить направление

Нет

1

0

25 - фотосинтез

Да

0

0

26 - походить относительно

Да

1

0

27 - походить абсолютно

Да

0

0

28 - атаковать относительно

Да

1

0

29 - атаковать абсолютно

Да

0

0

30 - посмотреть относительно

Нет

1

5

31 - посмотреть абсолютно

Нет

0

5

34, 50 - отдать часть ресурсов относительно

Да

1

0

35, 52 - отдать часть ресурсов абсолютно

Да

0

0

36 - сколько у меня энергии?

Нет

1

2

37 - сколько у меня минералов?

Нет

1

2

38 - преобразовать минералы в энергию

Да

0

0

39 - возможен ли фотосинтез?

Нет

0

2

40 - есть ли приход минералов?

Нет

0

2

41 - поделиться относительно

Да

1

0

42 - поделиться абсолютно

Да

0

0

43 - какая моя позиция(x)?

Нет

1

2

44 - какая моя позиция(y)?

Нет

1

2

45 - какой мой возраст?

Нет

1

2

46 - равномерное распределение ресурсов относительно

Да

1

0

47 - равномерное распределение ресурсов абсолютно

Да

0

0

48 - переход

Нет

1

2

Все остальные - прибавить к счетчику номер команды

Нет

0

0

Относительные и абсолютные команды

Некоторые команды могут быть относительными и абсолютными. Относительная команда берет направление из параметра (при этом счетчик перескакивает параметр), а абсолютная использует направление бота.

Сенсоры

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

Самые простые сенсоры - есть ли приход минералов и работает ли фотосинтез. Если есть - совершается переход по первому переходу, иначе по второму.

Более сложные условия содержат параметр. Если сравниваемое значение больше параметра, совершается переход по первому переходу, иначе по второму.

Сенсор зрения имеет 5 переходов. В зависимости от того, что находится перед ботом, будет совершен переход по одному из 5 переходов.

Переход - число после команды, обозначающее на какую команду должен перепрыгнуть счетчик.

Рассмотрим основные команды

23 - повернуться. Поворачивает бота вправо на [параметр % 8] делений. Эта команда позволяет ботам не застревать перед каким - либо объектом.

26, 27 - походить. Перемещает бота на 1 клетку в указанном направлении, тратя 1 ед. энергии. Если бот зашел за левую границу экрана, то он появляется справа и наоборот. Мир зациклен по горизонтали.

41, 42 - поделиться. Бот создает своего потомка. Эти две команды практически не используются, так как есть автоматическое деление.

28, 29 - атаковать. Бот съедает соседа, забирая у него всю энергию и минералы. Без этой команды боты не могут перерабатывать органику.

34, 50, 35, 52 - отдать часть ресурсов. Бот делится 1/4 своих ресурсов с соседом. Если количество энергии соседа больше 1000, то оно обрезается. Иногда из - за этих команд возникают интересные узоры в режиме отрисовки энергии.

29, 30 - посмотреть. Основа для высших существ, т.к. позволяет отличать ботов от органики и своих от чужих (если разница в геноме небольшая). Если перед ботом граница, совершается переход по 1 переходу, если ничего - по 2, если враг - по 3, если родственник - по 4, и если перед ботом органика - по 5.

Режимы отрисовки

Я уже упоминал режим отрисовки энергии, но есть и другие. Рассмотрим их все.

Режим отрисовки хищников

Режим отображения типа питания
Режим отображения типа питания

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

Режим отрисовки энергии

Режим отображения энергии
Режим отображения энергии

В режиме отрисовки энергии у красных ботов много энергии, чем меньше у бота энергии, тем бот желтее.

Режим отрисовки минералов

Режим отображения минералов
Режим отображения минералов

В режиме отрисовки минералов боты без минералов имеют белый цвет, чем больше у бота минералов, тем он будет синее.

Режим отрисовки возраста

Режим отображения возраста
Режим отображения возраста

Режим отрисовки возраста похож на режим отрисовки минералов. Молодые боты белого цвета, более старые чернеют.

Режим отрисовки цвета

Режим отображения цвета
Режим отображения цвета

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

Органика

Про ботов поговорили, теперь поговорим про органику. Органика появляется только, если бот умер от старости. При появлении органика падает вниз, однако коснувшись препятствия, навсегда перестает падать.

Органика содержит энергию, которую не успел потратить бот. Как и бота, органику можно съесть и забрать ее энергию себе

Интересные существа

Простейшие

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

Ветры

Ветры
Ветры

Ветры постоянно движутся направо или налево, при этом атакуя перед собой. Иногда могут появиться ветры, не получающие энергию. Они летят быстрее своих автотрофных собратьев, нагоняют и съедают. Происходит это за счет того, что команды получения энергии - фотосинтез и преобразование минералов в энергию - завершающие, то есть тратят отдельный ход для выполнения.

Ветры без атаки

Ветры без атаки
Ветры без атаки

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

Статичные хищники

Статичные хищники
Статичные хищники

На ранних этапах развития мира часто встречаются статичные хищники. Они съедают все вокруг себя и быстро размножаются. Когда вся еда кончается, статичные хищники погибают от недостатка энергии.

Статичные хищники не могут справиться с существами, способными к атаке, вроде колоний и лабиринтов.

Фотосинтезирующие статичные хищники
Фотосинтезирующие статичные хищники

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

Подвижные хищники

Подвижные хищники
Подвижные хищники

В отличие от статичных, подвижные хищники постоянно двигаются. Это помогает им в поиске добычи.

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

Подвижные хищники также могут вырабатывать энергию самостоятельно, однако встречаются чаще, чем такие же статичные хищники.

Спиннеры

Спиннеры
Спиннеры

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

Колониальные

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

Размножающиеся существа

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

Лабиринты

Лабиринты - боты, образующие линии. Боты в линии атакуют всех снаружи, но не трогают других ботов в линии. За счет этого они образуют скопления, выглядящие как лабиринты.

Все лабиринты работают по одному принципу, однако различаются направлением и некоторыми особенностями. У большинства лабиринтов диагональное направление, однако бывает и ортогональное. У одних лабиринтов есть боты на углах, а другие выглядят как шахматное поле.

Лабиринты появляются только на начальных этапах развития мира. Также они невозможны без команды относительной атаки: если бы ее не было, то нельзя было бы атаковать в определенном направлении, а это основа для лабиринтов.

Лабиринты 1
Лабиринты 1
Лабиринты 2
Лабиринты 2
Лабиринты 3
Лабиринты 3
Лабиринты 4
Лабиринты 4

Сетчатые существа

Сетчатые существа
Сетчатые существа

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

Ранее я относил их к подгруппе лабиринтов, но логичнее их разделить, сделав самостоятельным видом(конечно, на симуляцию это никак не повлияет)

Высшие

Колонии

Колонии
Колонии

Колонии - одни из немногих высших существ. Они не атакуют своих родственников и за счет этого имеют более плотную структуру и накапливают больше энергии. Колонии защищают свои границы от чужаков и из - за этого образуют характерные границы друг между другом. Иногда между границами двух колоний могут жить другие существа

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

Колонии, не перерабатывающие органику

Колонии не перерабатывающие органику 1
Колонии не перерабатывающие органику 1

В этом мире живут 2 вида колоний: производители органики, перерабатывающие минералы, и поедатели органики - гетеротрофы. Когда количество органики становится достаточно большим, ее съедают поедатели органики, расчищая место для производителей органики.

Колонии не перерабатывающие органику 2
Колонии не перерабатывающие органику 2

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

Пламяфилы

Пламяфилы
Пламяфилы

Пламяфилы - одни из самых интересных существ. Выглядит они необычно, однако попадаются крайне редко. Эти, например были созданы искусственно.

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

Пламяфилы в режиме отрисовки энергии
Пламяфилы в режиме отрисовки энергии

Видно, что в конце пламяфила энергии больше, чем в начале.

Тоннели

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

Существуют как вертикальные, так и горизонтальные тоннели.

Тоннели 1
Тоннели 1
Тоннели 2
Тоннели 2

Колонии в колониях

Колонии в колониях - разновидность колоний. За счет минимальных отличий в геноме они считаются родственниками, но при этом их поведение может отличаться от поведения основной колонии. При этом они часто отличаются в каком - либо режиме отрисовки.

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

Колонии в колониях
Колонии в колониях

Миниколонии

Миниколонии
Миниколонии

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

Подведем итоги

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

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

Код скачать можно здесь

P.S. пароль от архива - 111

Комментарии (24)


  1. kuza2000
    31.07.2024 12:36
    +2

    Очень круто!

    Иногда тоже хочу так поиграться, но все не дошел)

    Какой язык?


    1. MountainGoat
      31.07.2024 12:36
      +4

      На Rust на egui+eframe такое очень легко рисуется, причём если взять правильный шаблон проекта из eframe examples то результат потом компилируется как сам по себе, так и в браузере.

      Даже на Питоне не проще, потому что там с потоками нужен бубен.

      Демка Посмотрите Painting и Grid.


    1. farmer_2010 Автор
      31.07.2024 12:36
      +3

      java


  1. Radisto
    31.07.2024 12:36
    +2

    Круто. Горизонтальный обмен генами и спорообразование не пробовали вводить?


  1. Tzimie
    31.07.2024 12:36
    +4

    А за сколько шагов возникают сложные существа?


    1. farmer_2010 Автор
      31.07.2024 12:36
      +1

      Иногда и за 25000, иногда и за 200000


      1. Tzimie
        31.07.2024 12:36

        А как быстро эмулируется шаг?


  1. Ant80
    31.07.2024 12:36
    +8

    Привет из 2000 года :) даже организация панелек схожа.


    1. daggert
      31.07.2024 12:36

      ООООО!!!! Я сто лет эту игру ищу! Как она зовется? Где ее достать? Это-же та штука от EA-games?


      1. Ant80
        31.07.2024 12:36

        Это моя самоделка студенческих времён, могу скинуть вместе с исходниками на C++ Builder. Но качество кода там сами понимаете какое :)


        1. daggert
          31.07.2024 12:36

          Черт! Игра 1в1 выглядит как то во что я играл в 2005-2006 скачав с сайта ea-games. Точней просто залипал играя с разными параметрами (: Там еще можно было пару параметров вводить в виде цветов для «племен» и смотреть как они сначала истребляют друг-друга, а потом ассимилируют остатки


  1. maxsaf
    31.07.2024 12:36
    +3

    Мир разделен на квадратные клетки

    Жду с нетерпением версии с разделением меридианами и параллелями ))


  1. Graid
    31.07.2024 12:36

    Отлично на поиграться, жалко не git и непонятно почему код запаролен


    1. farmer_2010 Автор
      31.07.2024 12:36
      +2

      Архив запаролен потому, что гугл диск не любит исполняемые файлы. Пароль: 111


      1. vvzvlad
        31.07.2024 12:36

        Так не надо использовать гугл-диск


      1. Graid
        31.07.2024 12:36

        На тот момент пароль не был добавлен


  1. qiper
    31.07.2024 12:36
    +1

    У ТехноШамана позаимствовано?

    https://www.youtube.com/playlist?list=PLnmlxA5EUR3F4BrpqTl0koT5Cx5aXjBIA


    1. farmer_2010 Автор
      31.07.2024 12:36

      Конечно!


  1. CBET_TbMbI
    31.07.2024 12:36
    +2

    Без гифок совсем не интересно смотреть:(

    Оформить бы статью, как тут, была бы красота. А так, что на стопкадры смотреть...


    1. farmer_2010 Автор
      31.07.2024 12:36
      +4

      Исправил


  1. wavan2012
    31.07.2024 12:36

    Ты крут, лучшее что я видел в этом направлении за последнее время

    Ветры думаю нуждаются в доработке


  1. NewMike
    31.07.2024 12:36

    Очень приятно видеть статьи от увлекающихся темой профессионалов! Круто! Очень необычно и захватывающе. Могу предложить еще подумать над темой добавления "эмоции". Карта действия эмоций. Одна негативная эмоция в соцсреде распространяется быстрее, чем одна позитивная эмоция (в проекции на людей - люди больше акцентируют внимание на негативных эмоциях, чем на позитивных). В противовес этому позитивная эмоция быстрее распространяется в семье, родственниках, друзьях. Т.е. в зависимости от того, в какой среде возникла эмоция (среда семьи\друзей или среда знакомых) и в зависимости от вида эмоции (позитивная или негативная) у нее будет разная скорость размножения (не все ее поддерживают и не все распространяют ее дальше по своим сетям друзей или знакомых).


  1. Zexyl
    31.07.2024 12:36

    По ссылке CB2_all.zip (492 MB)

    Это прикол? Откуда такой размер?

    Почему не выложите открытый код на гитфлик, планируете продавать чтоль?


  1. technik
    31.07.2024 12:36

    Любопытно