forked from UNN/2026-rff_mp
243 lines
7.2 KiB
Markdown
243 lines
7.2 KiB
Markdown
|
|
# Отчет по заданию 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.
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Описание классов
|
|||
|
|
|
|||
|
|
## 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 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Графики
|
|||
|
|
|
|||
|
|
### Время выполнения
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Количество посещённых клеток
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|

|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Графики
|
|||
|
|
|
|||
|
|
Построены графики:
|
|||
|
|
- времени выполнения
|
|||
|
|
- количества посещённых клеток
|
|||
|
|
|
|||
|
|
Для каждого лабиринта.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Анализ эффективности алгоритмов
|
|||
|
|
|
|||
|
|
В ходе экспериментов были сравнены алгоритмы BFS, DFS и A* на лабиринтах различной сложности.
|
|||
|
|
|
|||
|
|
## BFS
|
|||
|
|
|
|||
|
|
Алгоритм BFS гарантированно находит кратчайший путь, однако может посещать большое количество клеток. На больших лабиринтах время работы увеличивается.
|
|||
|
|
|
|||
|
|
## DFS
|
|||
|
|
|
|||
|
|
DFS работает быстрее других алгоритмов, так как уходит в глубину и не исследует все возможные пути. Однако найденный путь может быть не кратчайшим.
|
|||
|
|
|
|||
|
|
## A*
|
|||
|
|
|
|||
|
|
Алгоритм A* использует эвристику и старается двигаться к выходу наиболее оптимальным образом. На простых лабиринтах показывает хорошие результаты, однако на некоторых картах из-за вычисления эвристики работает медленнее DFS.
|
|||
|
|
|
|||
|
|
## Вывод по экспериментам
|
|||
|
|
|
|||
|
|
- DFS показал наименьшее время выполнения.
|
|||
|
|
- BFS обеспечивает поиск кратчайшего пути.
|
|||
|
|
- A* хорошо подходит для сложных лабиринтов с большим количеством вариантов движения.
|
|||
|
|
- На лабиринтах без выхода все алгоритмы посещают примерно одинаковое количество клеток.
|
|||
|
|
|
|||
|
|
# Выводы
|
|||
|
|
|
|||
|
|
В ходе работы была реализована система поиска пути в лабиринте с использованием объектно-ориентированного подхода и паттернов проектирования.
|
|||
|
|
|
|||
|
|
Были использованы паттерны:
|
|||
|
|
|
|||
|
|
- Builder — для загрузки лабиринта из файла.
|
|||
|
|
- Strategy — для переключения алгоритмов поиска пути.
|
|||
|
|
- Observer — для уведомлений о событиях поиска.
|
|||
|
|
|
|||
|
|
Использование паттернов позволило сделать архитектуру гибкой и расширяемой.
|
|||
|
|
|
|||
|
|
Например:
|
|||
|
|
- можно легко добавить новый алгоритм поиска пути;
|
|||
|
|
- можно реализовать другой способ загрузки лабиринта;
|
|||
|
|
- можно подключить новые способы отображения информации.
|
|||
|
|
|
|||
|
|
Без применения паттернов код был бы более связанным и сложным для расширения и поддержки.
|