Pull to refresh

Поиграть в создателя всего сущего

Reading time 6 min
Views 18K

Введение


C тех давних пор, когда лучше ZX-Spectrum ничего не было, запомнилась игрушка, в которой надо было задать программу роботу, чтобы он в автономном плавании победил противника. И вот в свободное от работы и отдыха время я начал заниматься программой, которая при помощи настроек, считываемых из текстового файла в XML-формате позволяет:


  • создать плоский мир, по размерам ограниченный ресурсами компьютера. Вместо ледяной стены по краю у него появление с противоположного края, для объектов внутри мира он кажется непрерывным.
  • добавить неограниченное количество стационарных источников геотермальной энергии
  • наблюдать освещение солнцем в виде пятна, имитирующего движение светила со сменой времён суток и года.
  • описать минеральные вещества с разной степенью "летучести", то есть подверженности произвольному перемещению по поверхности из-за диффузии
  • описать химические реакции между веществами, которые могут осуществлять живые организмы под воздействием энергии
  • и, конечно же, наблюдать за "живыми" организмами.

Основное отличие от существующих игр — в модели нет предопределенного сценарием конца.


Мир модели


На картинке показан мир — большое пятно это солнечный свет (движется с течением времени), два пятна поменьше это источники другого вида энергии, названного геотермальной. Освещённая поверхность преимущественно голубого цвета потому, что в каждой точке содержит воду. Возникают и пропадают точки другого цвета в случае, если из-за диффузии относительная концентрация соответствующего элемента стала временно выше средней.


Рис.1


Для экономии расхода памяти количества вещества в каждой точке хранятся в вещественном типе float, что даёт 7 значимых разрядов. Для модели было задано в каждой точке воды 100 тыс. единиц, углекислого газа 20 тыс., водорода 10 единиц (то есть в десять тысяч раз меньше, чем воды), а кислорода и метана ноль. Пример, как выглядит описание веществ, вводимых в модель:


<Element name="CarbonDioxide" color="yellow" volatility="0.12" visibility="true">
    <rect left="0" top="0" right="max" bottom="max" amount="20000"/>
</Element>

<Element name="Oxygen" color="green" volatility="0.12" visibility="false">
    <rect left="0" top="0" right="max" bottom="max" amount="0"/>
</Element>
...

Далее была описана реакция образования метана и воды из углекислого газа и водорода при наличии геотермальной энергии.


<Reaction name="CO2+4H2=CH4+2H2O" geothermalEnergy="0.00001" solarEnergy="0">
    <LeftReagent name="CarbonDioxide" amount="1"/>
    <LeftReagent name="Hydrogen" amount="4"/>
    <RightReagent name="Methane" amount="1"/>
    <RightReagent name="Water" amount="2"/>
</Reaction>

Внутрь одного из геотермальных источников был посажен первый протоорганизм LUCA с данной реакцией


<section name="Organisms">
    <item name="LUCA" author="DEMI" x="300" y="30" reaction="CO2+4H2=CH4+2H2O"/>
</section>

Далее в программе был включен фильтр на показ точек, содержащих метан и пятно метана стало распространяться вокруг организма. Первая клетка может получать вещества только из той точки, где она сама находится, а перенос веществ осуществляется за счёт диффузии. Если уменьшить количество доступных веществ, то скорость распространения продуктов реакции резко замедляется.


Рис.2


В программе реализован режим приближения, когда точка увеличивается до квадрата, в котором отображается перечень содержащихся в нём веществ и живых организмов. Если включен фильтр для нескольких элементов, то для окраски точки используется цвет элемента с наибольшей относительной концентрацией в данной точке, иначе всегда было бы видно только воду, которой больше всего.


Рис.3


Отбор


Исходных веществ в изобилии, но рано или поздно все они будут исчерпаны. Если клетка успешно "переварила пищу", то она накапливает "жир" (внутреннюю энергию) и может размножиться делением, а при делении мутировать. Или погибнуть при истощении. Её поведение так же наследуется и подвержено мутациям, во время которых изменяется незначительная часть параметров клеточного автомата. Далее в модель будут введены управляемые мутации, когда пользователь будет лишь указывать, для какого вида какую мутацию он бы хотел получить. Ожидаемая мутация будет происходить с некоторой вероятностью и новый вид должен суметь выжить, чтобы мутировать дальше.


