Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_5 Неинформированный поиск.docx
Скачиваний:
20
Добавлен:
16.05.2015
Размер:
3.74 Mб
Скачать

1.3. Поиск решений

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

Для упрощения обозначим города латинскими буквами A—F (см. рис.3).

Корнем дерева поиска является начальное состояние А (Лос-Анджелес) (см рис.4). Первый этап состоит в проверке того, является ли корневое состояние целевым. Безусловно, оно таковым не является. Поскольку цель не достигнута, необходимо рассмотреть другие состояния, в нашем случае это города Сан-Фернандо (В) и Санта-Моника (С). Такой этап осуществляется путем развертывания текущего состояния, т.е. применения функции определения преемника к текущему состоянию для формирования нового множества состояний. Таким образом, получены новые состояния (см. рис.5–6), которые также необходимо проверить на соответствие цели и аналогичным образом развернуть.

Рис.4. Дерево поиска. Проверка корневой вершины

Рис.5. Дерево поиска после развертывания вершины А

Рис.6. Дерево поиска после развертывания вершины С

В этом и состоит суть поиска — пока что проверить один вариант и отложить другие в сторону. Данный процесс продолжается до тех пор, пока не будет найдено целевое состояние. Порядок, в котором происходит развертывание дерева, называется стратегией поиска.

Необходимо различать понятия пространство состояний и дерево поиска. В нашем случае пространство состояний — это карта Калифорнии, оно имеет только 6 состояний (см. рис.3). Дерево поиска описывает все возможные переходы между состояниями путем развертывания узлов, и число его вершин может быть бесконечно.

2. Cтратегии неинформированного поиска

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

Поиск в ширину — это простая стратегия, в которой вначале развертывается корневой узел, затем — все преемники корневого узла, после этого развертываются преемники этих преемников и т.д. При этом проверяется совпадение разворачиваемой вершиной с целью. Если целевая вершина достигнута, то поиск останавливается. На рис.7 приведен пример развертывания дерева поиска с использованием этой стратегии.

Рис.7. Стратегия поиска в ширину

Примечание. На первом шаге происходит развертывание корневой вершины А. На втором шаге разворачиваются все потомки А вершины В и С. На третьем этапе разворачиваются потомки этих вершин. Алгоритм завершается после разворачивания вершины Е — достигнуто целевое состояние. В результате получен путь ACEF. И наш агент достигает своего назначения.

Одним из недостатков такого поиска является многократное развертывание одних и тех же состояний. Например, вершина С и вершина А разворачивались дважды. Такие напрасные действия увеличивают время работы алгоритма, если он выполняется в виде программы на компьютере.

Средством устранения этой проблемы является ведение истории развернутых вершин, или списка развернутых вершин. Алгоритмы, которые забывают свою историю, обречены на то, что бы ее повторять . Если текущая вершина находится в этом списке, то нет смысла ее разворачивать, и она больше не рассматривается. По мере разворачивания вершин этот список пополняется. Пример работы поиска в ширину с ведением списка развернутых вершин представлен на рис.8.

Рис.8. Улучшенный вариант поиска в ширину

Примечание. На первом шаге разворачивается вершина А и заносится в список развернутых узлов. На втором шаге разворачиваются вершины В и С, которые также заносятся в список. На третьем шаге разворачиваются только узлы, отсутствующие в списке развернутых. Таким образом, нет необходимости разворачивать узлы А и С, их можно отбросить и сразу переходить к узлу Е.

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

На рис.9 приведен пример поиска в глубину в произвольном бинарном дереве. В этом примере всегда разворачивается самый левый потомок.

Рис.9. Поиск в глубину бинарном дереве. Цель — найти вершину М

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

Существуют и другие стратегии неинформированного поиска: поиск с ограничением глубины, поиск в глубину с итеративным углублением, двунаправленный поиск — когда путь строится одновременно с двух сторон пространства состояний и др. Изучение этих стратегий выходит за рамки лабораторной работы.

Рис.10. Стратегия поиска в глубину

Примечание. На первом шаге разворачиваем корневую вершину А. На втором шаге разворачиваем левый потомок вершины А — вершину В. На третьем шаге необходимо развернуть опять же самую левую вершину — вершину А, однако она есть в списке, и мы ее пропускаем и разворачиваем вершину С. На четвертом шаге пропускаем вершину В, разворачиваем D, пропускаем А, разворачиваем Е и приходим к цели — вершине F. Таким образом, получаем путь ABCEF.