Введение

Итеративный поиск в глубину (или, более точно, итеративный поиск в глубину с ограничением глубины, IDDFS) — это стратегия поиска в пространстве состояний/графе, при которой версия поиска в глубину с ограничением глубины выполняется повторно с последовательно увеличивающимися ограничениями глубины, пока не будет найдена целевая точка. IDDFS является оптимальным, то есть находит наиболее близкую к началу целевую точку. Итеративное углубление посещает состояния многократно, что может показаться неэффективным. Однако, если IDDFS исследует дерево поиска до глубины *d*, большая часть общих вычислительных затрат приходится на исследование состояний на глубине *d*. По сравнению с количеством состояний на глубине *d*, стоимость повторного посещения состояний выше этой глубины всегда невелика. Основное преимущество IDDFS при поиске в деревьях игр заключается в том, что предварительные поиски, как правило, улучшают широко используемые эвристики, такие как эвристика "убийцы" и альфа-бета отсечение, что позволяет получить более точную оценку значений различных узлов при конечном поиске в глубину и ускорить поиск за счет более эффективного порядка обхода. Например, альфа-бета отсечение наиболее эффективно, если оно сначала исследует наиболее перспективные ходы. Чем выше коэффициент ветвления, тем меньше накладные расходы на повторное расширение состояний.

Итеративное углубление A* — это поиск в ширину, который выполняет итеративное углубление на основе значений "f", аналогичных тем, что вычисляются в алгоритме A*.

Двунаправленный IDDFS

IDDFS имеет двунаправленный аналог, который чередует два поиска: один начинается с исходного узла и движется вдоль направленных дуг, а другой – с целевого узла и продвигается вдоль направленных дуг в противоположном направлении (от головного узла дуги к хвостовому узлу дуги). Процесс поиска сначала проверяет, совпадают ли исходный и целевой узлы, и если да, то возвращает тривиальный путь, состоящий из единственного исходного/целевого узла. В противном случае, прямой поиск расширяет дочерние узлы исходного узла (множество ), обратный поиск расширяет родительские узлы целевого узла (множество ), и проверяется, пересекаются ли и . Если да, то найден кратчайший путь. В противном случае глубина поиска увеличивается, и вычисления повторяются. Одно из ограничений алгоритма заключается в том, что кратчайший путь, состоящий из нечетного числа дуг, не будет найден. Предположим, у нас есть кратчайший путь . Когда глубина достигнет двух шагов по дугам, прямой поиск перейдет от к , а обратный поиск – от к . Графически, границы поиска будут проходить друг мимо друга, и вместо этого будет возвращен неоптимальный путь, состоящий из четного числа дуг. Это иллюстрируется на следующих диаграммах: Что касается пространственной сложности, алгоритм помечает самые глубокие узлы в процессе прямого поиска, чтобы обнаружить существование промежуточного узла, в котором встречаются два процесса поиска. Дополнительная сложность применения двунаправленного IDDFS заключается в том, что если исходный и целевой узлы находятся в разных сильно связных компонентах, например, , и если нет дуги, выходящей из и входящей в , поиск никогда не завершится.