# Отчет по заданию 2 ## Тема Реализация поиска пути в лабиринте с использованием паттернов проектирования и различных алгоритмов поиска. --- # Цель работы Изучить применение ООП и паттернов проектирования при реализации алгоритмов поиска пути в лабиринте. Реализовать: - BFS - DFS - A* Сравнить эффективность алгоритмов по: - времени выполнения - количеству посещённых клеток - длине найденного пути --- # Используемые паттерны ## Builder Используется для загрузки лабиринта из файла. ## Strategy Используется для переключения алгоритмов поиска пути. ## Observer Используется для уведомлений о начале и окончании поиска. --- # Структура проекта ```text docs/task2/ ├── mazes/ │ ├── small.txt │ ├── medium.txt │ ├── blocked.txt │ ├── no_exit.txt │ ├── large.txt │ └── empty.txt │ ├── cell.py ├── maze.py ├── builder.py ├── strategies.py ├── solver.py ├── observer.py ├── main.py ├── plot_results.py ├── maze_results.csv └── task2_report.md ``` --- # UML диаграмма В проекте была построена UML-диаграмма классов с использованием Mermaid. ![alt text](image.png) --- # Описание классов ## Cell Класс клетки лабиринта. Хранит: - координаты - тип клетки - признаки стены, старта и выхода --- ## Maze Класс лабиринта. Содержит: - двумерный массив клеток - размеры лабиринта - стартовую клетку - выход --- ## TextFileMazeBuilder Загружает лабиринт из текстового файла. --- ## BFSStrategy Алгоритм поиска в ширину. Находит кратчайший путь. --- ## DFSStrategy Алгоритм поиска в глубину. Работает быстро, но путь может быть не кратчайшим. --- ## AStarStrategy Эвристический алгоритм поиска. Использует манхэттенское расстояние. --- ## MazeSolver Основной класс-оркестратор. Запускает алгоритм поиска и собирает статистику. --- # Результаты экспериментов Результаты сохраняются в файл: ```text maze_results.csv ``` Проводилось сравнение: - времени работы - количества посещённых клеток - длины пути ## Таблица результатов | Лабиринт | Алгоритм | Время (мс) | Посещено клеток | Длина пути | |---|---|---|---|---| | small | BFS | 0.0396 | 10 | 7 | | small | DFS | 0.0251 | 10 | 7 | | small | A* | 0.0359 | 10 | 7 | | medium | BFS | 0.0312 | 18 | 0 | | medium | DFS | 0.0277 | 18 | 0 | | medium | A* | 0.0359 | 18 | 0 | | blocked | BFS | 0.0123 | 3 | 0 | | blocked | DFS | 0.0089 | 3 | 0 | | blocked | A* | 0.0133 | 3 | 0 | | large | BFS | 0.0602 | 45 | 0 | | large | DFS | 0.0509 | 45 | 0 | | large | A* | 0.0682 | 45 | 0 | | empty | BFS | 0.0711 | 56 | 14 | | empty | DFS | 0.0419 | 49 | 28 | | empty | A* | 0.1144 | 56 | 14 | --- ## Графики ### Время выполнения ![blocked](blocked_time.png) ![small](small_time.png) ![medium](medium_time.png) ![large](large_time.png) ![empty](empty_time.png) --- ### Количество посещённых клеток ![blocked](blocked_visited.png) ![small](small_visited.png) ![medium](medium_visited.png) ![large](large_visited.png) ![empty](empty_visited.png) --- # Графики Построены графики: - времени выполнения - количества посещённых клеток Для каждого лабиринта. --- # Анализ эффективности алгоритмов В ходе экспериментов были сравнены алгоритмы BFS, DFS и A* на лабиринтах различной сложности. ## BFS Алгоритм BFS гарантированно находит кратчайший путь, однако может посещать большое количество клеток. На больших лабиринтах время работы увеличивается. ## DFS DFS работает быстрее других алгоритмов, так как уходит в глубину и не исследует все возможные пути. Однако найденный путь может быть не кратчайшим. ## A* Алгоритм A* использует эвристику и старается двигаться к выходу наиболее оптимальным образом. На простых лабиринтах показывает хорошие результаты, однако на некоторых картах из-за вычисления эвристики работает медленнее DFS. ## Вывод по экспериментам - DFS показал наименьшее время выполнения. - BFS обеспечивает поиск кратчайшего пути. - A* хорошо подходит для сложных лабиринтов с большим количеством вариантов движения. - На лабиринтах без выхода все алгоритмы посещают примерно одинаковое количество клеток. # Выводы В ходе работы была реализована система поиска пути в лабиринте с использованием объектно-ориентированного подхода и паттернов проектирования. Были использованы паттерны: - Builder — для загрузки лабиринта из файла. - Strategy — для переключения алгоритмов поиска пути. - Observer — для уведомлений о событиях поиска. Использование паттернов позволило сделать архитектуру гибкой и расширяемой. Например: - можно легко добавить новый алгоритм поиска пути; - можно реализовать другой способ загрузки лабиринта; - можно подключить новые способы отображения информации. Без применения паттернов код был бы более связанным и сложным для расширения и поддержки.