Files
systems-lab2/README.md
vlad.os 8919a38f79 Обновить README.md
Написал где отчёт лежит чтобы наверняка
2026-05-15 00:31:45 +00:00

159 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# [Отчёт тут](./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