2026-rff_mp/starikovta/docs/report_task2.md
2026-09-05 17:16:35 +03:00

9.3 KiB
Raw Blame History

Отчёт по Заданию 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 мс), что объясняется маленьким размером лабиринта.


  1. DFS (Поиск в глубину)

Преимущества:

· Простая реализация и небольшое потребление памяти (стек). · Часто находит путь быстрее BFS, если выход находится глубоко.

Недостатки:

· Не гарантирует кратчайший путь — в сложных лабиринтах может найти более длинный путь. · Может "зарыться" в тупик, если не использовать ограничения глубины.

В эксперименте: DFS показал почти идентичное BFS время (0.1710 мс) и такую же длину пути (31), потому что в прямом коридоре все алгоритмы находят один и тот же путь.


  1. 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