- •Глава 3 методы поиска в пространстве состояний
- •3.1. Процессы поиска на графе
- •3.2. Методы полного перебора
- •3.3. Метод перебора в глубину
- •3.4. Изменения при переборе на произвольных графах
- •3.5. Обсуждение эвристической информации
- •3.6. Использование оценочных функций
- •3.7. Оптимальный алгоритм перебора
- •3.8. Эвристическая сила функции ĥ
- •3.9. Важная роль функции ĝ
3.3. Метод перебора в глубину
В методах перебора в глубину прежде всего раскрываются те вершины, которые были построены последними. Определим глубину вершины в дереве следующим образом:
Глубина корня дерева равна нулю.
Глубина любой последующей вершины равна единице плюс глубина вершины, которая непосредственно ей предшествует.
Таким образом, вершиной, имеющей наибольшую глубину в дереве перебора, в данный момент служит та, которая должна в этот момент быть раскрыта. Такой подход может привести к процессу, разворачивающемуся вдоль некоторого бесполезного пути, поэтому нужно ввести некоторую процедуру возвращения. После того как в ходе процесса строится вершина с глубиной, превышающей некоторую граничную глубину, раскрывается вершина наибольшей глубины, не превышающей этой границы, и т.д.
Метод перебора в глубину определяется следующей последовательностью шагов:
(1) Поместить начальную вершину в список, называемый ОТКРЫТ.
(2) Если список ОТКРЫТ пуст, то на выход дается сигнал о неудаче поиска, в противном случае перейти к шагу (3).
(3) Взять первую вершину из списка ОТКРЫТ и перенести ее в список, называемый ЗАКРЫТ. Эту вершину назвать п.
(4) Если глубина вершины п равна граничной глубине, то переходить к (2), в противном случае - к (5).
(5) Раскрыть вершину п, построив все непосредственно следующие за ней вершины. Поместить их (в произвольном порядке) в начало списка ОТКРЫТ и построить указатели, идущие от них к вершине п.
(6) Если одна из этих вершин целевая, то на выход выдать решение, просматривая для этого соответствующие указатели, в противном случае переходить к шагу (2).
На рис 3 4 приведена блок-схема для метода перебора в глубину. Дерево, которое получается в результате применения метода перебора в глубину к той же самой игре в восемь, что и прежде, показано на рис. 3.5. Снова нужно найти последовательность ходов для преобразования левой конфигурации в правую:
Вершины здесь занумерованы в том порядке, в котором они были раскрыты, причем граничная глубина выбрана равной 5 (т.е. ищутся пути, ведущие к цели, длина которых не больше пяти).
Видно, что в алгоритме поиска в глубину сначала идет перебор вдоль одного пути, пока не будет достигнута максимальная глубина, затем рассматриваются альтернативные пути той же или меньшей глубины, которые отличаются от него лишь последним шагом, после чего рассматриваются пути, отличающиеся последними двумя шагами, и т.д.
3.4. Изменения при переборе на произвольных графах
При переборе на графах, а не на деревьях, нужно внести некоторые естественные изменения в указанные алгоритмы. В простом методе полного перебора не нужно вносить никаких изменений; следует лишь проверять, не находится ли уже вновь построенная вершина в списках ОТКРЫТ или ЗАКРЫТ по той причине, что она уже строилась раньше в результате раскрытия какой-то вершины Если эта так, то ее. не нужно вновь помещать в список ОТКРЫТ
Несколько более сложные изменения должны быть сделаны в алгоритме равных цен:
(1) Если вновь построенная вершина уже имеется в списке ОТКРЫТ, то ее не следует вносить в этот список снова. Однако соответствующая ей величина стоимости ĝ может оказаться теперь меньше (может быть найден менее дорогой путь). Мы всегда связываем с вершинами списка ОТКРЫТ наименьшие из имевшихся до сих пор значений ĝ. Точно так же указатель от вершины всегда должен быть направлен к породившей ее вершине, расположенной на том пути, стоимость которого оказалась наименьшей среди всех путей к этой вершине, рассмотренных к настоящему моменту.
(2) Если вновь построенная вершина уже имеется в списке ЗАКРЫТ, то, казалось бы, возможно, что для нее величина ĝ окажется меньше, чем раньше, так как направление ее указателя должно быть выбрано заново. Но на самом деле этого не происходит. Позже мы докажем, что если в алгоритме равных цен некоторая вершина помещается в список ЗАКРЫТ, то уже найдена наименьшая возможная величина ĝ (и, следовательно, путь наименьшей стоимости, идущий к этой вершине).
Прежде чем делать какие-либо изменения в алгоритме перебора в глубину, нужно решить, что понимать под глубиной вершины в графе. Согласно обычному определению, глубина вершины равна единице плюс глубина наиболее близкой родительской вершины, причем глубина начальной вершины предполагается равной нулю. Тогда поиск в глубину можно было бы получить, выбирая для раскрытия самую глубокую вершину списка ОТКРЫТ (без превышения граничной глубины) Когда порождаются вершины, уже имеющиеся либо в списке ОТКРЫТ, либо в списке ЗАКРЫТ, пересчет глубины такой вершины может оказаться необходимым.
Рис. 3.3. Блок-схема программы алгоритма равных цен для деревьев.
Рис. 3.4. Блок-схема программы алгоритма поиска в глубину для деревьев.
Даже в том случае, когда перебор осуществляется на полном графе, множество вершин и указателей, построенное в процессе перебора, тем не менее образует дерево (Указатели по-прежнему указывают только на одну порождающую вершину.) В оставшейся части этой главы мы имеем дело с общим случаем поиска на графе, и, следовательно, в алгоритмах, которые мы будем обсуждать, явным образом учитываются эти дополнительные изменения.