Черновик

Эволюционный клеточный автомат

Цифровое генеративное искусство — это когда когда художник доверяет алгоритму принять вместо него часть решений.

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

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

Уровни моделирования

В модели несколько уровней:

  • Физический
  • Биологический
  • Когнитивный

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

[Тут видео клеток крупным кланом]

На биологическом уровне в модели появляется энергия. Организмы расходуют её на движение, при размножении энергия делится между потомками. Без энергии организмы погибают.

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

На когнитивном уровне — у организмов есть геном, определяющий их поведение и цвет.

Геном состоит из 64 чисел от 1 до 64. Значения могут восприниматься организмом как команды, например:

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

Есть ещё команда условного перехода к другой части ДНК при выполнении определённых условий. Это делает поведение организмов зависимым от условий: уровня энергии организма и градиента питательных веществ в среде.

Значения генома могут служить не только командами, но и параметрами команд. Например, на какой именно угол повернуть или с какой вероятностью мутировать при размножении.

Вначале ДНК набирается из случайных кусочков ЭЭГ. Большинство организмов гибнет сразу же: одни не питаются, другие тратят энергию на движение или размножение быстрее, чем накапливают.

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

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

Реализация

Скрипт написан на Javascript с WebGL. Параметры организмов и их ДНК хранятся в восьми float текстурах. Данные ЭЭГ быстрым преобразованием Фурье раскладываются по частотам, агрегируются и передаются в шейдер. Вычисление происходит в браузере в реальном времени.

Потом подробнее напишу про:

Частицы на фрагментном шейдере

Идею алгоритма взял из блога Михайло Мороза: четыре канала пикселя (RGBA) можно использовать для хранения координат и скорости частицы на плоскости. Интересно сравнить такой способ с более популярным способом управления частицами — вершинным шейдером.

Частицы на вершинном шейдере На фрагментном
Идея Частица вычисляет свои координаты Пиксель вычисляет положение и скорость своей частицы, если она там есть.
Хранение данных В FBO или буфере Частица в пикселе, который хранит информацию о ней
Макс. скорость Любая 𝓋=1…~3px. Каждый пиксель проверяет, не прилетела ли в него него частица из 𝛑𝓋² соседей
Число частиц Фиксировано. Тормоза начинаются после 1M, зависит от сложности их поведения Может меняться. Число частиц ограничено числом пикселей текстуры, их число не влияет на скорость. На скорость влияет только число проверяемых соседей
Взаимодействие Частица не знает, есть ли другие рядом Частица может заглянуть в соседние пиксели и повзаимодействовать с их содержимым
Столкновение Не сталкиваются. Если две частицы залетят в один пиксель, одна из них затрёт другую
Сложность дебага ᕕ( ᐛ )ᕗ (ノಠ益ಠ)ノ彡┻━┻

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

Хранение данных

На картинке куча мелких клеточек, каждая выделяет цветные вещества. Какие — зависит от ДНК, также как и поведение клетки: повороты, изменение скорости. Гены передаются потомкам при делении

Мне понравилась идея ТехноШамана про интерпретацию ДНК. В двух словах. У каждой клетки есть «ДНК» — массив из 64 элементов, каждый из которых может принимать одно из 64 значений. Ещё клетка помнит номер текущей своей команты. А команды могут быть как простые: «сдвинуться», «размножиться», так и хитрые: «если энергии больше 10 единиц, перейти к команде номер 5, иначе — к команде 43».

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