2026-rff_mp/pogodinda/lab2/report.md

3.2 KiB
Raw Blame History

Лабораторная работа 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

visited_cells.png

time_comparison.png

6. Анализ

  • DFS быстрее всех, но в пустом лабиринте путь в 5.3 раза длиннее оптимального
  • A* — лучший баланс: кратчайший путь + меньше посещённых клеток
  • BFS и Дейкстра на невзвешенных графах работают одинаково

7. Вывод

  • Паттерны сделали код гибким и расширяемым
  • A* — оптимальный выбор для большинства задач
  • Дейкстра нужен только для взвешенных графов