2026-rff_mp/pogodinda/lab2/report.md

69 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа 2: Поиск выхода из лабиринта
## 1. Цель
Разработать гибкую, расширяемую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма, визуализации процесса и экспериментального сравнения алгоритмов. В ходе работы необходимо применить минимум 3 паттерна проектирования из списка GoF, обосновать их выбор и продемонстрировать преимущества такой архитектуры.
## 2. Паттерны
| Паттерн | Где | Зачем |
|---------|-----|-------|
| Builder | `maze_builder.py` | Загрузка лабиринта из файла |
| Strategy | `pathfinding.py` | Смена алгоритмов (BFS, DFS, A*, Дейкстра) |
| Observer | `observer.py` | Уведомления о событиях поиска |
| Command | `commands.py` | Перемещение игрока с undo |
## 3. Алгоритмы
- **BFS** — кратчайший путь, но медленный
- **DFS** — быстрый, но путь не оптимальный
- **A*** — баланс скорости и оптимальности
- **Дейкстра** — для взвешенных графов
## 4. Результаты
### Таблица: посещённые клетки
| Лабиринт | BFS | DFS | A* | Дейкстра |
|:--------:|:---:|:---:|:--:|:--------:|
| 10×10 | 52 | 49 | 47 | 52 |
| 50×50 | 514 | 326 | 491 | 511 |
| 100×100 | 1989 | 1509 | 1909 | 1987 |
| Пустой | 398 | 399 | 324 | 396 |
| Без выхода | 0 | 0 | 0 | 0 |
| Взвешенный | 145 | 111 | 139 | 143 |
### Время (мс)
| Лабиринт | BFS | DFS | A* | Дейкстра |
|:--------:|:---:|:---:|:--:|:--------:|
| 10×10 | 0.107 | 0.068 | 0.142 | 0.146 |
| 50×50 | 1.141 | 0.690 | 1.509 | 1.482 |
| 100×100 | 7.667 | 5.207 | 8.254 | 8.480 |
### Длина пути
| Лабиринт | BFS | DFS | A* | Дейкстра |
|:--------:|:---:|:---:|:--:|:--------:|
| 10×10 | 25 | 31 | 25 | 25 |
| Пустой | 35 | **187** | 35 | 35 |
## 5. Графики
![maze_comparison.png](results/maze_comparison.png)
![visited_cells.png](results/visited_cells.png)
![time_comparison.png](results/time_comparison.png)
## 6. Анализ
- **DFS** быстрее всех, но в пустом лабиринте путь в 5.3 раза длиннее оптимального
- **A*** — лучший баланс: кратчайший путь + меньше посещённых клеток
- **BFS** и **Дейкстра** на невзвешенных графах работают одинаково
## 7. Вывод
- Паттерны сделали код **гибким** и **расширяемым**
- **A*** — оптимальный выбор для большинства задач
- **Дейкстра** нужен только для взвешенных графов