9.0 KiB
- Цель работы
Разработать расширяемую программу для поиска пути в лабиринте, поддерживающую загрузку карты из файла, выбор алгоритма поиска, сбор статистики и сравнение эффективности различных стратегий.
В ходе работы применены паттерны проектирования для разделения ответственности между компонентами системы и повышения гибкости архитектуры.
- Постановка задачи
Лабиринт задаётся в текстовом файле символами:
— стена
пробел — проходимая клетка 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.1 Тестовые данные
Для анализа использовались следующие типы лабиринтов:
небольшой 10×10 с простым маршрутом; средний 50×50 с наличием тупиков; большой 100×100 со сложной структурой; пустой лабиринт без стен; лабиринт без решения. 6.2 Методика измерений
Для каждой комбинации лабиринта и алгоритма выполнялось несколько запусков.
Фиксировались следующие показатели:
время выполнения (мс); количество посещённых клеток; длина пути.
Результаты сохранялись в CSV-файл для последующего анализа.
- Анализ результатов BFS
Обеспечивает нахождение кратчайшего пути при равных весах переходов. Однако может исследовать значительное количество клеток.
DFS
Быстро находит решение в некоторых случаях, но не гарантирует оптимальность пути и может исследовать нерелевантные области.
A*
Использует эвристику (Манхэттенское расстояние), что позволяет существенно сократить количество посещённых узлов и ускорить поиск.
Лабиринт без решения
Во всех алгоритмах происходит полный или частичный обход доступной области, после чего возвращается отсутствие пути.
Вывод по алгоритмам BFS — оптимален по длине пути; DFS — прост, но нестабилен; A* — наиболее эффективен по числу посещений и времени работы. 8. Роль ООП и паттернов
Использование ООП и паттернов проектирования позволило:
разделить систему на независимые компоненты; упростить расширение алгоритмов; отделить визуализацию от логики поиска; обеспечить возможность добавления новых форматов данных и алгоритмов.
Без использования паттернов код был бы менее структурирован и сложнее в сопровождении.
- Вывод
В рамках работы была реализована система поиска пути в лабиринте с возможностью выбора алгоритма и анализа их эффективности.
Применение паттернов Builder, Strategy, Observer и Command позволило создать гибкую и расширяемую архитектуру. Экспериментальная часть показала, что выбор алгоритма существенно влияет на количество посещённых клеток и время выполнения.