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