2026-rff_mp/VildyaevAV/docs/task2/task2_report.md
2026-05-21 21:50:03 +03:00

243 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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