Здесь опишу свой проект по моделированию эволюции на компьютере.
У меня уже был подобный проект, но здесь я буду использовать совсем другую концепцию. Это пробный проект, мир крохотный, разнообразия нет. Целью было посмотреть, насколько такая концепция работает. Всё прекрасно работает, так что, возможно, создам более масштабный мир на этом принципе.
Что это такое?
Нужно создать виртуальный мир, где некоторые сущности начнут изменятся, подстраиваясь под этот придуманный мир. Изменяясь, они начнут изменять мир и теоретически процесс может быть бесконечен.
Всё это прямая аналогия с нашим миром и эволюцией живых существ, обитающими в нём. Но нет никакой необходимости делать придуманный мир идентичным настоящему, здесь можно проявить фантазию.
"Цифровыми деревьями" я их назвал не потому, что они моделируют рост реальных деревьев, а потому, что зрительно всё это похоже на рост деревьев.
Если в качестве генома в первом проекте выступал код, то здесь геном представляет из себя таблицу 16 на 4. Изменение какого либо числа в таблице может привести к изменению формы "дерева". Это может сделать дерево более удачным для данной среды и оно с большей вероятностью оставит больше потомства. Постепенно деревья с более удачной формой вытеснят всех остальных.
При хорошо спроектированном мире могут существовать разные виды, каждый будет занимать свою нишу. Они могут никак не влиять друг на друга, так и быть полезными друг для друга.
Всё это - результат работы генетического алгоритма, но в отличие от классического варианта, здесь нет явного деления на поколения и заданной фитнес-функции, определяющей, какое дерево лучше. Всё происходит через естественный отбор и сама среда определяет, что хуже, а что лучше.
Ну а мне, как создателю, остаётся только наблюдать за разворачиванием "искусственной жизни" в маленькой песочнице на компьютере.
Что получилось?
Геном первых деревьев был сгенерирован случайно.
Обычно они быстро вымирают и приходится перезапускать симуляцию.
Но как только "жизнь" закрепилась, форма деревьев начинает меняться.
По мере развития, скорость изменений замедляется, новые изменения формы уже не дают такого выигрыша, как в начале.
Это скриншоты того, как видоизменялись деревья.
Можно посмотреть видео о проекте
Работа генома
Геном очень прост, это таблица из 16 строчек по 4 числа.
Число 16 я выбрал произвольно, число 4 соответствует 4 направлениям, куда может вырасти новый отросток (влево, вправо, вверх, вниз).
Геном первых семечек заполняется случайными числами от 0 до 31.
Числа от 0 до 15 - это ссылки на другие строки генома.
Числа от 16 до 31 ничего не значат, служат только для того, что бы вероятность появления отростка в заданном направлении равнялась 50 процентам.
Первое семечко имеет активный ген номер 0. На рисунке я каждый ген (одну из строчек генома) изобразил в виде креста из 4 чисел, что бы было интуитивно видно, в какую сторону будет вырастать новый отросток.
В гене указано, что вправо и влево ничего не вырастит, так как там стоят числа больше 15. Должен вырасти отросток вверх и у него активирован ген номер 1. Также должен вырасти отросток вниз с активным геном номер 2. Но внизу земля, поэтому ничего вниз не вырастит.
Вот вырос отросток вверх, его активный ген номер 1. Само семечко превратилось в древесину и в росте больше не участвует.
От нового отростка, согласно гену номер 1, должны вырасти три отростка, влево, вверх и вниз. Вниз не получится, так как там место занято. У верхнего отростка будет активирован ген номер 3, у левого - ген номер 2.
Отростки выросли. Исходный отросток превратился в древесину.
Левый отросток, когда накопит энергию, должен дать два отростка, влево с активным геном 2 и вправо, с активным геном 11.
Вправо не получится, там занято. Вырастит только отросток влево и его активный ген тоже будет ген номер 2.
Верхний отросток, согласно своего активного гена, даст отросток вправо с активным геном номер 5.
И так далее. Геном устроен достаточно просто.
Устройство мира
Каждая клетка дерева получает энергию от солнца. Солнце может пробить три слоя клеток. Самый верхний слой получает максимальное количество энергии, третий слой - минимальное. Все клетки, что находятся ниже, энергии не получают.
Количество энергии рассчитывается по формуле:
- Уровень * 3 (для верхнего слоя)
- Уровень * 2 (для второго слоя)
- Уровень *1 (для третьего слоя)
Нижние клетки ( у земли ) имеют уровень 6.
Я использовал 6, а не 1, что бы рост энергии с высотой был более плавный.
На рисунке я изобразил таблицу, сколько энергии получит клетка, находящаяся на этой высоте, сверху, вторым слоем и третьим слоем.
Также на каждой клеточке дерева я поставил, сколько энергии она получает от солнца.
Вся энергия собранная зеленым клетками (древесиной) идёт в общий фонд дерева.
Белые отростки собирают энергию для роста новых отростков и превращения себя в древесину. Для этого требуется 18 единиц энергии.
Таким образом три верхних белых отростка растут каждый ход, у них достаточно энергии. Нижний слева белый отросток будет копить энергию 3 хода, пара отростков с правой стороны так и останутся отростками навсегда.
Каждый ход дерево тратит на каждую клетку 13 единиц энергии. Если энергии станет меньше 0, то дерево исчезнет вместе с отростками.
Если дерево достигнет предельного возраста, то оно исчезнет, но отростки останутся, упадут на землю и каждое из них станет новым деревом.
Каждое новое дерево получает 300 единиц энергии подъёмных.
Предельный возраст каждого дерева задаётся случайным образом из диапозона от 88 до 92.
Некоторые заметки.
Вначале у меня не было разницы в энергии в зависимости от высоты. Деревья стелились по земле, хотя было выгодно быть выше других и забирать всю энергию. Стали расти ввысь, когда добавил градиент энергии по высоте. Возможно, подобрав параметры мира, можно этого добиться и без градиента. С другой стороны градиент энергии по высоте позволил кроне появляться на определённой высоте.
Время жизни деревьев задаётся в самом начале из диапазона от 88 до 92. По идее, со временем жизненный цикл деревьев должен разойтись, но они синхронизируются друг с другом, что можно заметить на видео. Если сбросишь семена позже других, то они упадут на кроны других молодых деревьев и не достигнут земли. Если слишком рано, то погибнут от недостатка света.
После того, как дерево достигло предельного возраста и сбросило семена, семена(новые деревья) получают 300 единиц энергии подъёмных. Надо сделать, что бы энергия, накопленная деревом, делилась между всеми семенами. Это создаст ещё один вектор развития: либо много семян с небольшим запасом энергии, либо мало но с кучей энергии, дающей возможность дождаться благоприятного времени для роста.
Исходники с некоторыми пояснениями в следующей статье.