2026-rff_mp/SavelevMI/docs/report-2.md

66 lines
5.3 KiB
Markdown
Raw 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.

# Отчёт по лабораторной работе №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 только при жёсткой нехватке памяти.