Итеративное углубление с глубиной первого поиска

Я продолжаю читать о итеративным углублением, но я не понимаю, чем он отличается от глубину.

Я понял, что глубинный поиск продолжает идти все глубже и глубже.

в итеративном углублении вы устанавливаете значение уровня, если на этом уровне нет решения, вы увеличиваете это значение и начинаете снова с нуля (корень).

разве это не то же самое, что и глубина поиск?

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

3 ответов


в поиске глубины сначала вы начинаете с какого-то узла на графике и постоянно исследуете все глубже и глубже в график, пока вы не найдете новые узлы, которые вы еще не достигли (или пока не найдете решение). Каждый раз, когда у DFS заканчиваются ходы, он возвращается к последней точке, где он может сделать другой выбор, а затем исследует оттуда. Это может быть серьезной проблемой, если ваш график очень большой, и есть только одно решение, так как вы можете в конечном итоге изучить весь график вдоль Одного пути DFS только для того, чтобы найти решение после просмотра каждого узла. Хуже того, если граф бесконечен (возможно, ваш граф состоит из всех чисел, например), поиск может не завершиться. Кроме того, как только вы найдете узел, который ищете, у вас может не быть оптимального пути к нему (вы могли бы зациклиться на всем графике, ища решение, даже если оно было рядом с начальным узлом!)

одним из возможных решений этой проблемы было бы ограничение глубина любого одного пути, пройденного DFS. Например, мы можем выполнить поиск DFS, но остановить поиск, если мы когда-либо возьмем путь длиной более 5. Это гарантирует, что мы никогда не исследуем какой-либо узел, который находится на расстоянии больше пяти от начального узла, то есть мы никогда не исследуем бесконечно или (если график не очень плотный) мы не ищем весь график. Однако это означает, что мы можем не найти узел, который мы ищем, поскольку мы не обязательно исследуем весь диаграмма.

идея итеративного углубления состоит в том, чтобы использовать этот второй подход, но продолжать увеличивать глубину на каждом уровне. Другими словами, мы можем попытаться исследовать все пути длины один, затем все пути длины два, затем длины три и т. д. пока мы не найдем узел, о котором идет речь. Это означает, что мы никогда не будем исследовать бесконечные тупиковые пути, так как длина каждого пути ограничена некоторой длиной на каждом шаге. Это также означает, что мы находим кратчайший возможный путь к узлу назначения, так как если мы не нашли узел на глубине d, но нашли его на глубине d + 1, не может быть пути длины d (или мы бы взяли его), поэтому путь длины d + 1 действительно оптимален.

причина, по которой это отличается от DFS, заключается в том, что он никогда не сталкивается с тем случаем, когда он занимает чрезвычайно длинный и окольный путь вокруг графика, никогда не завершаясь. Длины путей всегда ограничены, поэтому мы никогда не заканчиваем исследование ненужные ветви.

причина, по которой это отличается от BFS, заключается в том, что в BFS вы должны удерживать все периферийные узлы в памяти сразу. Для этого требуется память O (bd), где B-коэффициент ветвления. Сравните это с использованием памяти O(d) из итеративного углубления (чтобы сохранить состояние для каждого из узлов d в текущем пути). Конечно, BFS никогда не исследует один и тот же путь несколько раз, в то время как итеративное углубление может исследовать любой путь несколько раз увеличивает ограничение глубины. Однако асимптотически они имеют одинаковое время выполнения. BFS завершается в O (bd) шаги после рассмотрения всех O (bd) узлы на расстоянии d. Итеративное углубление использует O (bd) время на уровень, которое суммируется до O (bd) в целом, но с более высоким постоянным фактором.

короче:

  • DFS не гарантирует нахождения оптимального пути; итеративное углубление.
  • DFS может исследуйте весь график, прежде чем найти целевой узел; итеративное углубление делает это, только если расстояние между начальным и конечным узлом является максимальным в графике.
  • BFS и итеративное углубление выполняются в O (bd), но итеративное углубление имеет более высокий постоянный фактор.
  • BFS использует O (bd) память, в то время как итеративное углубление использует только O(d).

надеюсь, что это помогает!


есть приличная страница на Википедия об этом.

основная идея, которую, я думаю, вы пропустили, заключается в том, что итеративное углубление в первую очередь эвристика. Когда решение, вероятно, будет найдено близко к корневому итеративному углублению, оно найдет его относительно быстро, в то время как прямой поиск глубины может принять "неправильное" решение и потратить много времени на бесплодную глубокую ветвь.

(Это особенно важно, когда дерево поиска может быть бесконечным. в этом случае они еще менее эквивалента поскольку DFS может застрять навсегда, а BFS или итеративное углубление обязательно найдут ответ однажды, если он существует)


просто добавляя к тому, что уже здесь, но вот некоторые видео из движущейся лаборатории AI Университета Денвера, которые показывают различия.

http://movingai.com/dfid.html

вы можете видеть в своих примерах итеративное углубление выигрывает, когда цель мелкая (глубина решения 3, глубина дерева), а решение справа, но DFS выигрывает независимо от того, что, если решение находится в последней строке.

Я попал в это чтение о шахматном программировании, следующий для меня был думать о короткошерстные поиск проверьте это, если вы хотите узнать больше о стратегиях поиска для программирования AI.