Итак, у нас есть вид протоорганизма-метаногена, которому нужна геотермальная энергия. Он расселяется в зоне действия геотермальной энергии, а те отдельные виды, которые диффузией выносит за её пределы — гибнут. Мертвые организмы некоторое время продолжают занимать место, а потом, если их никто не съел, исчезают. Расход минеральных веществ для роста организмов не реализован, соответственно при их распаде они просто исчезают. После запуска моделирования организмы бурно размножаются, занимая всю область вокруг геотермального источника. Через некоторое время появляются мёртвые клетки за пределами действия геотермальной энергии. Интересно, что иногда можно заметить, что умирают организмы в самом центре — это те, кому не хватило минеральных веществ, всё съели на подступах. На рисунке показаны живые организмы белым и мёртвые коричневым, синим цветом показана вода, розовой окружностью показана область, где ощущается геотермальная энергия (её интенсивность убывает по мере удаления от центра).


Рис.4


В мире описано несколько источников геотермальной энергии, первый протоорганизм был посажен в один из них. Когда моделирование продолжалось достаточно долго (несколько часов), я с удивлением обнаружил, что заселён и соседний источник — какому-то организму повезло добраться до него живым.


Сколь бы велик не был мир, если в нём будет протекать только одна реакция, весь углекислый газ (или водород) рано или поздно будет израсходован, после чего все организмы умрут с голода, оставив после себя обширные запасы метана.


На картинке включено отображение живого организма и метана (фиолетовое пятно, разросшееся вокруг геотермального источника) с показом подсветки от Солнца (на пятно метана начинают попадать первые лучи рано утром, солнце находится правее, а отображается чёрный цвет потому, что включено отображение только метана и живых организмов) и после включения полного освещения.


Рис.5


Если задать очень бедное распределение минеральных ресурсов, популяция находится на грани выживания — не более нескольких десятков особей. На рисунке показан вариант, когда водорода изначально было лишь на две реакции в каждой точке.


Рис.6


В файле Snapshoot2017.rar находится скомпилированный под Windows исполняемый файл и вспомогательные файлы к нему. Никакой установки не требуется, никаких следов от своей работы он не оставляет — для запуска достаточно просто разархивировать, а потом удалить. Для изменения параметров по-умолчанию — файл ThemeAero/template.demi можно открыть в простом текстовом редакторе. Элементы управления описаны в соответствующем разделе вики проекта.


Дальнейшие планы


Отбор организмов на основе их везения и изменчивости действует. Теперь нужно перейти к эволюции, пока ручной. Добавить в настроечный файл мутацию — организм с обратной реакцией, не требующий внешней энергии, но значительно менее эффективной. Теперь при делении протоорганизма изредка будет возникать дочерний вид, которому уже не привязан к источнику геотермальной энергии, но которому нужен продукт жизнедеятельности первого вида. В результате должен наступить баланс между двумя видами.


Далее у нас есть незадействованная солнечная энергия. В одной точке пространства может находится только один организм, что заставляет их конкурировать не только за энергию и вещество, но и за пространство.


Заключение


На текущий момент основная сложность это подобрать такое соотношение действующих объектов модели, чтобы она оставалась устойчивой и интересной. Это соотношение объёмов минеральных веществ, энергий, скоростей, метаболических реакций, а затем задачи из области "живой природы" — как обеспечить кодирование клеточных автоматов. Точнее нужны просто данные об окружающем мире в адаптированном виде. "ДНК" должна быть компактной, способной к атомарным неразрушительным мутациям, описывать как строение организма (набор клеток — нервная система, рецептор, мышца, броня и т.д.), так и алгоритм его действия.


В далеком будущем модель может стать распределённой — у каждого пользователя свой огород, где он разводит свои организмы, разбегающиеся по округе, и в который попадает живность от соседей. Крутизну можно измерять как распространённость вида.


Для меня этот проект развлечение и я не планирую извлекать какую-либо выгоду. А цель статьи — поиск людей, которым интересна эта область, которые могут поделиться своими наработками и идеями.


В программе технически расчет модели выполняется в отдельном потоке, его скорость можно оценить по тому, как быстро идёт модельное время и, соответственно, не зависит от того, в каком масштабе и с какими подробностями отрисовывается картинка на экране. Так же ещё есть отдельный поток, который визуализирует картинку из мира модели. Его скорость тем выше, чем меньше точек модели отображается — например когда при сильном увеличении на экран помещается небольшое количество точек, fps выше, чем когда при максимальном отдалении на экране весь мир целиком на широком мониторе. В левом верхнем углу выводится именно скорость отображения, которая ограничена 60 fps, быстрее бессмысленно.


P.S.: Модель является open source под GNU GPL Version 3, 29 June 2007 и доступна для скачивания всем желающим для экспериментов или для создания форков. Собрана с кросс-платформенной бибилиотекой ClanLib на MS VSС2015. Бинарный файл под OS Windows лежит в архиве — он никак не устанавливается, а просто запускается после распаковки. Предполагаю, что компиляция под другие платформы не вызовет проблем. Template.xml можно править в подходящем текстовом редакторе, некоторая документация есть на гитхабе в разделе wiki.

Tags:
Hubs:
+22
Comments 21
Comments Comments 21

Articles