2026-rff_mp/nehoroshevaa/docs/report.md
2026-05-24 21:49:38 +03:00

174 lines
9.0 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.

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 позволило создать гибкую и расширяемую архитектуру. Экспериментальная часть показала, что выбор алгоритма существенно влияет на количество посещённых клеток и время выполнения.