3.2 KiB
3.2 KiB
Лабораторная работа 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* — оптимальный выбор для большинства задач
- Дейкстра нужен только для взвешенных графов


