- •Методические указания
- •Темплан 2013г., п. __
- •I. Цель лабораторной работы
- •II. Общие сведения
- •1. Постановка задачи поиска
- •1.1. Формулировка цели
- •1.2. Формулировка задачи
- •1.3. Поиск решений
- •2. Cтратегии неинформированного поиска
- •III. Пример выполнения лабораторной работы
- •IV. Задание к лабораторной работе
- •Варианты заданий
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.