Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
А_ЛЕКЦИИ 8-9.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
924.16 Кб
Скачать

5.4. Эвристический поиск по заданному критерию: основные понятия; алгоритм а*.

Для многих задач можно сформулировать чисто эмпириче­ские правила, позволяющие уменьшить объем перебора. Все та­кие правила, используемые для ускорения поиска, зависят от специфической информации о задаче, представляемой в виде графа. Как уже говорилось информацию такого сорта называют эвристиче­ской информацией или эвристикой; методы поиска,использующие эвристики, называются эвристическими методами поиска. Один из путей уменьшить перебор состоит в выборе бо­лее «информированного» предиката preemn(s,l), который не строит так много не относящихся к делу вершин. Этот способ применим как в методе полного перебора, так и в методе перебора в глу­бину. Другой путь состоит в использовании эвристической ин­формации для модификации шага (5) алгоритма перебора в глубину. Вместо того чтобы размещать вновь построенные вер­шины в произвольном порядке в начале списка ОТКРЫТ, их можно расположить в нем некоторым определенным образом, зависящим от эвристической информации. Так, при переборе в глубину в первую очередь будет раскрываться та вершина, ко­торая представляется наилучшей.

Более гибкий (и более дорогой) путь использования эври­стической информации состоит в том, чтобы, согласно некото­рому критерию,, на каждом шаге переупорядочивать вершины списка" ОТКРЫТ. В этом случае перебор мог бы идти дальше в тех участках границы, которые представляются наиболее пер­спективными. Для того чтобы применять процедуру упорядочения, необходима мера, которая позволяла бы оценивать «перспективность» вершины. Такие меры называют оценочными функциями.

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

Предположим, что задана некоторая функция f, которая мо­гла бы быть использована для упорядочения вершин перед их раскрытием. Через f(n) обозначим значение этой функции на вершине n Условимся располагать вершины, предназначенные для рас­крытия, в порядке возрастания их значений функции f. Тогда можно использовать некоторый алгоритм, в котором для очередного раскрытия выбирается та вершина списка ОТКРЫТ, для которой значение f оказы­вается наименьшим. Будем называть такую процедуру алго­ритмом упорядоченного перебора .

Чтобы этот алгоритм упорядоченного перебора был приме­ним для перебора на произвольных графах (а не только на деревьях), необходимо предусмотреть в нем возможность работы в случае построения вершин, которые уже имеются либо в спи­ске ОТКРЫТ, либо в списке ЗАКРЫТ. При использовании не­которой произвольной функции f нужно учесть, что величина f для "некоторой вершины из списка ЗАКРЫТ может понизиться, если к ней найден новый путь (f (n) может зависеть от пути из s к n даже для вершин списка ЗАКРЫТ). Следовательно, мы должны тогда перенести такие вершины назад в список ОТКРЫТ. После принятия этих необходимых мер алгоритм упорядо­ченного поиска может быть представлен такой последователь­ностью шагов:

  1. Поместить начальную вершину s в список, называемый ОТКРЫТ, и вычислить f(s).

  2. Если список ОТКРЫТ пуст, то на выход дается сигнал о неудаче; в противном случае переходить к следующему этапу.

  3. Взять из списка ОТКРЫТ ту вершину, для которой f имеет наименьшее значение, и поместить ее в список, называе­мый ЗАКРЫТ. Дать этой вершине имя n. (В случае совпадения значений f для нескольких вершин выбирать вершину с мини­мальным f произвольно, но всегда отдавая предпочтение целе­вой вершине.)

  4. Если n— целевая вершина, то на выход подать решаю­щий путь, получаемый прослеживанием соответствующих указателей; в противном случае переходить к следующему этапу.

  5. Раскрыть вершину n, построив все непосредственно сле­дующие за ней вершины. (Если таковых не оказалось, пере­ходить сразу к (2).) Для каждой такой дочерней вершины m вычислить значение f(m).

  6. Связать с теми из вершин т, которых еще нет в списках ОТКРЫТ или ЗАКРЫТ, только что подсчитанные значения f{m). Поместить эти вершины в список ОТКРЫТ и провести от них к вершине n указатели.

  7. Связать с теми из непосредственно следующих за 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-предела, без учета того, в каком порядке они развер­тываются.