Лабораторная работа 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. Графики



6. Анализ
- DFS быстрее всех, но в пустом лабиринте путь в 5.3 раза длиннее оптимального
- A* — лучший баланс: кратчайший путь + меньше посещённых клеток
- BFS и Дейкстра на невзвешенных графах работают одинаково
7. Вывод
- Паттерны сделали код гибким и расширяемым
- A* — оптимальный выбор для большинства задач
- Дейкстра нужен только для взвешенных графов