2026-rff_mp/nehoroshevaa/docs/report.md

174 lines
9.0 KiB
Markdown
Raw Normal View History

2026-05-24 18:49:38 +00:00
1. Цель работы
Разработать расширяемую программу для поиска пути в лабиринте, поддерживающую загрузку карты из файла, выбор алгоритма поиска, сбор статистики и сравнение эффективности различных стратегий.
В ходе работы применены паттерны проектирования для разделения ответственности между компонентами системы и повышения гибкости архитектуры.
2. Постановка задачи
Лабиринт задаётся в текстовом файле символами:
# — стена
пробел — проходимая клетка
S — стартовая позиция
E — выход
Программа должна:
загружать лабиринт из файла;
строить внутреннюю модель представления;
находить путь от старта до выхода;
поддерживать выбор алгоритма поиска;
собирать статистику работы алгоритмов;
визуализировать результат;
выполнять сравнительный анализ стратегий.
3. Использованные паттерны проектирования
3.1 Builder
Паттерн Builder применяется для создания объекта лабиринта из текстового файла. Он инкапсулирует процесс парсинга, валидации и построения структуры данных.
Преимущества:
отделение логики загрузки от логики использования;
возможность добавления новых форматов (JSON, бинарные файлы);
упрощение расширения системы.
3.2 Strategy
Паттерн Strategy используется для реализации различных алгоритмов поиска пути.
Реализованы следующие стратегии:
BFS;
DFS;
A*.
Преимущества:
возможность переключения алгоритма во время выполнения;
отсутствие зависимости MazeSolver от конкретной реализации;
лёгкое добавление новых алгоритмов.
3.3 Observer
Паттерн Observer применяется для уведомления интерфейса о событиях выполнения программы (например, нахождение пути).
Преимущества:
разделение логики поиска и отображения;
возможность замены интерфейса без изменения алгоритмов;
расширяемость системы визуализации.
3.4 Command (дополнительно)
Паттерн Command используется для представления действий пользователя как объектов (например, перемещение и отмена хода).
Преимущества:
поддержка undo/redo;
хранение истории действий;
разделение команд и логики исполнения.
4. Архитектура системы
Система состоит из следующих основных компонентов:
Cell — описание клетки лабиринта;
Maze — структура лабиринта и логика соседей;
MazeBuilder — загрузка лабиринта из файла;
PathFindingStrategy — интерфейс алгоритмов поиска;
реализации стратегий: BFS, DFS, A*;
MazeSolver — оркестратор поиска и сбор статистики;
SearchStats — структура результатов;
ConsoleView — визуализация результата;
Command (опционально) — управление действиями пользователя.
5. Описание ключевых компонентов
Cell
Хранит координаты клетки и её тип (стена, старт, выход). Определяет проходимость клетки.
Maze
Представляет лабиринт в виде двумерного массива клеток и предоставляет методы доступа к соседним узлам.
TextFileMazeBuilder
Отвечает за чтение текстового файла и построение объекта Maze.
BFS / DFS / A*
Реализуют разные стратегии поиска пути:
BFS — гарантирует кратчайший путь;
DFS — быстрый, но не оптимальный;
A* — использует эвристику и уменьшает число посещённых клеток.
MazeSolver
Запускает выбранный алгоритм, измеряет время выполнения и формирует статистику.
SearchStats
Содержит:
время выполнения;
количество посещённых клеток;
длину найденного пути.
ConsoleView
Отвечает за отображение лабиринта и найденного пути в консоли.
6. Экспериментальная часть
6.1 Тестовые данные
Для анализа использовались следующие типы лабиринтов:
небольшой 10×10 с простым маршрутом;
средний 50×50 с наличием тупиков;
большой 100×100 со сложной структурой;
пустой лабиринт без стен;
лабиринт без решения.
6.2 Методика измерений
Для каждой комбинации лабиринта и алгоритма выполнялось несколько запусков.
Фиксировались следующие показатели:
время выполнения (мс);
количество посещённых клеток;
длина пути.
Результаты сохранялись в CSV-файл для последующего анализа.
7. Анализ результатов
BFS
Обеспечивает нахождение кратчайшего пути при равных весах переходов. Однако может исследовать значительное количество клеток.
DFS
Быстро находит решение в некоторых случаях, но не гарантирует оптимальность пути и может исследовать нерелевантные области.
A*
Использует эвристику (Манхэттенское расстояние), что позволяет существенно сократить количество посещённых узлов и ускорить поиск.
Лабиринт без решения
Во всех алгоритмах происходит полный или частичный обход доступной области, после чего возвращается отсутствие пути.
Вывод по алгоритмам
BFS — оптимален по длине пути;
DFS — прост, но нестабилен;
A* — наиболее эффективен по числу посещений и времени работы.
8. Роль ООП и паттернов
Использование ООП и паттернов проектирования позволило:
разделить систему на независимые компоненты;
упростить расширение алгоритмов;
отделить визуализацию от логики поиска;
обеспечить возможность добавления новых форматов данных и алгоритмов.
Без использования паттернов код был бы менее структурирован и сложнее в сопровождении.
9. Вывод
В рамках работы была реализована система поиска пути в лабиринте с возможностью выбора алгоритма и анализа их эффективности.
Применение паттернов Builder, Strategy, Observer и Command позволило создать гибкую и расширяемую архитектуру. Экспериментальная часть показала, что выбор алгоритма существенно влияет на количество посещённых клеток и время выполнения.