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