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