136 lines
4.2 KiB
Markdown
136 lines
4.2 KiB
Markdown
|
|
# Отчёт по заданию №2
|
|||
|
|
|
|||
|
|
### Реализация поиска пути в лабиринте с использованием паттернов проектирования
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Цель работы
|
|||
|
|
|
|||
|
|
Разработать архитектуру и реализацию системы поиска пути в лабиринте, применив паттерны:
|
|||
|
|
|
|||
|
|
- Builder — построение лабиринта из файла
|
|||
|
|
- Strategy — выбор алгоритма поиска
|
|||
|
|
- Observer — отображение состояния
|
|||
|
|
- Command — управление игроком
|
|||
|
|
|
|||
|
|
Также провести экспериментальное сравнение алгоритмов BFS, DFS и A\*.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. Архитектура проекта
|
|||
|
|
|
|||
|
|
Структура каталогов:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
BrychkinKA/
|
|||
|
|
│
|
|||
|
|
├── 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/plot_graphs.py`
|
|||
|
|
|
|||
|
|
- время работы алгоритмов
|
|||
|
|
- количество посещённых клеток
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. Выводы
|
|||
|
|
|
|||
|
|
1. A\* показывает лучшие результаты на средних и больших лабиринтах, но имеет небольшой накладной расход.
|
|||
|
|
2. DFS посещает меньше клеток, но не гарантирует кратчайший путь.
|
|||
|
|
3. BFS всегда находит кратчайший путь, но исследует больше пространства.
|
|||
|
|
4. На лабиринтах без выхода все алгоритмы корректно возвращают `path_len = 0`.
|
|||
|
|
5. Архитектура с паттернами позволяет легко расширять проект и добавлять новые алгоритмы.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. Приложения
|
|||
|
|
|
|||
|
|
- Исходный код
|
|||
|
|
- Лабиринты
|
|||
|
|
- CSV с результатами
|
|||
|
|
- Диаграммы
|