Лабораторная работа: Клеточные автоматы
Цель работы
Изучение принципов функционирования и приобретение навыков программной реализации клеточных автоматов как дискретных вычислительных моделей.
Правила игры "Жизнь" (Game of Life)
Классические правила Конвея:
- В пустой (мёртвой) клетке, с которой соседствуют три живые клетки, зарождается жизнь;
- Если у живой клетки есть две или три живые соседки, клетка продолжает жить;
- В противном случае (если живых соседей меньше двух или больше трёх) клетка умирает ("от одиночества" или "от перенаселённости").
Структура проекта
lab2/
├── src/main/kotlin/
│ ├── Main.kt # Точка входа в приложение
│ ├── model/
│ │ ├── Config.kt # Модель конфигурации (сериализуемая)
│ │ ├── GameOfLife.kt # Реализация Game of Life
│ │ ├── OneDimensionalCA.kt # Реализация 1D клеточного автомата
│ │ └── OneDimensionalRule.kt # Правила для 1D автомата
│ ├── ui/
│ │ ├── MainScreen.kt # Главный экран
│ │ ├── Sidebar.kt # Панель управления (слева)
│ │ └── gameoflife/
│ │ ├── GameOfLifeView.kt # Визуализация Game of Life
│ │ └── PatternClassifier.kt # Классификация паттернов
│ ├── data/
│ │ └── ConfigRepository.kt # Сохранение/загрузка JSON
│ └── util/
│ └── ExperimentRunner.kt # Запуск экспериментов
├── build.gradle.kts # Конфигурация сборки
└── config.json # Файл конфигурации (создаётся при запуске)
Реализованные задачи
Задание 1: Одномерный клеточный автомат
Реализован элементарный одномерный клеточный автомат с поддержкой правил:
- Правило 30 - хаотичный паттерн
- Правило 90 - фрактальный паттерн (треугольник Серпинского)
- Правило 110 - универсальный клеточный автомат (эквивалент машине Тьюринга)
- Правило 184 - модель дорожного движения
Функциональность:
- Визуализация нескольких итераций эволюции автомата
- Режимы отображения: "Трейс" (история поколений) и "Текущее" (только последнее поколение)
- Настраиваемая ширина поля (10-200 ячеек)
- Начальные условия: центр или случайное заполнение
Задание 2: Двумерный клеточный автомат "Жизнь"
Реализована полная модель Game of Life с:
- Классическими правилами Конвея
- Интерактивным полем (клик для изменения состояния клетки)
- Отображением номера поколения и количества живых клеток
Задание 2.1: Серия экспериментов
Проводятся эксперименты со случайным начальным заполнением:
- Плотности: 0.1, 0.2, 0.3, 0.4, 0.5
- 10 запусков для каждой плотности
- Фиксация времени стабилизации (N=10 поколений без изменения population)
- Результаты сохраняются в
stabilization_graph.png
Стабильной фазой считается момент, когда в течение 10 поколений общее количество живых клеток не меняется или меняется циклически между двумя значениями.
Задание 2.2: График зависимости
По результатам экспериментов строится график зависимости среднего времени стабилизации от начальной плотности заполнения (используется библиотека XChart).
Задание 2.3: Классификация паттернов
Автоматическая классификация обнаруженных фигур:
- Устойчивые (Still Life): блок, улей, лодка, труба
- Периодические (Oscillators): бликер, пульсар
- Движущиеся (Spaceships): глайдер (glider)
- Малые фигуры: одиночная клетка, пара, триада
Подсчитывается количество изолированных комбинаций клеток (объектов) и отображается в интерфейсе.
Интерфейс приложения
Сайдбар (слева)
- Выбор режима автомата (1D / Game of Life)
- Выбор правила для 1D автомата
- Настройка размера поля (10-500 для 2D, 10-200 для 1D)
- Настройка скорости симуляции (1-60 FPS)
- Настройка вероятности заполнения (для случайного запуска)
- Кнопки: Старт/Стоп, Сброс, Случайное заполнение
- Запуск экспериментов (только для Game of Life)
- Загрузка/сохранение паттернов из файла
Поле (справа)
- Интерактивная сетка клеток
- Для Game of Life: клик для изменения состояния клетки
- Отображение текущего состояния в реальном времени
Сохранение конфигурации
Конфигурация автоматически сохраняется в файл config.json при каждом изменении настроек. Включает:
- Текущий режим автомата
- Размер поля
- Скорость симуляции
- Вероятность заполнения
- Выбранное правило для 1D
- Текущее состояние поля
Сборка и запуск
Требования
- JDK 21
- Gradle (включён в проект)
Команды сборки
# Сборка проекта
./gradlew build
# Запуск приложения
./gradlew run
# Создание дистрибутива (запускаемый бинарник)
./gradlew installDist
# Создание ZIP-дистрибутива
./gradlew distZip
Запуск скомпилированного приложения
После сборки запустите:
cd build/install/lab2
./bin/lab2
Или распакуйте дистрибутив:
unzip build/distributions/lab2-1.0.zip
./lab2-1.0/bin/lab2
Примечание: Для запуска требуется графическое окружение (X11/Wayland).
Технологии
- Язык: Kotlin 2.3.0
- UI Framework: Jetpack Compose for Desktop
- Графики: XChart 3.8.8
- Сериализация: Kotlinx Serialization 1.7.3
- Сборка: Gradle с Compose Plugin