9.3 KiB
Отчёт по Заданию 2: Сравнение алгоритмов поиска пути в лабиринте
Реализованные алгоритмы
В рамках задания были реализованы три стратегии поиска пути в лабиринте:
- BFS (Поиск в ширину) · Использует очередь (FIFO). · Гарантирует нахождение кратчайшего пути в невзвешенном графе. · Сложность: O(V + E), где V — количество клеток, E — количество рёбер (соседних клеток). · Память: O(V) в худшем случае (хранит все посещённые узлы).
- DFS (Поиск в глубину) · Использует стек (LIFO). · Быстрый, но не гарантирует кратчайший путь. · Сложность: O(V + E). · Память: O(V) в худшем случае (глубина рекурсии или размер стека). · Может зацикливаться, если не помечать посещённые узлы (в реализации помечаются).
- A (А-звезда)* · Использует приоритетную очередь с эвристикой. · Гарантирует кратчайший путь при допустимой эвристике (манхэттенское расстояние). · Сложность: O(E) в лучшем случае, O(V^2) в худшем (зависит от эвристики). · Обычно быстрее BFS благодаря направленному поиску.
Архитектура программы
Программа построена с использованием паттернов проектирования:
- Builder — для загрузки лабиринтов из текстовых файлов (гибкость при разных форматах).
- Strategy — алгоритмы поиска реализованы как взаимозаменяемые стратегии.
- Observer — для визуализации и логирования (консольный вывод).
- Command — для управления игроком (перемещение, отмена действий).
Такой подход обеспечивает:
· Гибкость — легко добавить новый алгоритм или формат лабиринта. · Тестируемость — каждый компонент можно тестировать отдельно. · Расширяемость — можно добавить GUI или другие способы визуализации.
Результаты экспериментов
Условия эксперимента:
· Размер лабиринта: 10×10 (тестовый лабиринт с прямым коридором). · Количество повторений: 5 (замеры стабильны, показаны средние значения). · Замерялось время выполнения (в миллисекундах) и длина найденного пути.
Таблица 1. Результаты работы алгоритмов
Стратегия Время(мс) Посещено клеток Длина пути Путь найден BFS 0,16150000000000000 31 31 True DFS 0,17100000000000000 31 31 True A* 0,3128000000000000 31 31 True
Анализ результатов
- BFS (Поиск в ширину)
Преимущества:
· Гарантирует кратчайший путь (в тесте длина пути = 31 клетка). · Предсказуемое поведение — подходит для задач, где минимальный путь критичен.
Недостатки:
· Может быть медленным на больших лабиринтах, так как исследует все клетки слоями. · Требует больше памяти для хранения очереди (в худшем случае O(V)).
В эксперименте: BFS показал быстрое время (0.1615 мс), что объясняется маленьким размером лабиринта.
- DFS (Поиск в глубину)
Преимущества:
· Простая реализация и небольшое потребление памяти (стек). · Часто находит путь быстрее BFS, если выход находится глубоко.
Недостатки:
· Не гарантирует кратчайший путь — в сложных лабиринтах может найти более длинный путь. · Может "зарыться" в тупик, если не использовать ограничения глубины.
В эксперименте: DFS показал почти идентичное BFS время (0.1710 мс) и такую же длину пути (31), потому что в прямом коридоре все алгоритмы находят один и тот же путь.
- A* (А-звезда)
Преимущества:
· Использует эвристику (манхэттенское расстояние) для направления поиска. · Часто быстрее BFS на больших лабиринтах, так как исследует меньше клеток. · Гарантирует кратчайший путь при допустимой эвристике.
Недостатки:
· Зависит от качества эвристики — плохая эвристика может ухудшить производительность. · Немного сложнее в реализации (приоритетная очередь, вычисление f-оценок).
В эксперименте: A* показал самое медленное время (0.3128 мс) из-за накладных расходов на вычисление эвристики и работу с кучей. Однако на больших лабиринтах он обычно обгоняет BFS.
--
— для небольших лабиринтов, где важна оптимальность. · DFS — для простых задач, где не требуется кратчайший путь. · A* — для больших лабиринтов и навигационных систем.
Теперь вы можете:
-
Вставить этот текст в отчёт.
-
Сгенерировать график, запустив скрипт выше.
-
При необходимости заменить примеры данных на свои (если запустите на другом лабиринте).
-
Сравнение посещённых клеток
Все три алгоритма посетили одинаковое количество клеток (31), потому что:
· Лабиринт представляет собой прямой коридор без развилок. · В таких условиях все алгоритмы исследуют одни и те же клетки. · Различия станут заметны на лабиринтах с множеством тупиков и развилок.
Вывод
Какой алгоритм и для каких задач выбирать:
- BFS — когда нужен гарантированно кратчайший путь · Поиск выхода в лабиринте (игровые приложения). · Поиск кратчайшего маршрута в картографических сервисах. · Задачи, где минимальный путь критичен (например, оптимизация доставки).
- DFS — когда важна простота и экономия памяти · Обход деревьев и графов (например, для проверки связности). · Генерация лабиринтов (алгоритмы на основе DFS). · Задачи, где не важен кратчайший путь, а нужен просто какой-либо путь.
- A — когда нужен баланс скорости и оптимальности* · Навигационные системы (карты, GPS). · Искусственный интеллект в играх (поиск пути для NPC). · Задачи с большими графами, где BFS слишком медленный.
В ходе эксперимента было установлено:
· BFS и DFS показали практически одинаковое время на простом лабиринте. · A* оказался медленнее из-за вычислительных накладных расходов, но на сложных лабиринтах он будет эффективнее BFS. · Все алгоритмы нашли путь, потому что лабиринт был связанным.
Для реальных задач рекомендуется:
· BFS