Клеточные автоматы: сложность из простых правил

simulator beginner ~7 min
Загрузка симуляции...
Правило 30 — хаотический паттерн из одной ячейки

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

Формула

cell(t+1, i) = rule[ cell(t, i-1) · 4 + cell(t, i) · 2 + cell(t, i+1) ]
Rule number = Σ output(k) · 2^k for k = 0..7

Простые правила, сложное поведение

Элементарные клеточные автоматы — одни из простейших вычислительных систем: ряд ячеек, каждая включена или выключена, обновляющихся одновременно по локальному правилу, учитывающему лишь три ячейки (левый сосед, сама ячейка, правый сосед). Существует ровно 256 возможных правил, пронумерованных от 0 до 255 по конвенции Стивена Вольфрама. Несмотря на предельную простоту, некоторые из этих правил порождают паттерны необычайной сложности.

Классификация Вольфрама

Вольфрам разделил 256 правил на четыре поведенческих класса. Правила класса 1 (напр., правило 0, правило 255) быстро схлопываются в однородное состояние. Правила класса 2 (напр., правило 4, правило 108) создают простые периодические паттерны — полоски, треугольники, повторяющиеся блоки. Правила класса 3 (напр., правило 30, правило 90) порождают хаотические, на вид случайные паттерны. Правила класса 4 (напр., правило 110) находятся на границе — создают сложные долгоживущие структуры, взаимодействующие замысловатым образом.

Ключевые правила для исследования

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

Правило 90 — создаёт треугольник Серпинского, знаменитый фрактал. Это потому, что правило 90 эквивалентно XOR двух соседей, а двоичные строки треугольника Паскаля по модулю 2 дают тот же паттерн.

Правило 110 — доказано полным по Тьюрингу Мэтью Куком в 2004 году. Это означает, что в принципе этот простейший одномерный автомат может выполнить любое вычисление — глубочайший результат, связывающий простейшие системы с самыми мощными.

Эмерджентность и вычисления

Клеточные автоматы демонстрируют фундаментальный принцип: сложное глобальное поведение может возникать из простых локальных правил без центрального управления. Этот принцип лежит в основе явлений от роста кристаллов до пробок и развития биологических организмов. Тот факт, что правило 110 вычислительно универсально, предполагает, что способность к сложности присуща даже минимальным системам.

Частые вопросы

Что такое элементарный клеточный автомат?

Элементарный клеточный автомат — одномерный массив ячеек, каждая из которых равна 0 или 1, эволюционирующий в дискретных шагах. Следующее состояние каждой ячейки зависит от текущего состояния и двух соседей — всего 8 возможных входных комбинаций. Номер правила (0–255) кодирует выход для каждой комбинации как 8-битное двоичное число.

Что такое правило 30?

Правило 30 (двоичное: 00011110) — элементарный клеточный автомат, порождающий хаотическое апериодическое поведение из одной начальной ячейки. Его паттерны проходят статистические тесты на случайность, и Вольфрам использовал его в Mathematica как генератор случайных чисел.

Что такое правило 110?

Правило 110 доказано полным по Тьюрингу — то есть оно способно выполнить любое вычисление, доступное универсальному компьютеру. Это одна из простейших известных систем с вычислительной универсальностью, как доказал Мэтью Кук в 2004 году.

Каковы четыре класса клеточных автоматов по Вольфраму?

Стивен Вольфрам классифицировал клеточные автоматы на четыре класса: класс 1 (сходятся к однородному состоянию), класс 2 (порождают периодические структуры), класс 3 (хаотические, на вид случайные паттерны), класс 4 (сложные локализованные структуры — «край хаоса»).

Источники

Встроить

<iframe src="https://homo-deus.com/lab/chaos-theory/cellular-automaton/embed" width="100%" height="400" frameborder="0"></iframe>
View source on GitHub