Ссылка на исходники исходники.
Для лентяев, у кого на ПК установлен Windows, исходники вместе с интерпретатором pixilang.
О том, как пользоваться, ближе к концу статьи.
Продолжение проекта про "эволюцию цифровых деревьев", которые я описывал в предыдущих статях.
Эволюция "цифровых деревьев"
Технические подробности проекта "Эволюция цифровых деревьев"
Это не моделирование эволюции настоящих деревьев.
Все совпадения случайны, я моделирую свой придуманный мир, но так как есть некоторое сходство с миром настоящих деревьев, то я этим пользуюсь для удобства объяснения.
Мир стал шире в 5 раз, геном усложнился, также поменялись правила получение энергии.
Что это такое?
Для тех кто не видел мои проекты опишу основную идею.
Мне нравится создавать придуманные виртуальные миры и запускать в них живность(ботов), которая будет эволюционировать, подстраиваясь под придуманный мир, тем самым изменяя и сам мир.
Теоретически, процесс может быть бесконечным, но на практике, через некоторое время мир приходит в некоторое стабильное состояние.
Это легко объясняется тем, что по мере усложнения ботов, новые усложнения даются всё тяжелее и тяжелее.
Хотя, эволюции не обязательно должна вести к усложнению, но именно это нам и хочется увидеть.
Большую роль здесь играет масштаб мира и его сложность, также возможности действий, доступные для ботов.
Здесь свои ограничения накладывает мощность компьютера на котором производится симуляция.
Также я очень мало уделял внимание изменению самого мира в процессе симуляции. Например, состав почвы, атмосферы, форма рельефа могут меняться от жизнедеятельности ботов.
Это создало бы предпосылки для бесконечного изменения мира в симуляции и появлению новых форм.
Изменения в мире.
Мир описан в первой статье про эволюцию цифровых деревьев, здесь я опишу только изменения.
Вся энергия Солнца, полученная клетками, идёт в общий фонд дерева, в том числе и энергия полученная отростками. Отростки, для своего роста, получают энергию из общего фонда.
(в старой версии отростки сами копили энергию и не делились с деревом)
После смерти дерева, вся древесина исчезает, а отростки превращаются в семена. Вся энергия, накопленная деревом, распределяется между всеми семенами. При этом энергия уменьшается в два раза и если семечке достаётся больше 1000 единиц энергии, то всё, что больше 1000, делится на 100. Сделано это, что бы ограничить бесконечный рост энергии у деревьев из поколения в поколение.
(в старой версии семечки получали фиксированные 300 единиц энергии)
Солнечная энергия в новом варианте тоже распределяется по другому принципу.
Что бы посчитать, сколько энергии получат клетка, нужно перемножить два числа.
Первый множитель - это переменная, которая означает силу света или сколько слоёв клеток, потенциально, могут получить энергию. Эта переменная может меняться вручную во время симуляции и она разная для дня, ночи и тумана. После прохождения каждого слоя древесины сверху вниз, она уменьшается на 1. На рисунке этот множитель обозначен зелёным. Для примера, сила света равна 8 и после каждого слоя убывает на 1.
Второй множитель во всех моих экспериментах, изначально был равен 3.
После каждого слоя древесины он уменьшается на 1, после пустого пространства увеличивается на 1, но не может превысить 3.
На рисунке этот множитель обозначен тёмно-синим.
То есть, если идут три слоя древесины подряд, то последующие слои ничего не получат и нужен промежуток, что бы свет восстановился.
Причём, после трёх слоёв древесины нужно не менее трёх промежутков, что бы сила света полностью восстановилась.
На рисунке приведено 4 примера.
Первый случай - самый плохой, энергию получили только 3 верхних слоя.
Второй случай неплох. Благодаря одному увеличенному промежутку в 2 клетки, энергию смогли получить 7 слоёв, в отличие от третьего случая, где этот промежуток уменьшен и энергию получили только 5 слоёв древесины.
Четвёртый случай идеален, благодаря тому, что после каждого слоя древесины идёт промежуток, второй множитель всегда равен 3 и энергию получат 8 слоёв древесины (при изначальной силе света=8).
То есть, больше шансов на распространение получат те деревья, что имеют более тонкие ветки с промежутками между ними и выше других деревьев.
Хотя, естественно, есть и другие варианты стать более успешным. Например, расти вдоль земли и не давать семенам деревьев достигать земли. Энергии под кроной других деревьев меньше, но не надо тратить энергию на вертикальный ствол и места для своих семян забронированы.
Работа генома
Работа генома хорошо описано в первой статье про эволюцию цифровых деревьев, здесь я опишу только изменения которые внёс в геном.
Геном также состоит из 16 генов, как показал опыт этого вполне достаточно, но теперь ген состоит не из 4, из 9 чисел.
Если в старой версии в гене могли быть числа от 0 до 31, то здесь диапазон расширился и это могут быть числа от 0 до 63.
Первые четыре числа, также как и в старом проекте, означают в каких направлениях должны появиться новые отростки и какой активный ген они будут иметь. На рисунке эти числа изображены в левом квадрате. Отросток в этом направлении появится только если число находится в диапазоне от 0 до 15. Именно столько генов (16) находится в геноме.
Но появился альтернативный вариант развития. Дополнительных 4 числа означают условия, при выполнении которых отросток выполнит предписание другого гена, либо выполнит одну из пяти команд. Какой ген или команда - закодированы в последнем числе гена.
Два числа в геноме отсылают к условию. На рисунке это 15 и 29. Всего у меня задано 18 условий, поэтому, что бы условие было действующим, число должно быть в диапазоне от 1 до 18. На рисунке число 29 не попадает в этот диапазон и не рассматривается.
Если оба условия не действующие, то выполняется обычный рост отростка с использованием первых 4 чисел.
Если одно или оба условия действующие, то они все должны быть выполнены, что бы произошёл альтернативный вариант развития, иначе выполняется обычный рост отростка с использованием первых 4 чисел.
список условий
- высота, на которой находится отросток > параметра
- высота, на которой находится отросток < параметра
- высота, на которой находится отросток = параметра
- масса дерева больше параметр*8
- масса дерева < параметр*8
- масса дерева = параметр*8
- высота дерева > параметра
- высота дерева < параметра
- высота дерева = параметра
- остаток жизни дерева > параметр*2
- остаток жизни дерева < параметр*2
- остаток жизни дерева = параметр*2
- энергии дерева > параметр*100
- энергии дерева < параметр*100
- энергии дерева = параметр*100
- высота дерева - параметр > чем высота, на которой находится отросток
- высота дерева - параметр < чем высота, на которой находится отросток
- высота дерева - параметр = чем высота, на которой находится отросток
Допустим, что все условия выполнены и теперь мы обращаемся к последней цифре в гене.
Если число в диапазоне от 0 до 47, то делим его на 16 и остаток от деления используем, как новый активный ген.
Если число от 48 и выше, то делим его на 5 и остаток от деления указывает на команду, которую требуется выполнить.
список команд
- пропустить ход
- отсыхание ветки
- увеличение возраста на 2 хода (сокращение жизни)
- отросток превращается в семечко и падает
- отросток поедает ветку
При команде номер 2, ветка начинает уменьшаться на 1 клетку каждый ход до ближайшего узла. Дерево при этом получает дополнительную энергию за каждую погибшую клетку. Процесс необратим.
При команде номер 5, отросток начинает поедать ветку по 1 клетке за ход.
Делать он это будет до ближайшего узла, пока условия этого требуют.
При изменении условий, этот процесс остановится и отросток начнёт рост.
Запускаем
Для запуска симуляции необходим интерпретатор Pixilang.
Как его установить, написано здесь.
Если вы скачали вариант для лентяев, то запускаем файл pixilang\pixilang\windows_x86\pixilang.exe
или
pixilang\pixilang\windows_x86_64\pixilang.exe
Выставляем в настройках размер окна 1280 на 720.
(настройки-интерфейс-параметры окна)
Окно интерпретатора представляет из себя что то вроде Проводника,
находим в нём папку проекта ( например EvoTrees ),
выбираем файл Start_Simulation.pixi и жмём OK.
После запуска, пока экран тёмный, можно кликнуть пару раз по экрану для помощи генератору псевдослучайных чисел.
Собственно всё.
Велика вероятность, что жизнь не сможет зацепиться и вся погибнет, перезапускаем всё заново. Если жизнь не исчезла, но не разрастается и существует в виде пары полуживых деревьев, то жмём кнопку exit и запускаем симуляцию вновь. Ждём, когда жизнь начнёт бурлить, после чего можно потихоньку начинать играть настройками, менять количество энергии, продолжительность ночи или высоту тумана.
Делать жизнь более суровой нужно постепенно, а то вся биосфера погибнет. Обычно я делаю продолжительность ночи короткой, постепенно уменьшаю количество энергии в ней и когда вижу, что деревья адаптировались, потихоньку увеличиваю продолжительность ночи.
Обычно я запускаю на ПК сразу 5 симуляций и переключаюсь между ними. Что бы увеличить скорость симуляции, стоит отключать отображение мира у симуляций ( кнопка show), когда вы не смотрите на неё.
Как пользоваться
- В верхней части экрана изображён весь мир. Его ширина 1280. Каждая клетка здесь имеет размер 1 пиксель.
- Фрагмент мира, увеличенный в 5 раз. Занимает всю центральную часть экрана. Именно такой размер был у всего мира в первом варианте.
- Эта полоска показывает, какой фрагмент мира виден по центру экрана. Кликая по верхнему изображению всего мира, мы можем перемещать полоску, что бы лучше рассмотреть разные участки мира.
- generation Количество пройденных поколений. Увеличивается на 1 через каждые 90 ходов - такова средняя продолжительность жизни дерева, не использующего команду сокращения жизни.
- exit Выход из симуляции.
- save gns Сохранить геном деревьев, которые видны на увеличенном фрагменте. Геном сохраняется в папке 0gensSave. Имя файла представлено в виде числа с расширением .gns. Если выключить моделирование и включить заново, то новые сохранения будут затирать старые, поэтому стоит позаботится, что бы переименовать их или перенести в другое место.
- show Включить/отключить отображение мира. Если вы не наблюдаете за миром, то лучше отключить отображение, моделирование при этом происходит значительно быстрее.
- -sun+ Энергия Солнца. Это первый множитель в формуле расчёта энергии, полученной клеткой. Кликая по правой и левой стороне кнопки, можно менять энергию Солнца от 0 до 14
- DayNight Включение режима смены дня и ночи. Ночь изображается в виде тёмно-синего фона, движущего по миру слева-направо.
- -Night+ кликая по краям кнопки, можно настроить продолжительность ночи.
- -moon+ Энергия, получаемая ночью. Кликая по правой и левой стороне кнопки, можно менять ночную энергию от 0 до 14.
- -fog+ Настройка высоты тумана. Все клетки, что находятся в тумане, энергию не получают.
- mode Переключение режимов отображения клеток.
В стандартном режиме клетки окрашены в цвет дерева. Деревья с одинаковым геномом, имеют один цвет.
В режиме отображения энергии клеток 1, цвет клетки зависит от полученной за ход энергии. Чем желтее, тем больше энергии. Клетки, которые не получают энергию, окрашены в в синий цвет
В режиме отображения энергии клеток 2, цвет дерева зависит от полной энергии дерева делённой на количество клеток дерева. Чем зеленее, тем больше энергии у дерева на каждую клетку.
В режиме отображения энергии дерева, цвет дерева зависит от энергии у дерева. Чем розовей, тем больше энергии.
В режиме отображения энергии отростков, дерева зависит от полной энергии дерева делённой на количество действующих отростков дерева. Чем сине-зеленее, тем больше энергии получит каждый отросток, если станет семечком прямо в этот момент. - настройка Дополнительная настройка режима "отображения энергии клеток 2" и режима "отображения энергии дерева"
У варианта с всплывающими слоями тумана кнопок меньше. Нет 9, 10, 11, 12 кнопки, но есть дополнительная кнопка для управления уровнем энергии в слоях тумана.
Также в нижней части экрана есть 3 закрытых панели, которые можно открыть, что бы получить дополнительную информацию.
- command Отображаем выполнение клетками команд. Счетчик периодически обнуляется, так что по нему можно смотреть, только какие команды выполняются сейчас.
- trees Можно посмотреть количество деревьев на грунте и общее количество ( в том числе падающие семена)
- cells Можно посмотреть статистику по клеткам: падающие, отростки, древесина, общее количество
- energy4seed Константа, для вычисления количества энергии для семян, так как я с ней экспериментировал, то вывел её на экран.
- simulationID Случайное число, номер симуляции. Я, обычно, запускал много симуляций и что бы в них не путаться, у каждой есть свой номер
Дополнительные возможности
В папке с проектом EvoTrees есть два файла view.pixi и view_one.pixi.
Они нужны для просмотра сохранёнок.
Если во время симуляции нажимали save gns, то геном деревьев, которые видны на увеличенном фрагменте сохраняются в папке 0gensSave.
В папке с проектом EvoTrees_gorizont этих файлов нет и при необходимости нужно переместить сохранёнку из
EvoTrees_gorizont\0gensSave в EvoTrees\0gensSave .
view.pixi
Скрипт view.pixi позволяет просматривать сохранёнки. Для этого в скрипте должно быть прописано имя сохранёнки. На скрине это сделано в 11 строке.
Нажимая кнопку next, можно проитись по сохранённым геномам и сохранять отдельно те, что понравились (кнопка save gen ) в папке 1genSave.
view_one.pixi
Скрипт view_one.pixi позволяет просматривать уже отдельные геномы из папки 1genSave. Для этого в скрипте должно быть прописано имя сохранёнки. На скрине это сделано в 14 строке.
В этом скрипте можно пошагово следить за ростом дерева, видеть номера активных генов и сколько энергии приносит каждая клетка.
Продолжение в следующей статье...