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