Здравствуй!
В 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 лет накопилось бессовестно много контента
В завершение — немного рабочего инсайта:
Автор: Павел Кудинов