forked from UNN/2026-rff_mp
132 lines
4.3 KiB
Markdown
132 lines
4.3 KiB
Markdown
# Отчёт по заданию №2
|
||
### Реализация поиска пути в лабиринте с использованием паттернов проектирования
|
||
|
||
---
|
||
|
||
## 1. Цель работы
|
||
|
||
Разработать архитектуру и реализацию системы поиска пути в лабиринте, применив паттерны:
|
||
|
||
- Builder — построение лабиринта из файла
|
||
- Strategy — выбор алгоритма поиска
|
||
- Observer — отображение состояния
|
||
- Command — управление игроком
|
||
|
||
Также провести экспериментальное сравнение алгоритмов BFS, DFS и A*.
|
||
|
||
---
|
||
|
||
## 2. Архитектура проекта
|
||
|
||
Структура каталогов:
|
||
|
||
```
|
||
vinichukan/
|
||
│
|
||
├── src/
|
||
│ ├── builder/
|
||
│ ├── model/
|
||
│ ├── solver/
|
||
│ ├── strategy/
|
||
│ └── ui/
|
||
│
|
||
├── mazes/
|
||
├── experiments/
|
||
└── docs/
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Используемые паттерны
|
||
|
||
### 3.1 Builder
|
||
Абстрагирует процесс построения лабиринта из текстового файла.
|
||
|
||
### 3.2 Strategy
|
||
Позволяет переключать алгоритмы поиска пути без изменения остального кода.
|
||
|
||
### 3.3 Observer
|
||
Используется для отображения состояния лабиринта в консоли.
|
||
|
||
### 3.4 Command
|
||
Реализует управление игроком и пошаговое перемещение.
|
||
|
||
---
|
||
|
||
## 4. Диаграмма классов
|
||
|
||
Диаграмма находится в файле: `class_diagram.mmd`
|
||
|
||
---
|
||
|
||
## 5. Эксперименты
|
||
|
||
Эксперименты проводились на пяти лабиринтах:
|
||
|
||
- small.txt — простой, проходимый
|
||
- medium.txt — средний по сложности
|
||
- empty.txt — полностью свободное поле
|
||
- no_exit.txt — отсутствует выход
|
||
- big.txt — большой лабиринт, путь отсутствует
|
||
|
||
Алгоритмы:
|
||
|
||
- BFS
|
||
- DFS
|
||
- A*
|
||
|
||
---
|
||
|
||
## 6. Результаты
|
||
|
||
### 6.1 Таблица результатов
|
||
|
||
| Файл | Алгоритм | Посещено | Длина пути |
|
||
|-------------|----------|----------|------------|
|
||
| big.txt | BFS | 27 | 0 |
|
||
| big.txt | DFS | 27 | 0 |
|
||
| big.txt | A* | 27 | 0 |
|
||
| empty.txt | BFS | 10 | 10 |
|
||
| empty.txt | DFS | 10 | 10 |
|
||
| empty.txt | A* | 10 | 10 |
|
||
| medium.txt | BFS | 21 | 17 |
|
||
| medium.txt | DFS | 19 | 17 |
|
||
| medium.txt | A* | 21 | 17 |
|
||
| no_exit.txt | BFS | 0 | 0 |
|
||
| no_exit.txt | DFS | 0 | 0 |
|
||
| no_exit.txt | A* | 0 | 0 |
|
||
| small.txt | BFS | 7 | 7 |
|
||
| small.txt | DFS | 7 | 7 |
|
||
| small.txt | A* | 7 | 7 |
|
||
|
||
---
|
||
|
||
## 7. Графики
|
||
|
||
Графики находятся в файле:
|
||
|
||
`experiments/graphs.ipynb`
|
||
|
||
|
||
- время работы алгоритмов
|
||
- количество посещённых клеток
|
||
|
||
---
|
||
|
||
## 8. Выводы
|
||
|
||
1. A* показывает лучшие результаты на средних и больших лабиринтах, но имеет небольшой накладной расход.
|
||
2. DFS посещает меньше клеток, но не гарантирует кратчайший путь.
|
||
3. BFS всегда находит кратчайший путь, но исследует больше пространства.
|
||
4. На лабиринтах без выхода все алгоритмы корректно возвращают `path_len = 0`.
|
||
5. Архитектура с паттернами позволяет легко расширять проект и добавлять новые алгоритмы.
|
||
|
||
---
|
||
|
||
## 9. Приложения
|
||
|
||
- Исходный код
|
||
- Лабиринты
|
||
- CSV с результатами
|
||
- Диаграммы
|