Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
7
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

17.2 Алгоритмы перебора в ширину и глубину в пространстве состояний

Раскрытие вершины – применение оператора к текущему состоянию для получения смежных состояний.

Поиск в ширину в дереве решений.

Основан на ведении двух списков [OPEN] и [CLOSED]:

Поместить все узлы из множества So в список OPEN

  1. Если список OPEN пустой, то решений нет.

  2. Взять первую вершину из OPEN. Если она принадлежит Sq (множество конечных точек), то решение найдено. Если нет, то перенести его в вершину CLOSED

  3. Раскрыть вершину n и все порождённые вершины поместить в список OPEN настроив указатели к вершине n

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

Этот алгоритм позволяет определить в первую очередь самый короткий путь к целевой вершине.

Алгоритм равных цен

Это модификация перебора в ширину, которая учитывает стоимость дуг. В этом случаи для каждой вершины, кроме указателя на родительскую вершину нужно запоминать и стоимость пути. Для дерева это минимальный путь. Особенностью метода является то, что вершины раскрываются в порядке возрастания стоимостей g(n).

  1. Помещаем начальную вершину в список OPEN. Полагаем

  2. Если OPEN пуст то решений нет.

  3. Взять из OPEN ту вершину, для которой =min(). В случаи равенства значений - любую из них отдавая предпочтение целевой. Перенесём эту вершину в CLOSED и обозначим n как текущую вершину.

  4. Если n - целевая вершина, то построить решение используя указатели.

  5. Раскрыть вершину n, построить порождённые вершины, если таких нет то переходим к п2. . Поместить эти вершины в список OPEN вместе с ценами и указателями на n

  6. Перейти к п2.

Если целевая вершина описана явно то процесс перебора можно построить в обратном порядке. Для этого нужно обратить оператор Г.

Алгоритм поиска в глубину

Раскрываем в первую очередь вершины, которые порождены последней. Глубина дерева определяется рекурсивно. Глубина корня=0. Глубина последующей вершины равна глубине родительской + 1. При переборе в глубину наибольшую глубину имеет вершина раскрытая последней в данный момент.

АЛГОРИТМ:

  1. Поместить начальные вершины в OPEN.

  2. Если OPEN пуст, то нет решений

  3. Взять последнюю вершину из OPEN и переместить в CLOSED и обозначить через n

  4. Если глубина n= граничной то перейти к п2.

  5. Раскрыть вершину n, поместив все порожденные в конец списка OPEN и построить указатели к n.

  6. Если одна из вершин целевая, то выдать решение, используя указатели. Иначе перейти к п2.

Для поиска в глубину часто используют стек, тогда не нужны указатели.

Изменения при переборе в произвольных графах.

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

Для поиска в произвольном графе без учёта стоимостей нужно только проверить есть ли данная вершина в списках OPEN или CLOSED и если она там есть, то второй раз её не вносить, а только изменить указатель.

В алгоритме равных цен:Если построенная вершина уже есть в списке OPEN, то её вносить в список не следует, но необходимо изменить величину и указатель в том случае, когда найден более короткий путь. Если вершина помещена в CLOSED, то ничего изменять не нужно, поскольку в этом случаи наименьшее.

В поиске в глубину:Необходимо пересчитывать глубину при раскрытии той же самой вершины.

В произвольном графе множество вершин и указателей на каждом шаге перебора образуют дерево.