Здравствуй, Хабр!

В 2012 году я написал пост о своем увлечении — Космики: моделирование эволюции многоклеточных организмов


С того момента прошло без малого 7 лет, в течение которых я работал над развитием этого проекта. Сегодня я хочу рассказать немного о том, что научился делать, и как планирую развивать проект дальше.

Мотивация «Большая эволюция»


Космики 2012 — прекрасный пример ощущения «эффекта погружения» от просмотра, который стал отправной точкой в развитии идеи сделать «симуляцию жизни на GPU».

Однако, настоящей эволюции там не происходило: процесс должен развиваться непрерывно, а не приходить к некоторому конечному состоянию через несколько минут после запуска.

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

Физика


Физику можно придумать любую: с помощью GPU можно построить очень широкий спектр моделей с количеством элементов, достаточным для течения эволюционных процессов в реальном времени. Любые комбинации принципов взаимодействия неких «элементов», «атомов», «клеток» — порождают эволюционирующий конструктор форм, в котором буквально из ничего может само-собираться некоторая сложно-организованная симуляция.

В начале, мне захотелось создать многоклеточную материю, которая позволит космикам непосредственно касаться друг друга, «не пролетая насквозь», имея структуру из шариков, соединенных друг с другом в мозаику, на манер клеточных тканей настоящих организмов.

Это было нужно, чтобы организмы стали более похожи на настоящие, и появился физический смысл в различном строении их тел. Можно «нарисовать» такими клетками тело с кожей, конечностями, мышцами, лапками, внутренними органами — и такие тела будут буквально существовать и развиваться внутри симуляции.

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

Я разобрался в том, как устроен 3D пример — и написал свою симуляцию для 2D.
На тогдашней GTX 580 это позволяло вычислять 256 тысяч частиц в реальном времени.


CUDA + JavaScript


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

Примерно в 100 раз удобнее и быстрее на JS.
И примерно в 1000 раз производительнее на GPU.

Решение было — написать физику взаимодействия частиц на CUDA, и дать возможность создавать частицы и управлять их параметрами из JavaScript, встроив появившийся тогда движок Google V8 в симуляцию в качестве языка сценариев.

Я добавил возможность соединять частицы такими же «резинками», какими они соединялись в первых космиках. В итоге, можно было написать в управляющем JS скрипте код:

var ball1 = new Ball();
var ball2 = new Ball();

ball1.xy = [0,0];
ball1.rgb = [1,1,1];

ball2.xy = [1,0];
ball2.rgb = [1,1,1];

var link = new Link(ball1, ball2);

и на экране появлялось два белых шарика, соединенных друг с другом «резинкой».

уже на этом уровне развития движка появились интересные возможности для экспериментов с виртуальной физикой:


Строение


Добавив несколько свойств шарикам, таких как прочность связи, масса, размер, упругость — я получил управляемый из JavaScript конструктор, в котором можно было нарисовать структуры тысяч существ, состоящих из клеток разных физических свойств — и всё это в реальном времени обсчитывал GPU.

Как баланс между ценой и качеством, была выбрана мягкая обтекаемая форма космика-осьминога.

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


Моторика


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

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

С помощью небольшой случайно мутирующей рекуррентной нейросети (порядка 10-100 нейронов) и простого отбора лучших особей по критерию, например, «кто смог дальше переместиться» — можно вызвать нужную кинематику движения под каждую индивидуальную форму тела:


Генезис


Ещё одной активно исследуемой формой тела стали «хексоиды». Тела таких существ состоят из клеток, формирующих произвольные формы из шариков одинакового размера на основе нестрогой решетки, близкой к гексагональной.

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

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


Охота и размножение


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

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

Для первого эксперимента я использовал клетки 4 типов:

  • пищеварительная клетка (цветная) — при прикосновении к телу другого космика, откусывает кусочек
  • броня (светлая) — более прочная механически клетка, которую нельзя откусить
  • соединительная ткань (серая) — мягкая эластичная материя
  • двигательная клетка (темная) — позволяет космикам быстрее перемещаться

Как только космик съедает достаточное количество клеток, он «делится», формируя рядом свою немного мутировавшую копию.

Такой процесс уже порождает формы с дифференцированным строением и поведением:



Среда обитания


Пустой холодный космос — не лучшее место для обитания.

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

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

На влажной почве, при хорошем освещении, могут расти растения. Растительная масса является первичным источником органической пищи для животных форм.

