From 7e124d2f5082e433b2de1bca9812fc65366f3f22 Mon Sep 17 00:00:00 2001 From: BoriskovaDV Date: Sun, 24 May 2026 20:22:01 +0000 Subject: [PATCH] [2] add report for 2-nd lab --- BoriskovaDV/docs/report2.md | 92 +++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 BoriskovaDV/docs/report2.md diff --git a/BoriskovaDV/docs/report2.md b/BoriskovaDV/docs/report2.md new file mode 100644 index 0000000..b18c829 --- /dev/null +++ b/BoriskovaDV/docs/report2.md @@ -0,0 +1,92 @@ +# Отчёт по лабораторной работе: Алгоритмы поиска пути в лабиринте + +## 1. Цель работы + +Разработка программы для загрузки лабиринта из текстового файла, реализации трёх алгоритмов поиска пути (BFS, DFS, A\*) и проведения экспериментального сравнения их эффективности на лабиринтах различной сложности. + +## 2. Структура программы + +Программа написана на Python 3 и состоит из следующих основных классов: + +- `GridPoint` – представление клетки лабиринта (координаты, проходимость, флаги старта/выхода); +- `Labyrinth` – модель лабиринта (сетка клеток, методы получения соседей); +- `TextMazeLoader` – загрузка лабиринта из файла с символами `#` (стена), `S` (старт), `E` (выход); +- `SearchAlgorithm` (и наследники `BreadthFirst`, `DepthFirst`, `AStar`) – реализация алгоритмов поиска; +- `LabyrinthSolver` – класс-оркестратор, позволяющий сменить стратегию и измеряющий время выполнения; +- `Player`, `Command`, `MoveCommand`, `InteractiveView` – для интерактивного режима с отменой ходов; +- функции `run_experiment` и `generate_plots` – для многократных запусков и построения графиков. + +## 3. Описание алгоритмов + +### 3.1 BFS (поиск в ширину) +Использует очередь. Гарантирует нахождение кратчайшего пути (по числу шагов). Обходит клетки в порядке увеличения расстояния от старта. + +### 3.2 DFS (поиск в глубину) +Использует стек. Идёт «вглубь» по одному пути, не гарантирует кратчайший путь. Обычно быстрее по времени и памяти на больших лабиринтах. + +### 3.3 A* (звездочка) +Использует приоритетную очередь и эвристику (манхэттенское расстояние). Оценивает клетку по формуле `f = g + h`, где `g` – пройденное расстояние, `h` – эвристика. Находит оптимальный путь, если эвристика допустима. + +## 4. Методика эксперимента + +Для каждого лабиринта каждый алгоритм запускался 3 раза, результаты усреднялись. Измерялись: +- время выполнения (в миллисекундах); +- количество посещённых клеток; +- длина найденного пути. + +Тестовые лабиринты: + +| Название | Размер | Описание | +|----------|--------|-----------| +| Small 10x6 | 10×6 | Простой лабиринт с извилистым коридором | +| Medium 10x10 | 10×10 | Лабиринт среднего размера с несколькими тупиками | +| Large 20x20 | 20×20 | Большой запутанный лабиринт | +| Empty 15x15 | 15×15 | Пустой лабиринт без стен (прямая линия от S до E) | +| No exit 10x10 | 10×10 | Лабиринт без буквы E (путь отсутствует) | + +## 5. Результаты экспериментов + +| Лабиринт | Алгоритм | Время, мс | Посещено клеток | Длина пути | +|----------------|----------|-----------|-----------------|------------| +| Small 10x6 | BFS | 0.057 | 25 | 16 | +| Small 10x6 | DFS | 0.057 | 24 | 16 | +| Small 10x6 | A* | 0.048 | 23 | 16 | +| Medium 10x10 | BFS | 0.048 | 47 | 16 | +| Medium 10x10 | DFS | 0.035 | 44 | 30 | +| Medium 10x10 | A* | 0.098 | 47 | 16 | +| Large 20x20 | BFS | 0.099 | 100 | 36 | +| Large 20x20 | DFS | 0.070 | 75 | 68 | +| Large 20x20 | A* | 0.165 | 85 | 36 | +| Empty 15x15 | BFS | 0.133 | 133 | 17 | +| Empty 15x15 | DFS | 0.114 | 161 | 89 | +| Empty 15x15 | A* | 0.154 | 65 | 17 | +| No exit 10x10 | BFS | 0.044 | 25 | 0 | +| No exit 10x10 | DFS | 0.059 | 25 | 0 | +| No exit 10x10 | A* | 0.046 | 25 | 0 | + +## 6. Анализ результатов + +### 6.1. Нахождение кратчайшего пути +- **BFS** и **A*** нашли оптимальные пути во всех лабиринтах, где выход существовал (длина пути совпадает для них в каждом случае). +- **DFS** в лабиринтах Medium, Large и Empty дал существенно более длинные пути (30 против 16, 68 против 36, 89 против 17), что характерно для глубинного обхода без эвристики. + +### 6.2. Время выполнения +- На малых лабиринтах все алгоритмы работают сопоставимо (0.035–0.099 мс). +- На лабиринте Large 20×20 BFS выполнился за 0.099 мс, A* – 0.165 мс (медленнее из-за сложности поддержки очереди с приоритетом), DFS – быстрее всех (0.070 мс). +- В пустом лабиринте BFS и A* обошли почти все клетки (133 и 65 посещённых соответственно), но A* за счёт эвристики посетил вдвое меньше клеток, хотя время оказалось чуть выше, чем у BFS (0.154 против 0.133 мс). Это объясняется накладными расходами на вычисление эвристики и управление кучей. + +### 6.3. Количество посещённых клеток +- **A*** показал лучшую эффективность в пустом лабиринте (65 посещённых против 133 у BFS и 161 у DFS). В лабиринтах со стенами разница не столь заметна, но A* почти всегда посещал меньше клеток, чем BFS. +- **DFS** в среднем посещает меньше клеток, чем BFS, но при этом путь часто неоптимален. +- **BFS** вынужден обходить всю область равных расстояний, поэтому посещённых клеток обычно больше. + +### 6.4. Поведение при отсутствии выхода +Все алгоритмы корректно завершились, вернув пустой путь (длина 0). В лабиринте без выхода BFS, DFS и A* посетили 25 клеток – это все доступные клетки. + +## 7. Выводы + +1. **BFS** надёжен для поиска кратчайшего пути, но может быть медленнее на больших открытых пространствах из-за широкого обхода. +2. **DFS** – самый быстрый по времени и экономный по памяти, но не гарантирует оптимальность пути. Его применение оправдано, когда любой путь подходит. +3. **A*** демонстрирует лучший баланс: находит кратчайший путь и при этом посещает меньше клеток, чем BFS. Небольшое замедление на сложных лабиринтах компенсируется меньшим числом обработанных клеток. +4. Программа успешно справляется с лабиринтами разного размера и конфигурации, включая отсутствие выхода. +5. Интерактивный режим с отменой ходов (паттерн Command) и выбором алгоритма (паттерн Strategy) реализован и работает корректно.