Введение
Итеративный поиск в глубину (или, более точно, итеративный поиск в глубину с ограничением глубины, IDDFS) — это стратегия поиска в пространстве состояний/графе, при которой версия поиска в глубину с ограничением глубины выполняется повторно с последовательно увеличивающимися ограничениями глубины, пока не будет найдена целевая точка. IDDFS является оптимальным, то есть находит наиболее близкую к началу целевую точку. Итеративное углубление посещает состояния многократно, что может показаться неэффективным. Однако, если IDDFS исследует дерево поиска до глубины *d*, большая часть общих вычислительных затрат приходится на исследование состояний на глубине *d*. По сравнению с количеством состояний на глубине *d*, стоимость повторного посещения состояний выше этой глубины всегда невелика. Основное преимущество IDDFS при поиске в деревьях игр заключается в том, что предварительные поиски, как правило, улучшают широко используемые эвристики, такие как эвристика "убийцы" и альфа-бета отсечение, что позволяет получить более точную оценку значений различных узлов при конечном поиске в глубину и ускорить поиск за счет более эффективного порядка обхода. Например, альфа-бета отсечение наиболее эффективно, если оно сначала исследует наиболее перспективные ходы. Чем выше коэффициент ветвления, тем меньше накладные расходы на повторное расширение состояний.
In computer science, iterative deepening search or more specifically iterative deepening depth first search (IDS or IDDFS) is a state space/graph search strategy in which a depth limited version of depth first search is run repeatedly with increasing depth limits until the goal is found. IDDFS is optimal, meaning that it finds the shallowest goal. Iterative deepening visits states multiple times, and it may seem wasteful. However, if IDDFS explores a search tree to depth , most of the total effort is in exploring the states at depth Relative to the number of states at depth , the cost of repeatedly visiting the states above this depth is always small. The main advantage of IDDFS in game tree searching is that the earlier searches tend to improve the commonly used heuristics, such as the killer heuristic and alpha–beta pruning, so that a more accurate estimate of the score of various nodes at the final depth search can occur, and the search completes more quickly since it is done in a better order. For example, alpha–beta pruning is most efficient if it searches the best moves first. The higher the branching factor, the lower the overhead of repeatedly expanded states,
Iterative deepening A* is a best first search that performs iterative deepening based on "f" values similar to the ones computed in the A* algorithm.
Итеративное углубление A* — это поиск в ширину, который выполняет итеративное углубление на основе значений "f", аналогичных тем, что вычисляются в алгоритме A*.
In computer science, iterative deepening search or more specifically iterative deepening depth first search (IDS or IDDFS) is a state space/graph search strategy in which a depth limited version of depth first search is run repeatedly with increasing depth limits until the goal is found. IDDFS is optimal, meaning that it finds the shallowest goal. Iterative deepening visits states multiple times, and it may seem wasteful. However, if IDDFS explores a search tree to depth , most of the total effort is in exploring the states at depth Relative to the number of states at depth , the cost of repeatedly visiting the states above this depth is always small. The main advantage of IDDFS in game tree searching is that the earlier searches tend to improve the commonly used heuristics, such as the killer heuristic and alpha–beta pruning, so that a more accurate estimate of the score of various nodes at the final depth search can occur, and the search completes more quickly since it is done in a better order. For example, alpha–beta pruning is most efficient if it searches the best moves first. The higher the branching factor, the lower the overhead of repeatedly expanded states,
Iterative deepening A* is a best first search that performs iterative deepening based on "f" values similar to the ones computed in the A* algorithm.
Двунаправленный IDDFS
IDDFS имеет двунаправленный аналог, который чередует два поиска: один начинается с исходного узла и движется вдоль направленных дуг, а другой – с целевого узла и продвигается вдоль направленных дуг в противоположном направлении (от головного узла дуги к хвостовому узлу дуги). Процесс поиска сначала проверяет, совпадают ли исходный и целевой узлы, и если да, то возвращает тривиальный путь, состоящий из единственного исходного/целевого узла. В противном случае, прямой поиск расширяет дочерние узлы исходного узла (множество ), обратный поиск расширяет родительские узлы целевого узла (множество ), и проверяется, пересекаются ли и . Если да, то найден кратчайший путь. В противном случае глубина поиска увеличивается, и вычисления повторяются. Одно из ограничений алгоритма заключается в том, что кратчайший путь, состоящий из нечетного числа дуг, не будет найден. Предположим, у нас есть кратчайший путь . Когда глубина достигнет двух шагов по дугам, прямой поиск перейдет от к , а обратный поиск – от к . Графически, границы поиска будут проходить друг мимо друга, и вместо этого будет возвращен неоптимальный путь, состоящий из четного числа дуг. Это иллюстрируется на следующих диаграммах: Что касается пространственной сложности, алгоритм помечает самые глубокие узлы в процессе прямого поиска, чтобы обнаружить существование промежуточного узла, в котором встречаются два процесса поиска. Дополнительная сложность применения двунаправленного IDDFS заключается в том, что если исходный и целевой узлы находятся в разных сильно связных компонентах, например, , и если нет дуги, выходящей из и входящей в , поиск никогда не завершится.
What comes to space complexity, the algorithm colors the deepest nodes in the forward search process in order to detect existence of the middle node where the two search processes meet. Additional difficulty of applying bidirectional IDDFS is that if the source and the target nodes are in different strongly connected components, say, , if there is no arc leaving and entering , the search will never terminate.