159 lines
8.1 KiB
Markdown
159 lines
8.1 KiB
Markdown
# [Отчёт тут](./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 |