Всем привет. Решил рассказать про свои эксперименты с симуляцией эволюции.
Мир разделен на квадратные клетки. В каждой клетке может находиться объект(бот или органика).
У бота есть геном, он действует, согласно геному. Бот может смотреть в восьми направлениях вокруг себя. Также у бота есть 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 деление. Спиннеры чаще, чем подвижные и статичные хищники, могут сами получать энергию.
Колониальные существа - боты, образующие скопления, но не являющиеся колониями, то есть не умеющие отличать врагов от родственников.
Простейшие существа, появляющиеся только в начальной популяции. Они умеют только получать энергию и размножаться, не умеют перерабатывать органику и чаще всего становятся жертвами статичных хищников.
Лабиринты - боты, образующие линии. Боты в линии атакуют всех снаружи, но не трогают других ботов в линии. За счет этого они образуют скопления, выглядящие как лабиринты.
Все лабиринты работают по одному принципу, однако различаются направлением и некоторыми особенностями. У большинства лабиринтов диагональное направление, однако бывает и ортогональное. У одних лабиринтов есть боты на углах, а другие выглядят как шахматное поле.
Лабиринты появляются только на начальных этапах развития мира. Также они невозможны без команды относительной атаки: если бы ее не было, то нельзя было бы атаковать в определенном направлении, а это основа для лабиринтов.
Колонии - одни из немногих высших существ. Они не атакуют своих родственников и за счет этого имеют более плотную структуру и накапливают больше энергии. Колонии защищают свои границы от чужаков и из - за этого образуют характерные границы друг между другом. Иногда между границами двух колоний могут жить другие существа
Колонии, несмотря на внешнее сходство, работают по разному. Они могут не перерабатывать органику, а могут не иметь границ и жить внутри других колоний. Некоторые колонии не вырабатывают энергию сами, а другие похожи на более простых существ
В этом мире живут 2 вида колоний: производители органики, перерабатывающие минералы, и поедатели органики - гетеротрофы. Когда количество органики становится достаточно большим, ее съедают поедатели органики, расчищая место для производителей органики.
Эти колонии выглядят немного по - другому. Они быстрее размножаются, и за счет этого толщина слоя ботов больше. Когда органика доходит до границ колоний, ее съедают хищники, живущие на границах колоний.
Пламяфилы - одни из самых интересных существ. Выглядит они необычно, однако попадаются крайне редко. Эти, например были созданы искусственно.
Пламяфилы при появлении сразу атакуют в заданном направлении. Затем они передают всю накопленную энергию в направлении атаки, при этом атакуя всех врагов вокруг, как и обычные колонии. Это можно увидеть на этой картинке:
Видно, что в конце пламяфила энергии больше, чем в начале.
Тоннели - подвид колоний. Они ограничены по определенной координате из - за сенсора позиции - не могут вырабатывать энергию на определенных координатах, но боты на границе все - равно могут атаковать. На другой стороне живут обычные колонии без ограничений. Они создают границу со второй колонией, но из - за ее ограничения граница получается очень ровная.
Существуют как вертикальные, так и горизонтальные тоннели.
Колонии в колониях - разновидность колоний. За счет минимальных отличий в геноме они считаются родственниками, но при этом их поведение может отличаться от поведения основной колонии. При этом они часто отличаются в каком - либо режиме отрисовки.
Происходит это потому, что в геноме могут быть неиспользуемые части, при мутации становящиеся активными. Так за счет этого поведение может сильно измениться даже за 1 мутацию.
Как вы уже поняли, эта симуляция является копией симуляции foo52 с некоторыми изменениями. В будущем я хочу сильно ее изменить, в частности добавить распознавание родственников по цвету, а не по мозгу, возможность смотреть на 2 клетки, химию для большего разнообразия и разнообразные многоклеточные цепочки.
В следующей статье я расскажу про разнообразные эксперименты с симуляцией, от вируса и до кислорода. Также хочется рассказать и про другие симуляции, их у меня еще 5.