2026-rff_mp/VildyaevAV/docs/task2/task2_report.md

243 lines
7.2 KiB
Markdown
Raw Normal View History

2026-05-21 18:50:03 +00:00
# Отчет по заданию 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 — для уведомлений о событиях поиска.
Использование паттернов позволило сделать архитектуру гибкой и расширяемой.
Например:
- можно легко добавить новый алгоритм поиска пути;
- можно реализовать другой способ загрузки лабиринта;
- можно подключить новые способы отображения информации.
Без применения паттернов код был бы более связанным и сложным для расширения и поддержки.