forked from UNN/2026-rff_mp
174 lines
9.0 KiB
Markdown
174 lines
9.0 KiB
Markdown
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 позволило создать гибкую и расширяемую архитектуру. Экспериментальная часть показала, что выбор алгоритма существенно влияет на количество посещённых клеток и время выполнения. |