Files
systems-lab2/REPORT.md
2026-05-15 03:29:20 +03:00

124 lines
5.9 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.
# Лабораторная работа: Клеточные автоматы
# Университет ИТМО
**Студент:** Владимиров Владислав Александрович
**Группа:** P3322\
**Дата:** 15.05.2026
## Цель работы
Изучение принципов функционирования и приобретение навыков программной реализации клеточных автоматов как дискретных вычислительных моделей.
## Диаграмма классов
```
AppState
|-- config: AppConfig
|-- action: UiAction?
AppConfig (serializable)
|-- mode: AutomatonMode
|-- gridWidth: Int
|-- gridHeight: Int
|-- simulationSpeed: Int
|-- probability: Double
|-- oneDimensionalRule: OneDimensionalRule
|-- killAtBoundary: Boolean
AutomatonMode: GAME_OF_LIFE | ONE_DIMENSIONAL
OneDimensionalRule: RULE_30 | RULE_90 | RULE_110 | RULE_184
GameOfLife
|-- width: Int
|-- height: Int
|-- killAtBoundary: Boolean
|-- initialize(probability): void
|-- step(): Int
|-- getGrid(): Array<Array<Boolean>>
|-- getLiveCellCount(): Int
|-- toggleCell(x, y): void
OneDimensionalCA
|-- width: Int
|-- rule: OneDimensionalRule
|-- initialize(centerPosition): void
|-- initializeRandom(probability): void
|-- step(): BooleanArray
|-- getGenerations(count): List<BooleanArray>
PatternClassifier
|-- classifyPatterns(Array<Array<Boolean>>): List<PatternInfo>
ExperimentRunner
|-- runExperiments(width, height): List<ExperimentResult>
|-- generateGraph(results, outputPath): void
```
Взаимодействие: `Main.kt` -> `MainScreen` -> `Sidebar` + `GameOfLifeView` | `OneDimensionalView`. Конфигурация сохраняется в `config.json` через `ConfigRepository`.
## Визуализация эволюции автоматов
### Одномерный клеточный автомат (Rule 30, 90, 110)
Правило 30 генерирует хаотичный паттерн. Правило 90 создаёт фрактальный треугольник Серпинского. Правило 110 демонстрирует универсальные вычислительные свойства.
#### Rule 30
![img.png](img.png)
#### Rule 90
![img_1.png](img_1.png)
#### Rule 110
![img_2.png](img_2.png)
### Game of Life (Двумерный клеточный автомат)
Начальное заполнение: случайное (p = 0.3), поле 50x50, 100 поколений.
![img_3.png](img_3.png)
#### Стабилизация за 429 поколений
![gameoflifeend.png](gameoflifeend.png)
**Выявленные паттерны:**
| Тип | Название | Классификация |
|-----|----------|---------------|
| Block (2x2) | Блок | Устойчивая фигура |
| Beehive (3x3, 6 клеток) | Улей | Устойчивая фигура |
| Loaf (3x3, 5 клеток) | Буханка | Устойчивая фигура |
| Boat (3x2, 5 клеток) | Лодка | Устойчивая фигура |
| Glider (5 клеток) | Глайдер | Движущаяся фигура |
Глайдер перемещается по диагонали со скоростью c/4 (один шаг по диагонали каждые 4 поколения). Блок, улей, буханка и лодка остаются неизменными во всех поколениях. Бликер (3 клетки в линию, периодичность 2) — пример периодической фигуры.
## Результаты экспериментов
### Таблица времени стабилизации
| Плотность (p) | Среднее время стабилизации (поколений) |
|---------------|----------------------------------------|
| 0.10 | 460 |
| 0.15 | 580 |
| 0.20 | 618 |
| 0.25 | 634 |
| 0.30 | 621 |
| 0.35 | 642 |
| 0.40 | 622 |
| 0.45 | 632 |
| 0.50 | 639 |
Количество запусков на каждую плотность: 100. Размер поля: 50x50. Условие стабилизации: 10 поколений без изменения популяции (или циклические изменения между двумя значениями).
### График
![stabilization_graph.png](stabilization_graph.png)
График сохранён в файл `stabilization_graph.png`.
## Анализ результатов
При низкой плотности (p = 0.10) система стабилизируется быстро (460 поколений) из-за вымирания изолированных клеток. Большинство конфигураций умирает в первые 100-200 поколений.
Хаотическая фаза наблюдается при плотности p = 0.25-0.35, где время стабилизации достигает 620-640 поколений. При этих плотностях образуется максимальное количество взаимодействующих структур (глайдеры, ружья, блоки), что затягивает стабилизацию.
При высокой плотности (p = 0.45-0.50) время стабилизации остаётся высоким (630-640), однако причина отличается: образуются крупные устойчивые и периодические структуры (улей, блоки), которые переходят в стабильную фазу без вымирания. Система не "вымирает", а кристаллизуется в насыщенный паттерн.
Максимальное время стабилизации: p = 0.35 (642 поколения) и 0.5. Минимальное: p = 0.10 (460 поколений).
Исходный код доступен тут вот -> https://git.illegalfiles.icu/vlad.os/systems-lab2