Статья, описывающие исходники проекта
"Эволюция цифровых деревьев"
Внизу будут даны ссылки на исходники, а здесь хочу описать некоторые моменты, для тех, кто хочет разобраться с кодом.
В коде используется 3 массива
world = new(256,100,INT)
cells = new(16000,8,INT)
trees = new(1000,72,INT)
Массив trees - это место хранения информации о 1000 деревьев. Для каждого дерева хранится геном (64 числа), состояние (используется/не используется), количество клеток, энергии, цвет и возраст.
Массив world - это карта размером 256 на 100. Если по координатам X , Y ничего нет, то в ячейке world[X,Y] записан нуль. Если по этим координатам стоит клетка дерева, то в ячейке записано, под каким номером в массиве cells идёт эта клетка.
Массив cells - это место хранения информации о 16000 клеток.
Используется 8 чисел на клетку. Метка о состоянии клетки ( падающее семечко, отросток, древесина, место свободно ), координаты, активный ген, ссылка на дерево, к которому принадлежит клетка, количество энергии(только для отростка) , ссылки на предыдущую и следующую клетку.
Все клетки на поле выстроены в цепочку с помощью ссылок на предыдущую (Previous) и следующую (Next) клетку.
Нулевое место в массиве cells занято нулевой клеткой, которая не отображается на экране и используется только для алгоритма.
Мы добавили первый отросток на поле (рисунок a).
Указатель на следующую клетку у клетки 0 будет указывать на клетку 1.
А указатель на следующую клетку у клетки 1 будет указывать на клетку 0.
У клетки 1 появился отросток, клетка 2, и он встроится перед клеткой 1. Это происходит с помощью изменения указателей. (рисунок b).
Если у клетки 1 появился ещё один отросток, клетка 3, и он встроится между клеткой 2 и клеткой 1. (рисунок с).
Если надо удалить клетку, то это тоже происходит через изменение указателей. (рисунок d).
Как работает главный цикл.
Вначале берётся клетка, на которую указывает клетка 0. У нас это клетка 3 (рисунок d). Проверяется, не отросток ли это. Если отросток, то у него проверяется количество энергии и если её достаточно, то появляются новые отростки, которые мы и встраиваем в цепочку перед клеткой 3. Дальше смотрим куда указывает клетка 3 - здесь это клетка 1.
Все эти же действия повторяются с клеткой 1. Смотрим куда указывает клетка 1. Мы пришли к клетке 0, цикл завершается.
Подсчитываем, сколько энергии получат клетки от Солнца, Вычтем энергию у деревьев, проверим, не опустилась ли энергия ниже нуля. Удалим деревья, где энергии меньше 0 и возвращаемся к началу цикла.
Некоторые моменты
При вырастании отростков, сначала идёт отросток вверх, потом влево, вправо и вниз. Соответственно в цепочке клеток они будут идти в этой же последовательности. В следующем цикле, например, отростки от верхнего отростка могут перекрыть место для отростков от левого и правого.
Если выпускать отростки в случайной очерёдности, то из одного генома могут получаться немного разные деревья. Вот примеры:
И ещё один пример
Вроде прикольно, что с одного генома получаются разные варианты, но анализировать, что происходит, сложнее.
Исходники
tree0.pixi
В исходниках нужно запустить с помощью Pixilang файл tree0.pixi
Проект сделан под размер окна 1280 на 720 пиксель. Это можно выставить в pixilang - настр. - параметры окна.
Возможно придётся перезапустить несколько раз, прежде чем жизнь закрепится, ну а дальше просто наблюдать.
Сверху есть кнопки
- exit - выход из приложения
- show- включить/выключить обновление экрана. Без отображения на экране процесс идёт быстрее
- save genom - в папке 0w сохраняется геном всех деревьев на поле, у которых сейчас более 5 клеток. Файлы сохраняются под именами 0.gn , 1.gn , 2.gn …... и так далее. Если перезапустить Pixilang, то новые сохранения будут идти под теми же именами, затирая старые сохранения.
view.pixi
Для просмотра сохранёных файлов используется скрипт view.pixi.
Если saveFile сделать равным 1, то в папке 0u будут сохранятся изображения деревьев и генома.
Переменная firstSell_X отвечает, где по горизонтали будет выставлена первая семечко. Можно изменять где то в пределах от 80 до 180
В строчке genom = load( "0w/0.gn") указано, какой файл сохранений использовать. В данном случае используется файл 0.gn
Ссылки
Ссылка на исходники + pixilang. Здесь вместе с исходниками есть сам интерпретатор. Распаковываем, входим в папку pixilang - windows_x86 и кликаем файл pixilang.exe.
Открывается окно проводника, находим в папке examples файл tree0.pixi и жмем ок.
PS. Спрашивали, как увеличить размер окна. У многих мониторы с большим разрешением и картинка получается маленькой.
Можно вставить в самое начало скрипта, который запускается, такую строчку.
set_pixel_size(2)
Это увеличит линейный размер пикселя в 2 раза. Вместо размера 1280х720 получится 2560х1440