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

9.0 KiB
Raw Blame History

  1. Цель работы

Разработать расширяемую программу для поиска пути в лабиринте, поддерживающую загрузку карты из файла, выбор алгоритма поиска, сбор статистики и сравнение эффективности различных стратегий.

В ходе работы применены паттерны проектирования для разделения ответственности между компонентами системы и повышения гибкости архитектуры.

  1. Постановка задачи

Лабиринт задаётся в текстовом файле символами:

— стена

пробел — проходимая клетка 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

Отвечает за отображение лабиринта и найденного пути в консоли.

  1. Экспериментальная часть 6.1 Тестовые данные

Для анализа использовались следующие типы лабиринтов:

небольшой 10×10 с простым маршрутом; средний 50×50 с наличием тупиков; большой 100×100 со сложной структурой; пустой лабиринт без стен; лабиринт без решения. 6.2 Методика измерений

Для каждой комбинации лабиринта и алгоритма выполнялось несколько запусков.

Фиксировались следующие показатели:

время выполнения (мс); количество посещённых клеток; длина пути.

Результаты сохранялись в CSV-файл для последующего анализа.

  1. Анализ результатов BFS

Обеспечивает нахождение кратчайшего пути при равных весах переходов. Однако может исследовать значительное количество клеток.

DFS

Быстро находит решение в некоторых случаях, но не гарантирует оптимальность пути и может исследовать нерелевантные области.

A*

Использует эвристику (Манхэттенское расстояние), что позволяет существенно сократить количество посещённых узлов и ускорить поиск.

Лабиринт без решения

Во всех алгоритмах происходит полный или частичный обход доступной области, после чего возвращается отсутствие пути.

Вывод по алгоритмам BFS — оптимален по длине пути; DFS — прост, но нестабилен; A* — наиболее эффективен по числу посещений и времени работы. 8. Роль ООП и паттернов

Использование ООП и паттернов проектирования позволило:

разделить систему на независимые компоненты; упростить расширение алгоритмов; отделить визуализацию от логики поиска; обеспечить возможность добавления новых форматов данных и алгоритмов.

Без использования паттернов код был бы менее структурирован и сложнее в сопровождении.

  1. Вывод

В рамках работы была реализована система поиска пути в лабиринте с возможностью выбора алгоритма и анализа их эффективности.

Применение паттернов Builder, Strategy, Observer и Command позволило создать гибкую и расширяемую архитектуру. Экспериментальная часть показала, что выбор алгоритма существенно влияет на количество посещённых клеток и время выполнения.