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