- •Лекции 8-9(Тема 5)
- •5.2. Понятие пространства состояний задачи. Примеры
- •5.3.Стратегии поиска в пространствах состояний
- •5.3.1. Поиск с возвратами
- •5.3.2. Поиск в глубину и итеративное углубление
- •5.3. 3. Поиск в ширину
- •5.4. Эвристический поиск по заданному критерию: основные понятия; алгоритм а*.
- •5.5.Сведение задач к подзадачам
- •5.5.1. Представление задач в виде графов and/or
- •5.5.2. Примеры представлений в виде графа and/or
- •13.2. Поиск в ширину;
5.4. Эвристический поиск по заданному критерию: основные понятия; алгоритм а*.
Для многих задач можно сформулировать чисто эмпирические правила, позволяющие уменьшить объем перебора. Все такие правила, используемые для ускорения поиска, зависят от специфической информации о задаче, представляемой в виде графа. Как уже говорилось информацию такого сорта называют эвристической информацией или эвристикой; методы поиска,использующие эвристики, называются эвристическими методами поиска. Один из путей уменьшить перебор состоит в выборе более «информированного» предиката preemn(s,l), который не строит так много не относящихся к делу вершин. Этот способ применим как в методе полного перебора, так и в методе перебора в глубину. Другой путь состоит в использовании эвристической информации для модификации шага (5) алгоритма перебора в глубину. Вместо того чтобы размещать вновь построенные вершины в произвольном порядке в начале списка ОТКРЫТ, их можно расположить в нем некоторым определенным образом, зависящим от эвристической информации. Так, при переборе в глубину в первую очередь будет раскрываться та вершина, которая представляется наилучшей.
Более гибкий (и более дорогой) путь использования эвристической информации состоит в том, чтобы, согласно некоторому критерию,, на каждом шаге переупорядочивать вершины списка" ОТКРЫТ. В этом случае перебор мог бы идти дальше в тех участках границы, которые представляются наиболее перспективными. Для того чтобы применять процедуру упорядочения, необходима мера, которая позволяла бы оценивать «перспективность» вершины. Такие меры называют оценочными функциями.
Как уже отмечалось, обычный способ использования эвристической информации связан с употреблением для упорядочения перебора оценочных функций. Оценочная функция должна обеспечивать возможность ранжирования вершин — кандидатов на раскрытие — с тем, чтобы выделить ту вершину, которая с наибольшей вероятностью находится на лучшем пути к цели. Оценочные функции строились на основе различных соображений. Делались попытки определить вероятность того, что вершина расположена на лучшем пути. Предлагалось также использовать расстояние или другие меры различия между произвольной вершиной и множеством целевых вершин. В салонных играх или головоломках позиции часто ставится в соответствие определенное число очков на основе тех черт, которыми она обладает и которые представляются связанными со степенью уверенности в том, что это шаг к поставленной цели.
Предположим, что задана некоторая функция f, которая могла бы быть использована для упорядочения вершин перед их раскрытием. Через f(n) обозначим значение этой функции на вершине n Условимся располагать вершины, предназначенные для раскрытия, в порядке возрастания их значений функции f. Тогда можно использовать некоторый алгоритм, в котором для очередного раскрытия выбирается та вершина списка ОТКРЫТ, для которой значение f оказывается наименьшим. Будем называть такую процедуру алгоритмом упорядоченного перебора .
Чтобы этот алгоритм упорядоченного перебора был применим для перебора на произвольных графах (а не только на деревьях), необходимо предусмотреть в нем возможность работы в случае построения вершин, которые уже имеются либо в списке ОТКРЫТ, либо в списке ЗАКРЫТ. При использовании некоторой произвольной функции f нужно учесть, что величина f для "некоторой вершины из списка ЗАКРЫТ может понизиться, если к ней найден новый путь (f (n) может зависеть от пути из s к n даже для вершин списка ЗАКРЫТ). Следовательно, мы должны тогда перенести такие вершины назад в список ОТКРЫТ. После принятия этих необходимых мер алгоритм упорядоченного поиска может быть представлен такой последовательностью шагов:
Поместить начальную вершину s в список, называемый ОТКРЫТ, и вычислить f(s).
Если список ОТКРЫТ пуст, то на выход дается сигнал о неудаче; в противном случае переходить к следующему этапу.
Взять из списка ОТКРЫТ ту вершину, для которой f имеет наименьшее значение, и поместить ее в список, называемый ЗАКРЫТ. Дать этой вершине имя n. (В случае совпадения значений f для нескольких вершин выбирать вершину с минимальным f произвольно, но всегда отдавая предпочтение целевой вершине.)
Если n— целевая вершина, то на выход подать решающий путь, получаемый прослеживанием соответствующих указателей; в противном случае переходить к следующему этапу.
Раскрыть вершину n, построив все непосредственно следующие за ней вершины. (Если таковых не оказалось, переходить сразу к (2).) Для каждой такой дочерней вершины m вычислить значение f(m).
Связать с теми из вершин т, которых еще нет в списках ОТКРЫТ или ЗАКРЫТ, только что подсчитанные значения f{m). Поместить эти вершины в список ОТКРЫТ и провести от них к вершине n указатели.
Связать с теми из непосредственно следующих за n вершинами, которые уже были в списках ОТКРЫТ или ЗАКРЫТ, меньшее из прежних и только что вычисленных значений f. Поместить в список ОТКРЫТ те из непосредственно следующих за n вершин, для которых новое значение f оказалось меньше, и изменить направление указателей от всех вершин, для которых значение f уменьшилось, направив их к n и перейти к п.2.
Отметим, что множество вершин и упомянутых указателей, порождаемых этим алгоритмом, образует дерево (дерево перебора), причем на концах этого дерева расположены вершины из списка ОТКРЫТ.
Работу алгоритма проще всего пояснить, рассмотрев пример игры в восемь. Мы будем пользоваться следующей простой оценочной функцией:
f(n)=g(n)+W(n),
где (п) —длина пути в дереве перебора от начальной вершины до вершины п, a W(n) —это число фишек, которые лежат не на своем месте в описании состояния, связанного с вершиной п.
Так, для начальной вершины
значение
f
равно 0 + 4 = 4. По предположению с большей
вероятностью на оптимальном
пути находится та вершина, которая имеет
наименьшую оценку.
На рис. 5.12. показан результат применения к игре в восемь алгоритма упорядоченного перебора и использования такой оценочной функции. Значение f для каждой вершины приведено внутри кружка. Отдельно стоящие цифры показывают порядок, в котором раскрывались вершины.
Выбор оценочной функции сильно влияет на результат перебора. Использование оценочной функции, не учитывающей истинной перспективности некоторых вершин, может привести к построению путей, не обладающих минимальной стоимостью. С другой стороны, использование оценочной функции, которая
Рис.5.12.Результат
применения алгоритма упорядоченного
перебора
в игре в восемь(Нильсон,3).
Определим оценочную функцию f так, чтобы значение f (n) для любой вершины n представляло собой сумму оценки стоимости пути минимальной стоимости от начальной вершины s к вершине n и оценки стоимости пути минимальной стоимости от вершины n целевой вершине. Таким образом, f(n) представляет собой оценку стоимости пути минимальной стоимости при условии, что этот путь проходит через вершину п. По этой оценке та вершина списка ОТКРЫТ, которая имеет наименьшее значение f, считается лежащей на пути минимальной стоимости, и поэтому следующей должна быть раскрыта именно она.
Сформированная таким образом функция f дает возможность использовать широко известный алгоритм А*. Предположим, что путь минимальной стоимости от вершины n целевой вершине имеется, и целевым узлом, для которого стоимость этого пути становится минимальной, является узел t. В таком случае оценку f (n) можно сформировать как сумму двух слагаемых (рис.5.12.) следующим образом: f(n)=g(n) + h(n)
где g (n) — оценка стоимости оптимального пути от s до n, a h (п) — оценка стоимости оптимального пути от п до t.
Рис. 5.12. Формирование эвристической оценки f(n) стоимости пути с наименьшей стоимостью от s до t через п:
f(n) = g(n) + h(n)
После обнаружения узла n в процессе поиска возникает следующая ситуация: путь от s до n уже должен быть найден и его стоимость может быть вычислена как сумма стоимости дуг в этом пути. Такой путь от s до n не обязательно должен быть оптимальным (может существовать лучший путь от s до n, еще не обнаруженный в этом процессе поиска), но стоимость найденного пути, выраженная первым слагаемым g (п), может служить в качестве оценки минимальной стоимости пути от s до n . Задача определения второго слагаемого, h(n), сложнее, поскольку множество путей между узлами n и t к этому времени еще не было исследовано в процессе поиска. Поэтому h (n), как правило, представляет собой в полном смысле слова эвристическую гипотезу, основанную на имеющейся в распоряжении алгоритма общей информации о данной конкретной задаче. Поскольку значение h зависит от проблемной области, универсального метода формирования функции h не существует. Предположим, что функция h задана. Алгоритм поиска называется допустимым, если он всегда вырабатывает оптимальное решение (т.е. путь с минимальной стоимостью), при условии, что решение вообще существует. Рассматриваемая здесь реализация, в которой все решения вырабатываются с помощью перебора с возвратами, может считаться допустимой, если оптимальным является первое же из найденных решений. Предположим, что для каждой вершины n в пространстве состояний через h*(n) обозначена стоимость оптимального пути от n до целевого узла.Доказано (см.3), что допустимым является любой алгоритм А*, в котором используется эвристическая функция h, такая, что для всех узлов n в пространстве состояний справедливо следующее утверждение:
h(n) < h*(n) . Это предложение имеет большое практическое значение. Даже если неизвестно точное значение h*, достаточно найти нижнюю границу h* и использовать ее в качестве h в алгоритме А*. Это служит достаточной гарантией того, что алгоритм А* выработает оптимальное решение. В частности, может рассматриваться тривиальная нижняя граница, а именно: h(n) = 0 для всех п в пространстве состояний.
Такой вариант действительно гарантирует допустимость. Но недостаток использования условия h = 0 состоит в том, что оно не имеет эвристического потенциала и не обеспечивает какого-либо управления процессом поиска. Алгоритм А*, в котором используется h = 0, ведет себя аналогично алгоритму поиска в ширину. Мало того, он фактически сводит поиск в ширину к такому случаю, что функция стоимости дуг принимает значение с(n, n') = 1 для всех дуг (n,n ') в пространстве состояний. Такое отсутствие эвристического потенциала приводит к значительному увеличению потребности в ресурсах. Поэтому желательно иметь такое значение h, которое является нижним пределом h* (для обеспечения допустимости), а также в максимально возможной степени приближается к h* (для обеспечения эффективности). В идеале, если была бы известна стоимость h*, то в алгоритме можно было бы использовать само значение h*, поскольку алгоритм А*, в котором используется значение h*, находит оптимальное решение непосредственно, вообще без какого-либо перебора с возвратами.
Применение эвристических средств управления поиском по заданному критерию обычно позволяет сократить область поиска таким образом, чтобы в этом процессе посещались только узлы небольшой части пространства состояний задачи. Такое уменьшение области поиска можно рассматривать как сокращение эффективного объема ветвления в процессе поиска. Таким образом, если "среднее" ветвление в про-
странстве состояний задачи равно b , то применение эвристических средств управления поиском фактически приводит к возникновению среднего ветвления b', причем b' обычно значительно меньше чем b.
Несмотря на существенное уменьшение затрат на выполнение поиска, порядок сложности алгоритма А* продолжает оставаться экспоненциально зависимым от глубины поиска. Такое утверждение остается справедливым в отношении потребности в ресурсах и времени, и пространства, поскольку данный алгоритм предусматривает необходимость сопровождения информации обо всех сформированных узлах в памяти. В практических приложениях наиболее важным может стать один из этих ресурсов (время или пространство), и это зависит от конкретных обстоятельств. Но в большинстве практических ситуаций более важным ресурсом является пространство. Алгоритм А* способен за считанные минуты израсходовать все доступное пространство памяти. А после этого поиск фактически не может продолжаться, притом что пользователи часто готовы ждать окончания работы этого алгоритма в течение многих часов или даже суток, поскольку для них весьма важны его результаты.
Разработано несколько вариантов алгоритма А*, позволяющих экономить пространство за счет времени. По своему основному замыслу они аналогичны поиску в глубину с итеративным углублением. Потребность в ресурсах пространства сокращается от экспоненциальной до линейной зависимости от глубины поиска. Но за это приходится платить тем, что в пространстве поиска повторно формируются ранее сформированные узлы.
Один из вариантов модификации алгоритма А* называется IDA*- Iterative Deepening A* (алгоритм А* с итеративным углублением).
Метод IDA* аналогичен поиску в глубину с итеративным углублением, за исключением описанного ниже отличия. При итеративном углублении поиск в глубину осуществляется со все возрастающими пределами глубины. При каждой итерации поиск в глубину ограничивается текущим пределом глубины. Но в методе IDA* последовательный поиск в глубину ограничивается текущим пределом значений оценок узлов (т.е. эвристических f-значений узлов). Поэтому основной механизм поиска в методе IDA* также основан на поиске в глубину, при котором потребность в ресурсах пространства является очень низкой.
. При решении крупных задач поиска экономия пространства, достигаемая с помощью метода IDA*, может оказаться весьма значительной, тогда как издержки, связанные с повторением поиска, остаются вполне приемлемыми. Величина этих издержек зависит от свойств пространства поиска, в частности от свойств функции оценки f. В благоприятных ситуациях многие узлы имеют равные f-значения. В подобных ситуациях на каждом очередном этапе поиска в глубину рассматривается много новых узлов, количество которых превышает количество повторно формируемых узлов. Поэтому дополнительные издержки сравнительно малы. В неблагоприятных ситуациях f-значения, как правило, не являются одинаковыми для многих узлов. В крайнем случае каждый узел может иметь отличное от других f-значение. При этом возникает необходимость использовать целый ряд последовательных f-пределов, когда при каждом новом поиске в глубину формируется только один новый узел, а все остальные узлы представляют собой повторно сформированные узлы (которые были сформированы на предыдущих этапах и удалены из памяти). В таких крайних случаях дополнительные издержки, связанные с использованием метода IDA*, действительно становятся неприемлемыми.
Еще одно интересное свойство метода IDA* касается допустимости. Предположим, что функция f (N) определена как g(N) + h(N) для всех узлов N. Если функция h является допустимой (т.е. h(N) < h* (N) для всех N), то метод IDA* гарантирует нахождение оптимального решения.
Одним из возможных недостатков метода IDA* является то, что он не обеспечивает исследование узлов в порядке оценок по заданному критерию (т.е. в порядке возрастания f-значений). Например, предположим, что f — это функция оценки, которая не обязательно представлена в форме f = g + h. Если функция f не монотонна, то упорядочение по заданному критерию не гарантируется. Функция f называется монотонной, если ее значение монотонно возрастает вдоль путей в пространстве состояний. Причина нарушения упорядоченности по заданному критерию состоит в том, что при использовании немонотонной функции f значение f-предела может стать настолько большим, что узлы с разными f-значениями будут впервые развертываться при этом поиске в глубину. Процедура поиска в глубину будет развертывать узлы до тех пор, пока для них значение функции f не превысит f-предела, без учета того, в каком порядке они развертываются.
