2026-05-15 03:29:20 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 03:29:20 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 03:29:20 +03:00
2026-05-15 03:29:20 +03:00
2026-05-15 03:29:20 +03:00
2026-05-15 03:29:20 +03:00
2026-05-15 01:30:25 +03:00
2026-05-15 03:29:20 +03:00
2026-05-15 01:29:42 +03:00
2026-05-15 03:29:20 +03:00

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

Цель работы

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

Правила игры "Жизнь" (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 (включён в проект)

Команды сборки

# Сборка проекта
./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
Description
Игра в жизнь, клеточный автомат
Readme 205 KiB
Languages
Kotlin 100%