Животные тела, распадаясь, возвращают неорганические вещества обратно в экосистему биома.





P.S.


Это обзорная статья, размеры которой не позволяют связно раскрыть все направления, в которых развивается проект.

Сейчас я работаю над полнофункциональным интерактивным конструктором, который даст возможность «поиграть в космиков» в режиме песочницы, конструировать новые виды существ, рисовать экосистемы «в режиме Бога» и наблюдать эволюцию в реальном времени.

Что касается технической части, прогресс не стоит на месте: с 2012 года 4 раза менялась парадигма разработки, постепенно перемещаясь от описанной в данной статье концепции CUDA+JS в направлении GPU ORM моделей, работающих полностью на GPU side и имеющих собственный объектный язык хранимых процедур.

Пока всё, спасибо за внимание!

Следить за развитием проекта и поддержать разработку можно тут:

https://www.patreon.com/cosmics_project

Постов в блоге пока мало, но если будут подписчики — обещаю выкладывать, за 7 лет накопилось бессовестно много контента

В завершение — немного рабочего инсайта:

Комментарии (20)


  1. wentout
    24.09.2019 13:43
    +2

    Очуметь.
    Челюсть в пол… Спасибо за статью!
    С нетерпением жду следующих статей и надеюсь когда-нибудь увидеть исходнички :)


    1. nuzni
      25.09.2019 13:37

      +1


  1. s_berez
    24.09.2019 13:45
    +2

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


  1. A114n
    24.09.2019 14:16
    +1

    Это просто шикарно!


  1. diogen4212
    24.09.2019 14:25

    эту бы прогу, да на таком движке и в 3D… с разными типами клеток интересная идея


    1. pavel_kudinov Автор
      24.09.2019 14:28

      3D режим у меня есть, а движок специально сделан для создания в принципе любых симуляций. В этой статье я показал только одну из симуляций, над которыми работаю.

      Пробовал написать сборную статью обо всем, но получается слишком много материала, так что буду выкладывать по отдельности о каждой симуляции


  1. Buagir
    24.09.2019 15:59
    +1

    Здорово! С обалдением прочитал. Следим за дальнейшими успехами :)


  1. RomanoBruno
    24.09.2019 16:07
    +1

    Павел, ты прям как Шойгу.
    раз в 7 лет отчитываешься))


  1. ivan_jpeg
    24.09.2019 18:19
    +1

    Впечатляет. Поистине фундаментальная песочница получается :)


  1. Geotyper
    24.09.2019 20:59


    1. dim2r
      25.09.2019 10:27

      Интересно, есть ли какие-нибудь исследования чтобы генетически вывести какой-нибудь молекулярный двигатель, которые работает от энергии броуновского движения?


    1. pavel_kudinov Автор
      25.09.2019 11:59

      Спасибо!


  1. DmitrySpb79
    24.09.2019 23:09

    Спасибо, интересно.

    Кстати любопытно, существовали ли какие-то научные проекты симуляции жизни на суперкомпьютерах? И что в итоге получилось?


    1. lytkarinsky
      25.09.2019 11:43

      Получились мы


    1. vvvvvvv
      25.09.2019 11:43
      +1

      http://openworm.org/ — симулируют круглого червя Caenorhabditis elegans.


  1. Fenzales
    25.09.2019 11:38
    +1

    Очень круто. Сам лет пять назад делал клеточную симуляцию (в смысле на сетке) с поведенческой эволюцией, но это на три головы выше. Нет планов выводить в опенсурс?


    1. pavel_kudinov Автор
      25.09.2019 11:57

      Спасибо!

      Планы на опенсурс есть, каскадные. Там фреймворк для GPU программирования, на нем написан движок для создания интерактивных симуляций (физический sandbox) и на движке уже — несколько различных симуляций, космики — одна из них

      Сейчас примерно представляю себе так — релизнуть в STEAM игру, потом выложить в опенсурс фреймворк и, возможно, движок, а через время для мододелов — уже исходники самих симуляций, которые игры


  1. solariserj
    25.09.2019 13:45

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


    1. pavel_kudinov Автор
      25.09.2019 14:54

      Да, согласен, годичные и суточные циркадные ритмы, а также климатические зоны — есть в планах.

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


  1. tvoyznakomy
    27.09.2019 14:48

    Помню еще в молодости часами игрался с gene pool — тогда это казалось крутой штукой…