Главная arrow Поиск arrow Поиск A*
Как начинался компьютер
Компьютерная революция
Двоичный код
Разработки военных лет
Интегральные микросхемы
Микрокомпьютер
Персоны
Сеть
Язык компьютера
Развитие ПО
Гибкие системы
Средства разработки
Информатика
Вычислительная наука
Операционные системы
Искусственный интеллект
Предыстория
Поиск
Знания и рассуждения
Логика
Робототехника
 

 
Поиск A* Печать

Поиск A*: минимизация суммарной оценки стоимости решения

Наиболее широко известная разновидность поиска по первому наилучшему совпадению называется поиском А* (читается как «А звездочка»). В нем применяется оценка узлов, объединяющая в себе g(n), стоимость достижения данного узла, и h(n), стоимость прохождения от данного узла до цели:

f(n) = g(n) + h(n)

Поскольку функция g(n) позволяет определить стоимость пути от начального узла до узла n, а функция h(n) определяет оценку стоимости наименее дорогостоящего пути от узла п до цели, то справедлива следующая формула:

f(n) = оценка стоимости наименее дорогостоящего пути решения, проходящего через узел n

Таким образом, при осуществлении попытки найти наименее дорогостоящее решение, по-видимому, разумнее всего вначале попытаться проверить узел с наименьшим значением g(n) + h(n). Как оказалось, данная стратегия является больше чем просто разумной: если эвристическая функция h(n) удовлетворяет некоторым условиям, то поиск А* становится и полным, и оптимальным.

Анализ оптимальности поиска А* является несложным, если этот метод используется в сочетании с алгоритмом Tree-Search. В таком случае поиск А* является оптимальным, при условии, что h(n) представляет собой допустимую эвристическую функцию, т.е. при условии, что h(n) никогда не переоценивает стоимость достижения цели. Допустимые эвристические функции являются по своей сути оптимистическими функциями, поскольку возвращают значения стоимости решения задачи, меньшие по сравнению с фактическими значениями стоимости.

А поскольку g(n) — точная стоимость достижения узла л, из этого непосредственно следует, что функция f(n) никогда не переоценивает истинную стоимость достижения решения через узел n.

Очевидным примером допустимой эвристической функции является функция определения расстояния по прямой hSLD. Расстояние по прямой является допустимым, поскольку кратчайший путь между любыми двумя точками лежит на прямой; это означает, что длина прямого пути по определению не может представлять собой переоценку длины пути. На рисунке показан процесс поиска А* пути в Бухарест с помощью дерева.

Значения n вычисляются на основании стоимостей этапов, показанных на рисунке, а значения hSLD приведены в табл. 4.1. Следует, в частности, отметить, что узел Bucharest впервые появляется в периферии на этапе, показанном на рисунке, n, но не выбирается для развертывания, поскольку его f-стоимость выше, чем стоимость узла Pitesti. Иными словами эту ситуацию можно описать так, что может существовать решение, при котором путь проходит через город Питешти со стоимостью, достигающей 417, поэтому алгоритм не останавливается на решении со стоимостью 450. Данный пример может служить общим свидетельством того, что поиск А* с исssпользованием алгоритма Tree-Search является оптимальным, если функция h(n) допустима. Предположим, что на периферии поиска появился неоптимальный целевой узел G2, а стоимость оптимального решения равна С*.

В таком случае, поскольку узел G2 неоптимален, a h(G2) =0 (это выражение справедливо для любого целевого узла), можно вывести следующую формулу: f(G2) = g(G2) + h(G2) = g(G2) > С* Теперь рассмотрим периферийный узел л, который находится в оптимальном пути решения, например узел Pi testi в примере, приведенном в предыдущем абзаце. (Если решение существует, то всегда должен быть такой узел.) Если функция h(n) не переоценивает стоимость завершения этого пути решения, то справедлива следующая формула: f(n) = g(n) + h(n) < С*

Таким образом, доказано, что f (л) <C*<f{G2), поэтому узел G2 не развертывается и поиск А* должен вернуть оптимальное решение. Если бы вместо алгоритма Tree-Search использовался алгоритм Graph-Search, то данное доказательство стало бы недействительным. Дело в том, что алгоритм Graph-Search способен отбросить оптимальный путь к повторяющемуся состоянию, если он не был сформирован в первую очередь, поэтому может возвращать неоптимальные решения.

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

Такое свойство соблюдается, если на функцию h(n) налагается дополнительное требование, а именно требование обеспечения преемственности эвристической функции (такое свойство называют также монотонностью эвристической функции). Эвристическая функция h(n) является преемственной, если для любого узла n и для любого преемника л' узла л, сформированного в результате любого действия а, оценка стоимости достижения цели из узла л не больше чем стоимость этапа достижения узла n плюс оценка стоимости достижения цели из узла n*:

h(n) <= c(n, a, n`) + h(n`)

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

Можно довольно легко показать, что любая преемственная эвристическая функция является также допустимой. Наиболее важным следствием из определения преемственности является такой вывод: поиск А* с использованием алгоритма Graph-Search является оптимальным, если функция h(n) преемственна.

Несмотря на то что требование к преемственности является более строгим, чем требование к допустимости, весьма нелегко составить такие эвристические функции, которые были бы допустимыми, но не преемственными. Все допустимые эвристические функции, рассматриваемые в данной главе, являются также преемственными. Возьмем в качестве примера функцию hSLD. Известно, что общее неравенство треугольника удовлетворяется, если длина каждой стороны измеряется с помощью расстояния по прямой, и что расстояние по прямой между n и n` не больше чем c(n, a, n`). Поэтому эвристическая функция hSLD является преемственной.

