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