Files
systems-lab2/REPORT.md
2026-05-15 03:29:20 +03:00

5.9 KiB
Raw Permalink Blame History

Лабораторная работа: Клеточные автоматы

Университет ИТМО

Студент: Владимиров Владислав Александрович
Группа: P3322
Дата: 15.05.2026

Цель работы

Изучение принципов функционирования и приобретение навыков программной реализации клеточных автоматов как дискретных вычислительных моделей.

Диаграмма классов

AppState
 |-- config: AppConfig
 |-- action: UiAction?

AppConfig (serializable)
 |-- mode: AutomatonMode
 |-- gridWidth: Int
 |-- gridHeight: Int
 |-- simulationSpeed: Int
 |-- probability: Double
 |-- oneDimensionalRule: OneDimensionalRule
 |-- killAtBoundary: Boolean

AutomatonMode: GAME_OF_LIFE | ONE_DIMENSIONAL
OneDimensionalRule: RULE_30 | RULE_90 | RULE_110 | RULE_184

GameOfLife
 |-- width: Int
 |-- height: Int
 |-- killAtBoundary: Boolean
 |-- initialize(probability): void
 |-- step(): Int
 |-- getGrid(): Array<Array<Boolean>>
 |-- getLiveCellCount(): Int
 |-- toggleCell(x, y): void

OneDimensionalCA
 |-- width: Int
 |-- rule: OneDimensionalRule
 |-- initialize(centerPosition): void
 |-- initializeRandom(probability): void
 |-- step(): BooleanArray
 |-- getGenerations(count): List<BooleanArray>

PatternClassifier
 |-- classifyPatterns(Array<Array<Boolean>>): List<PatternInfo>

ExperimentRunner
 |-- runExperiments(width, height): List<ExperimentResult>
 |-- generateGraph(results, outputPath): void

Взаимодействие: Main.kt -> MainScreen -> Sidebar + GameOfLifeView | OneDimensionalView. Конфигурация сохраняется в config.json через ConfigRepository.

Визуализация эволюции автоматов

Одномерный клеточный автомат (Rule 30, 90, 110)

Правило 30 генерирует хаотичный паттерн. Правило 90 создаёт фрактальный треугольник Серпинского. Правило 110 демонстрирует универсальные вычислительные свойства.

Rule 30

img.png

Rule 90

img_1.png

Rule 110

img_2.png

Game of Life (Двумерный клеточный автомат)

Начальное заполнение: случайное (p = 0.3), поле 50x50, 100 поколений. img_3.png

Стабилизация за 429 поколений

gameoflifeend.png Выявленные паттерны:

Тип Название Классификация
Block (2x2) Блок Устойчивая фигура
Beehive (3x3, 6 клеток) Улей Устойчивая фигура
Loaf (3x3, 5 клеток) Буханка Устойчивая фигура
Boat (3x2, 5 клеток) Лодка Устойчивая фигура
Glider (5 клеток) Глайдер Движущаяся фигура

Глайдер перемещается по диагонали со скоростью c/4 (один шаг по диагонали каждые 4 поколения). Блок, улей, буханка и лодка остаются неизменными во всех поколениях. Бликер (3 клетки в линию, периодичность 2) — пример периодической фигуры.

Результаты экспериментов

Таблица времени стабилизации

Плотность (p) Среднее время стабилизации (поколений)
0.10 460
0.15 580
0.20 618
0.25 634
0.30 621
0.35 642
0.40 622
0.45 632
0.50 639

Количество запусков на каждую плотность: 100. Размер поля: 50x50. Условие стабилизации: 10 поколений без изменения популяции (или циклические изменения между двумя значениями).

График

stabilization_graph.png

График сохранён в файл stabilization_graph.png.

Анализ результатов

При низкой плотности (p = 0.10) система стабилизируется быстро (460 поколений) из-за вымирания изолированных клеток. Большинство конфигураций умирает в первые 100-200 поколений.

Хаотическая фаза наблюдается при плотности p = 0.25-0.35, где время стабилизации достигает 620-640 поколений. При этих плотностях образуется максимальное количество взаимодействующих структур (глайдеры, ружья, блоки), что затягивает стабилизацию.

При высокой плотности (p = 0.45-0.50) время стабилизации остаётся высоким (630-640), однако причина отличается: образуются крупные устойчивые и периодические структуры (улей, блоки), которые переходят в стабильную фазу без вымирания. Система не "вымирает", а кристаллизуется в насыщенный паттерн.

Максимальное время стабилизации: p = 0.35 (642 поколения) и 0.5. Минимальное: p = 0.10 (460 поколений).

Исходный код доступен тут вот -> https://git.illegalfiles.icu/vlad.os/systems-lab2