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