# Отчет по заданию 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 — для уведомлений о событиях поиска.

Использование паттернов позволило сделать архитектуру гибкой и расширяемой.

Например:
- можно легко добавить новый алгоритм поиска пути;
- можно реализовать другой способ загрузки лабиринта;
- можно подключить новые способы отображения информации.

Без применения паттернов код был бы более связанным и сложным для расширения и поддержки.