# [Отчёт тут](./REPORT.md) # Лабораторная работа: Клеточные автоматы ## Цель работы Изучение принципов функционирования и приобретение навыков программной реализации клеточных автоматов как дискретных вычислительных моделей. ## Правила игры "Жизнь" (Game of Life) Классические правила Конвея: 1. В пустой (мёртвой) клетке, с которой соседствуют три живые клетки, зарождается жизнь; 2. Если у живой клетки есть две или три живые соседки, клетка продолжает жить; 3. В противном случае (если живых соседей меньше двух или больше трёх) клетка умирает ("от одиночества" или "от перенаселённости"). ## Структура проекта ``` 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 (включён в проект) ### Команды сборки ```bash # Сборка проекта ./gradlew build # Запуск приложения ./gradlew run # Создание дистрибутива (запускаемый бинарник) ./gradlew installDist # Создание ZIP-дистрибутива ./gradlew distZip ``` ### Запуск скомпилированного приложения После сборки запустите: ```bash cd build/install/lab2 ./bin/lab2 ``` Или распакуйте дистрибутив: ```bash 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