Еще один важный вывод из определения преемственности является таковым: если функция h(n) преемственна, то значения функции f(n) вдоль любого пути являются неубывающими. Доказательство этого утверждения непосредственно вытекает из определения преемственности. Предположим, что узел n` — преемник узла n; в таком случае для некоторого а справедливо выражение g(n') = g{n)+c(n,a,n') и имеет место такая формула:

f(n') = g(n') + h(n') = g(n) + c(n, a, n') + h(n') >= g(n) + h(n) = f(n)

На основании этого можно сделать вывод, что последовательность узлов, развернутых в поиске А* с использованием алгоритма Graph-Search, находится в неубывающем порядке значений f(n). Поэтому первый целевой узел, выбранный для развертывания, должен представлять собой оптимальное решение, поскольку все дальнейшие узлы будут, по меньшей мере, столь же дорогостоящими.

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

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


Карта Румынии, на которой показаны контуры, соответствующие f=380, f = 4 00 и f = 420, притом что Arad является начальным состоянием. Узлы в пределах данного конкретного контура имеют f-стоимости, меньшие или равные значению стоимости контура

При поиске по критерию стоимости (таковым является поиск А* с применением h(n) = 0) эти полосы будут представлять собой «кольца» с центром в начальном состоянии. При использовании более точных эвристических функций полосы вытягиваются в направлении целевого состояния и становятся более узко сосредоточенными вокруг оптимального пути. Если С* представляет собой стоимость оптимального пути решения, то можно утверждать следующее:

  • в поиске А* развертываются все узлы со значениями f(n)<c*;
  • поэтому в поиске А* могут развертываться некоторые дополнительные узлы, находящиеся непосредственно на "целевом контуре" (где f(n) =С*), прежде чем будет выбран целевой узел.

На интуитивном уровне представляется очевидным, что первое найденное решение должно быть оптимальным, поскольку целевые узлы во всех последующих контурах будут иметь более высокое значение f-стоимости и поэтому более высокое значение g-стоимости (поскольку все целевые узлы имеют значения h(n) = 0). Кроме того, на интуитивном уровне также очевидно, что поиск А* является полным. По мере добавления полос с возрастающими значениями f мы должны в конечном итоге достичь полосы, в которой значение f будет равно стоимости пути к целевому состоянию4.

Следует отметить, что в поиске А* узлы со значением f (л) >С* не развертываются; например, как показано на рисунке, не развертывается узел Timisoara, даже несмотря на то, что является дочерним узлом корневого узла. Эту ситуацию принято обозначать так, что происходит отсечение поддерева, находящегося ниже узла

Timisoara; поскольку функция hSLD является допустимой, рассматриваемый алгоритм может безопасно игнорировать это поддерево, гарантируя вместе с тем оптимальность. Понятие отсечения (под которым подразумевается исключение из рассмотрения некоторых вариантов в связи с отсутствием необходимости их исследовать) является важным для многих областей искусственного интеллекта.

Одно заключительное наблюдение состоит в том, что среди оптимальных алгоритмов такого типа (алгоритмов, которые развертывают пути поиска от корня) поиск А* является оптимально эффективным для любой конкретной эвристической функции. Это означает, что не гарантируется развертывание меньшего количества узлов, чем в поиске А*, с помощью какого-либо иного оптимального алгоритма (не считая той возможности, когда осуществляется выбор на равных среди узлов с f(n) =С*. Это связано с тем, что любой алгоритм, который не развертывает все узлы со значениями f(п) <С*, подвержен риску потери оптимального решения.

Те соображения, что поиск А*, как один из всех подобных алгоритмов, является действительно полным, оптимальным и оптимально эффективным, оставляют довольно приятное впечатление. Но, к сожалению, это отнюдь не означает, что поиск А* может служить ответом на все наши потребности в поиске. Сложность заключается в том, что при решении большинства задач количество узлов в пределах целевого контура пространства состояний все еще зависит экспоненциально от длины решения. Хотя доказательство этого утверждения выходит за рамки этого веб-сайта, было показано, что экспоненциальный рост происходит, если ошибка эвристической функции растет не быстрее по сравнению с логарифмом фактической стоимости пути. В математических обозначениях условие субэкспоненциального роста состоит в следующем:

|h(n) – h*(n)| <= O(log h*(n))

где h*(n) — истинная стоимость достижения цели из узла п. Почти для всех практически применяемых эвристических функций эта ошибка, по меньшей мере, пропорциональна стоимости пути, и происходящий в связи с этим экспоненциальный рост в конечном итоге превосходит возможности любого компьютера. По этой причине на практике стремление находить оптимальное решение часто не оправдано.

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

Но большая продолжительность вычислений не является основным недостатком поиска А*. Поскольку при поиске А* все сформированные узлы хранятся в памяти (как и во всех алгоритмах Graph-Search), фактически ресурсы пространства исчерпываются задолго до того, как исчерпываются ресурсы времени. По этой причине поиск А* не является практически применимым при решении многих крупномасштабных задач. Разработанные недавно алгоритмы позволяют преодолеть эту проблему пространства, не жертвуя оптимальностью или полнотой, за счет небольшого увеличения времени выполнения.