From 3672b4f4d0ef9f378f3f9de69e1edd11c23ed34f Mon Sep 17 00:00:00 2001 From: SavelevMI Date: Thu, 21 May 2026 14:26:58 +0000 Subject: [PATCH] [2] Add report for 2-nd Zadacha --- SavelevMI/docs/report-2.md | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 SavelevMI/docs/report-2.md diff --git a/SavelevMI/docs/report-2.md b/SavelevMI/docs/report-2.md new file mode 100644 index 0000000..577fe18 --- /dev/null +++ b/SavelevMI/docs/report-2.md @@ -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 – только при жёсткой нехватке памяти. \ No newline at end of file