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

5.3 KiB
Raw Blame History

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