Существует огромное количество различных моделей, позволяющих воспроизводить процессы, аналогичные процессам, происходящим в живой природе. Безусловно, некоторые из этих моделей вносят вклад в науку и позволяют лучше понять механизмы, благодаря которым стабильно существует окружающая нас биота. Я не буду сильно углубляться в эту тему, поскольку передо мной стоит иная задача.
Чтобы разобраться в том, что из себя представляет искусственная жизнь в контексте этой статьи, следует вспомнить небезызвестные клеточные автоматы. Их существует огромное количество, а процессы, происходящие в них, можно встретить и в естественной среде. Классические примеры представлены далее:
Тем не менее, в основе клеточных автоматов не всегда лежат какие-то сложные правила и законы. Здесь следует вспомнить небезызвестную игру "Жизнь", созданную математиком Джоном Конвеем в 1970 году. Игровое поле разделено на живые и мёртвые клетки. Пользователь задаёт начальное расположение живых клеток. Далее "жизнь" развивается по нехитрым правилам:
1) Каждая клетка имеет 8 соседей.
2) Если мёртвая клетка имеет ровно 3 соседей, то она становится живой.
3) Если живая клетка имеет от 2 до 3 живых соседей, то она продолжает жить, в противном случае - умирает.
Такие правила порождают множество структур, таких как натюрморты, осцилляторы, глайдеры, ружья и т.д.
Однако не одной "Жизнью" едины. У многих сразу возникает вопрос, что будет, если поменять стандартные правила этого автомата (которые, кстати, обозначаются, как B3/S23, где первая 3 - количество живых соседей, необходимых для "оживления клетки", а 2 и 3 - для продолжения её жизни). При смене правил могут получаться новые миры, например, с фракталами, однако жизнь в таких симуляциях быстро переходит в статичное состояние.
Помимо игры "Жизнь" меня также вдохновили различные эксперименты умельцев с ютуба, таких, как "foo52ru ТехноШаман". Идея создания искусственной жизни у меня зародилась ещё несколько лет назад, однако не было достаточных навыков для её реализации. Мой скудный опыт в геймдеве ограничивался софтом ClickTeam Fusion 2.5. Было трудно представить создание подобных симуляций на готовых ассетах. Всё изменилось после начала изучения C# и работы в Visual Studio. На ютубе есть урок по созданию игры "Жизнь" на C#, он и позволил сделать мне первые шаги на поприще клеточных автоматов. Я экспериментировал с различными мирами, добавляя новые типы клеток, и их взаимодействия, а также меняя правила и добавляя новые. Также стоит заметить, что во всех случаях я создавал замкнутую симуляцию, где глайдеры могли летать бесконечно, исчезая за одним краем и появляясь из противоположного. Когда я накопил достаточный опыт, то решил начать создание первой симуляции.
И здесь меня ждала неудача. Я сильно отдалился от принципов игры "Жизнь", и написал довольно кривой код, из-за чего программа неистово лагала, а симуляция работала не совсем так, как нужно. Не вижу смысла подробно описывать эту симуляцию, однако я могу вернуться к её разработке в будущем.
Далее я принял решение делать симуляцию более похожую на мои эксперименты с "Жизнью". Так и появилась программа с рабочим названием Life 2.0.
Я задал правила, которые соответствуют записи B2/S01234, т.е. клетка рождается при двух живых соседях, а при более, чем четырёх, умирает. Затем я задал новый тип клеток, которые являлись "хищниками". Правила их существования много раз менялись, поэтому скажу лишь о ошибке, которая привела к интересному результату.
Неправильно были закодированы правила, вследствие чего обычные клетки создавали колонии и запускали корабли, а хищники уничтожали скопления клеток и путешествовали на кораблях в другие колонии. Чем-то напомнило космические войны будущего из кино.
Однако это не было целью экспериментов с хищниками, хотя и дало некоторые идеи. Хищники вскоре были вырезаны, а эксперименты с поиском оптимальных правил подходили к концу.
В результате была выбрана следующая конфигурация: B1/S012345678 (первоначально я периодически менял её на B1/S01234567). У клеток появился срок жизни, который по дефолту был равен 50 поколениям. Также пришлось модернизировать правило, по которому рождаются новые клетки. Вероятность превращения мёртвой клетки в живую при подходящих условиях была изменена со 100% на 25%. Причиной послужило то, что при 100% колония клеток превращалась в куб, что больше подходит для моделирования кристаллов. Далее на картинках - зависимость формы и вида колонии от вероятности рождения клетки.
Видно, что куб ещё и создаёт слишком вульгарные для искусственной колонии клеток узоры. При 50% вместо узора уже расходятся "волны смерти" - вымирание поколений клеток, располагающихся подобно кольцам на срезе ствола дерева. На этом можно было и остановиться, однако мне хотелось придать волнам более округлую форму. Разумеется, клетки занимали всё доступное им поле, а волны постепенно размывались.
Начало симуляции было положено. Предстояло ещё много работы. В планах было добавление генов и механизма их наследования. Об этом - в следующей части.