[2] 2-nd-exersize #246

Merged
kit8nino merged 7 commits from SavelevMI/2026-rff_mp:2-nd-exersize into develop 2026-05-30 11:54:54 +00:00
Showing only changes of commit 3672b4f4d0 - Show all commits

View File

@ -0,0 +1,66 @@
# Отчёт по лабораторной работе №2 «Поиск выхода из лабиринта»
## Цель работы
Разработать программу для поиска выхода из лабиринта с возможностью выбора алгоритма (BFS, DFS, A*), визуализацией и экспериментальным сравнением. Применить минимум 3 паттерна проектирования.
## Использованные паттерны
**1. Builder (Строитель)** загрузка лабиринта из файла. Скрывает парсинг символов (#, S, E), проверку наличия ровно одного входа и выхода. При добавлении нового формата (JSON, XML) достаточно реализовать новый строитель.
**2. Strategy (Стратегия)** алгоритмы поиска пути. BFS, DFS и A* реализуют общий интерфейс. Класс MazeSolver переключает стратегию одной строкой. Новый алгоритм добавляется без изменения существующего кода.
**3. Observer (Наблюдатель)** консольная визуализация. MazeSolver уведомляет наблюдателей о событиях (найден путь, загружен лабиринт). Позволяет легко заменить консоль на графический интерфейс.
**4. Command (Команда)** пошаговое управление игроком. MoveCommand хранит направление и позволяет отменить ход (undo). История команд в стеке даёт откат действий.
## Результаты экспериментов
**Условия**: 4 лабиринта, 5 запусков на алгоритм, замеры времени (мс), посещённых клеток и длины пути.
| Лабиринт | Алгоритм | Время (мс) | Посещено | Длина пути |
|----------|----------|------------|----------|------------|
| Small (10×6) | BFS | 0.069 | 28 | 12 |
| Small (10×6) | DFS | 0.021 | 18 | 12 |
| Small (10×6) | A* | 0.112 | 28 | 12 |
| Medium (10×10) | BFS | 0.011 | 10 | 5 |
| Medium (10×10) | DFS | 0.018 | 13 | 9 |
| Medium (10×10) | A* | 0.012 | 5 | 5 |
| Large (20×20) | BFS | 0.043 | 30 | 11 |
| Large (20×20) | DFS | 0.051 | 29 | 15 |
| Large (20×20) | A* | 0.059 | 24 | 11 |
| Empty (15×15) | BFS | 0.063 | 55 | 10 |
| Empty (15×15) | DFS | 0.105 | 130 | 58 |
| Empty (15×15) | A* | 0.025 | 10 | 10 |
**Лабиринт без выхода** Builder корректно выбросил исключение (S=1, E=0).
## Анализ
**BFS**: всегда находит кратчайший путь, но исследует много клеток. На Empty посетил 55 клеток (A* 10).
**DFS**: самый быстрый на Small (0.021 мс), но непредсказуем. На Empty путь оказался в 5.8 раз длиннее оптимального (58 против 10). Не подходит для навигации.
**A***: стабильно даёт кратчайший путь и минимум посещённых клеток. На Medium посетил 5 клеток (ровно длина пути), на Empty 10 против 55 у BFS. Лёгкое замедление на Small (0.112 мс) окупается эффективностью.
**Ключевые выводы**:
- На пустом поле A* в 5.5 раз быстрее BFS и в 4.2 раза быстрее DFS
- DFS на пустом поле заблудился и прошёл 130 клеток вместо 10
- На Medium A* идеален 5 посещённых клеток при длине пути 5
## Выводы по паттернам
**Builder** спас от падения на лабиринте без выхода, валидация на месте. **Strategy** переключение алгоритмов заняло одну строку, сравнение тривиально. **Observer** визуализация не засоряет код поиска. **Command** undo реализован без изменения класса игрока.
Без паттернов пришлось бы переписывать код при каждом изменении формата, алгоритма или способа вывода.
## Рекомендации
| Сценарий | Алгоритм |
|----------|----------|
| Нужен кратчайший путь + есть эвристика | A* |
| Нужен кратчайший путь + нет эвристики | BFS |
| Любой путь + экономия памяти | DFS |
| Пустой лабиринт | A* (в 5 раз быстрее BFS) |
**Итог**: для большинства задач оптимален **A*** кратчайший путь и минимум посещений. BFS резервный вариант. DFS только при жёсткой нехватке памяти.