Шаг 27.
Задачи ComputerScience на Python.
Задачи поиска. Прохождение лабиринта. Поиск в ширину (общие сведения)

    На этом шаге мы рассмотрим принцип поиска в ширину и сравним его с поиском в глубину.

    Вы могли заметить, что пути прохода по лабиринту, найденные с помощью поиска в глубину, кажутся неестественными. Обычно это не самые короткие пути. Поиск в ширину (breadth-first search, BFS) всегда находит кратчайший путь, систематически просматривая на каждой итерации поиска ближайший по отношению к исходному состоянию слой узлов. Для одних задач поиск в глубину позволяет найти решение быстрее, чем поиск в ширину, а для других - наоборот. Поэтому выбор алгоритма поиска иногда является компромиссом между возможностью быстрого поиска решения и гарантированной возможностью найти кратчайший путь к цели, если таковой существует. На рисунке 1 проиллюстрирован поиск пути по лабиринту в ширину.


Рис.1. При поиске в ширину сначала просматриваются ближайшие к начальной позиции элементы

    Чтобы понять, почему поиск в глубину иногда возвращает результат быстрее, чем поиск в ширину, представьте себе, что вы ищете метку на определенном слое луковицы. Тот, кто использует стратегию поиска в глубину, вонзит нож в центр луковицы и исследует случайно вырезанные куски. Если отмеченный слой окажется рядом с вырезанным куском, есть вероятность, что он будет найден быстрее, чем с помощью стратегии поиска в ширину, при которой нужно кропотливо очищать луковицу, снимая по одному слою за раз.

    Чтобы получить более полное представление о том, почему при поиске в ширину всегда определяется кратчайший путь, если только он существует, попробуйте найти железнодорожный маршрут между Бостоном и Нью-Йорком с наименьшим количеством остановок. Если вы будете продолжать двигаться в выбранном на правлении и возвращаться назад, когда попали в тупик (как при поиске в глубину), то можете сначала найти маршрут до Сиэтла, прежде чем попасть обратно в Нью-Йорк. Однако при поиске в ширину вы сначала проверите все станции, находящиеся в одной остановке от Бостона. Затем - все станции, находящиеся в двух остановках от Бостона. Затем - в трех остановках от Бостона. Так будет продолжаться до тех пор, пока вы не доберетесь до Нью-Йорка. Поэтому, найдя Нью-Йорк, поймете, что определили маршрут с наименьшим количеством станций, поскольку уже проверили все станции, находящиеся на меньшем расстоянии от Бостона, и ни одна из них не была Нью-Йорком.

    На следующем шаге мы рассмотрим очереди.




Предыдущий шаг Содержание Следующий шаг