Ниже приведена реализация клеточных автоматов с использованием Love2D (движок для разработки игр).

Итак, что такое клеточные автоматы?

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

«Игра жизни» Конвея — самый популярный двумерный клеточный автомат. Однако этот пример представляет собой реализацию одномерной сотовой автоматизации. Ниже приведен результат правила 30 (в код встроено много правил):

«Игра жизни» Конвея — один из самых известных двумерных клеточных автоматов. Однако этот пример представляет собой реализацию одномерной сотовой автоматизации. Ниже приведен результат правила 30 (в код встроено много правил).

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

Каждая ячейка определяется путем просмотра соседних ячеек из последней эпохи. Предположим, что длина каждой строки равна 5 для простоты и правила:

000 = 0
001 = 1
010 = 1
011 = 1
100 = 1
101 = 0
110 = 0
111 = 0
*The rule 0001 1110 is equivalent to 30 in decimal, hence rule 30.

Теперь мы устанавливаем первую эпоху на 00100, и результат равен 01110.

[epoch 0]    0    0    1    0    0
[epoch 1]    0
[epoch 0]    0    0    1    0    0
[epoch 1]    0    1

[epoch 0]    0    0    1    0    0
[epoch 1]    0    1    1

[epoch 0]    0    0    1    0    0
[epoch 1]    0    1    1    1

[epoch 0]    0    0    1    0    0
[epoch 1]    0    1    1    1    0
*The code assumes 0 on the edge cases.

Если мы продолжим применять это простое правило к каждой строке, возникнет очень сложное поведение, в результате чего будет сгенерирован шаблон, показанный на скриншоте выше!

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

function rules (i)
    local ruleset = {
        {0, 0, 0, 1, 1, 1, 1, 0}, -- Rule 30
        {0, 0, 1, 0, 1, 1, 0, 1}, -- Rule 45
        {0, 1, 0, 1, 1, 0, 1, 0}, -- Rule 90
        {0, 1, 1, 0, 1, 1, 1, 0}, -- rule 110
        {1, 0, 1, 1, 0, 1, 1, 0}, -- rule 182
        {1, 0, 1, 1, 1, 1, 1, 0}, -- rule 190
        {1, 1, 0, 1, 1, 1, 1, 0}, -- rule 222
    }
...

Это новый вид науки. Я до сих пор помню волнение, которое я получил от осознания смены парадигмы алгоритмов, порожденных алгоритмами (нейронными сетями). Теперь клеточные автоматы дают мне такие же вибрации, я не уверен, во что это превратится, но я верю, что это будет что-то прекрасное.

На эту историю повлиял Стивен Вольфрам, за что ему большое спасибо.

Полный код: https://github.com/booletic/cellular-automata