Информированный поиск в пространстве состояний

advertisement
Информированный поиск в пространстве состояний
Информированный поиск в пространстве состояний
└ Общее
Стратегии управления для процедур вывода
Вспомним продукционные системы и введём некоторые понятия.
Состояние – знания о конкретной задаче.
Поиск решения – поиск в пространстве состояний.
Стратегии поиска:
• Безвозвратные – правила применяются необратимо.
• Пробные – поиск с возвратом и поиск на графе.
Информированный поиск в пространстве состояний
└ Общее
Поиск на графе для системы продукций
Пусть задан некоторый граф поиска G, вершины которого – состояния, а
дуги – правила вывода. Если дуга идёт от ni к nj, то nj – преемник, а ni –
потомок. Обозначим стоимость как c(ni, nj). Начальная вершина – s, а
целевые – {ti}.
Оператор РАСКРЫТЬ(n) – применить к вершине n все допустимые
правила.
Раскрываем вершины до тех пор, пока построенный граф G’ не будет
включать целевые вершины.
Информированный поиск в пространстве состояний
└ Общее
└ «Игра в восемь»
Пример
Пример – «игра в 8»
Пример – «игра в 8».
Правила вывода:
1. Если не в левом столбце, то сдвиг влево.
2. Если не в правом столбце, то сдвиг вправо.
3. Если не в верхней строке, то сдвиг вверх.
4. Если не в нижней строке, то сдвиг вниз.
Начальное состояние:
2 8 3
1
Целевое состояние:
6
4
7 ⃞
5
2
3
8 ⃞
4
6
5
1
7
Информированный поиск в пространстве состояний
└ Общее
└ Поиск на графе
Поиск на графе: общая идея
Начиная с вершины s, циклически раскрываем вершины, порождая
граф поиска G. Одновременно строим дерево поиска T: все
вершины из G содержатся в T, если у вершины в G больше
одного родителя, то в T входит ребро только к одному из них.
Концевые вершины T образуют список OPEN. Уже раскрытые
вершины (вне зависимости от наличия преемников) образуют
список CLOSED.
После каждого нового раскрытия может быть произведена
перестройка дерева T, если стоимость пути от вновь раскрытой
вершины или её потомков к s в дереве T больше, чем в графе
G; при этом в T включается более дешёвый путь.
Информированный поиск в пространстве состояний
└ Общее
└ Поиск на графе
Раскрываем вершины
←
2
8
3
1
6
4
7
⃞
5
↑
→
2
8
3
2
8
3
2
8
3
1
6
4
1
⃞
4
1
6
4
⃞
7
5
7
6
5
7
5
⃞
←
↑
↑
→
↑
2
8
3
2
8
3
2
⃞
3
2
8
3
2
8
3
⃞
6
4
⃞
1
4
1
8
4
1
4
⃞
1
6
⃞
1
7
5
7
6
5
7
6
5
7
6
5
7
5
4
Информированный поиск в пространстве состояний
└ Общее
└ Поиск на графе
Строим граф поиска
S
S
↑
1
↑
↑
↑
2
1
3
↑
4
S
↑
1
↑
4
↑
↑
2
3
↑
↑
5
6
↑
7
↑
2
↑
5
↑
3
Информированный поиск в пространстве состояний
└ Общее
└ Поиск на графе
Эвристический поиск
Для эффективной работы неплохо было бы упорядочивать список
открытых вершин, чтобы включать в решение наиболее
короткий путь.
Эвристический – «интуитивный», «неосознанный»
Эвристический алгоритм – алгоритм решения задачи, не имеющий
строгого обоснования, но дающий приемлемое решение в
большинстве практически значимых случаев.
Процедура поиска, использующая эвристическую информацию о
проблеме – эвристическая процедура поиска. В противном
случае – неинформированная процедура поиска.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Общее
Алгоритм A*
Пусть h*(n) – стоимость минимального пути от n к целевой
вершине, а g*(n) – от исходной s к n.
Введём f*(n) = g*(n) + h*(n) и будем считать f(n) оценкой f*(n).
Обозначим f(n) = g(n) + h(n), где g(n) и h(n) – оценки g*(n) и h*(n)
соответственно, как стоимость пути из начальной вершины к
целевой, проходящего через вершину n.
h(n) – эвристическая функция, поскольку целевая вершина не
присутствует в графе поиска.
Алгоритм поиска на графах, использующий оценочную функцию
вида f(n) = g(n) + h(n) – алгоритм A. Если в качестве оценки h
взять нижнюю границу h*, то есть h(n) << h*(n) для всех n, то
получим алгоритм A*.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Общее
Алгоритм A*
Итак, формально:
1. Добавим стартовый узел в открытый список
2. Цикл поиска:
1.
2.
3.
4.
3.
4.
Отбираем в открытом списке узел с наименьшей стоимостью. Он является текущим.
Если текущий узел – конечный, идём на шаг 4.
Исследуем узлы, соседние для текущего. Для каждого из них:
•
Если узел непроходим либо уже содержится в открытом или закрытом списке,
переходим к следующему
•
Определяем стоимость узла (значение оценки f(n))
•
Устанавливаем текущий узел в качестве родителя
•
Добавляем узел в открытый список
Добавляем текущий узел в закрытый список
Повторяем шаг 2 с обновлённым открытым списком
Конечный узел найден. По ссылкам на родителей восстановим весь искомый
путь.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Свойства
Свойства A*
Свойство 1. A* всегда заканчивает работу на конечных графах.
Свойство 2. В любой момент до завершения работы A* в открытом
списке существует вершина n’, лежащая на оптимальном пути
от s к целевой вершине, причём f(n’) ≤ f*(s).
Свойство 3. Если путь от s к целевой вершине существует, то A*
завершает работу даже для бесконечных графов.
Алгоритм поиска состоятелен, если для любого графа он
завершает работу, получая оптимальный путь от s к целевой
вершине.
Свойство 4. Алгоритм A* состоятелен.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Свойства
Свойства A*
Свойство 5. Для любой вершины n, выбранной алгоритмом A* для
раскрытия, f(n) ≤ f*(s).
Пусть есть два варианта алгоритма A* – A1 и A2, использующие
оценочные функции f1(n) = g1(n) + h1(n) и f2(n) = g2(n) + h2(n)
соответственно, где h1 и h2 – нижние границы для h*. Если для
всех нецелевых вершин n справедливо h2(n) > h1(n), то алгоритм
A2 – более информированный, чем A1.
Свойство 6. Если A1 и A2 – два варианта алгоритма A*, причём A2
более информирован, чем A1, то к окончанию поиска на любом
графе, имеющем путь от s к целевой вершине, каждая
раскрытая A2 вершина раскрыта также и A1.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Свойства
Монотонное ограничение на эвристическую функцию
При поиске по графу может возникнуть неприятная ситуация: алгоритм
может отбросить оптимальный путь к повторяющемуся состоянию,
если он не был сформирован в первую очередь. Если при раскрытии
вершины некоторые её преемники уже стоят в открытом или закрытом
списках, то потребуется перестроить дерево поиска.
Однако при соблюдении некоторых ограничений на эвристическую
функцию при выборе вершины для раскрытия алгоритм сразу находит
оптимальный путь к ней.
Если для всех вершин ni и nj, таких, что ni – родитель nj, справедливо
утверждение h(ni) – h(nj) ≤ c(ni, nj), то функция h удовлетворяет
монотонному ограничению (или является преемственной).
Это неравенство – форма неравенства треугольника: h(ni) ≤ h(nj) + c(ni, nj)
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Свойства
Свойства A*
Свойство 7. Если удовлетворяется монотонное ограничение, то
алгоритм A* автоматически обнаруживает оптимальный путь к
любой вершине, выбранной для раскрытия.
Доказательство. Пусть n – любая из вершин, выбранных для
раскрытия A*, причём n не совпадает с s.
Пусть P = {s = n0, n1, n2, …, nk = n} – оптимальный путь от s к n, а nl
– последняя вершина в нём, находящаяся в закрытом списке,
пока A* выбирает n для раскрытия. Предположим, что в
открытом списке есть nl+1 из P, в то время, как A* выбирает
вершину n (то есть A* выбирает не оптимальный путь).
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Свойства
Свойства A*
По монотонному ограничению получим:
h(ni) ≤ c(ni, ni+1) + h(ni+1)
Добавим к обеим частям g*(ni):
g*(ni) + h(ni) ≤ g*(ni) + c(ni, ni+1) + h(ni+1)
Поскольку ni и ni+1 находятся на оптимальном пути, имеем
g*(ni+1) = g*(ni) + c(ni, ni+1) и, следовательно,
g*(ni) + h(ni) ≤ g*(ni+1) + h(ni+1).
Последнее неравенство, очевидно, транзитивно. Тогда:
g*(nl+1) + h(nl+1) ≤ g*(nk) + h(nk), или f(nl+1) ≤ g*(n) + h(n)
Однако A* выбрал вершину n тогда, когда в открытом списке находилась
вершина nl+1, то есть f(n) ≤ f(nl+1). Значит,
g(n) + h(n) ≤ f(nl+1) ≤ g*(n) + h(n), то есть g(n) ≤ g*(n).
Но для каждой вершины m на дереве поиска g*(m) ≤ g(m). Значит, в
открытом списке нет вершины, лежащей на пути к n.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Свойства
Свойства A*
Свойство 8. Если удовлетворяется монотонное ограничение,
значения f для последовательности вершин, раскрытых A*, не
убывают.
Сложность. Количество обрабатываемых узлов экспоненциально
зависит от длины решения, если только не соблюдается
неравенство ∣h(n) – h*(n)∣ ≤ O(log h*(n)), однако на практике для
большинства эвристических функций ошибка по меньшей мере
пропорциональна стоимости пути.
Таким образом, сильно растёт временная сложность. Но так как
все обрабатываемые узлы хранятся в памяти, пространство
закончится гораздо раньше, чем нас начнёт беспокоить
проблема времени.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Вариации на тему
Алгоритм RBFS
Рекурсивный поиск в глубину с эвристикой. Контролирует fзначение наилучшего альтернативного пути, доступного из
любого предка текущего узла. Если предел превышен, то
текущий этап рекурсии отменяется и рекурсия продолжается с
альтернативного пути. После отмены данного этапа f-значение
каждого узла вдоль данного пути заменяется на наилучшее fзначение его потомка. Таким образом, лучший лист из
отброшенного поддерева сохраняет f-значение в памяти и при
выборе новых вершин для раскрытия можно принять решение,
стоит ли к нему возвращаться.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Вариации на тему
Алгоритм RBFS
function RecursiveBestFirstSearch(problem) returns решение result или индикатор неудачи failure
RBFS(problem, Make-Node(InitialState[problem]), ∞)
function RBFS(problem, node, f_limit) returns решение result или индикатор неудачи failure и
новый предел f-стоимости f_limit
if GoalTest[problem](State[node]) then return узел node
successors ← Expand(node, problem)
if множество узлов-преемников successors пусто
then return failure, ∞
for each s in successors do
f[s] ← max(g(s) + h(s), f[node])
repeat
best ← узел с наименьшим f-значением из successors
if f[best] > f_limit then return failure, f[best]
alternative ← второе после наименьшего f-значение из successors
result, f[best] ← RBFS(problem, best, min(f_limit, alternative))
if result ≠ failure then return result
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Вариации на тему
Алгоритм RBFS
RBFS убирает проблему с пространственной сложностью, но не
трогает проблему временной. Последняя зависит как от
точности эвристической функции, так и от частоты смены
наилучшего пути в ходе раскрытия узлов. Кроме того, он не
позволяет отследить «петли» вне текущего пути и может много
раз возвращаться к одному и тому же состоянию.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Вариации на тему
Алгоритм SMA*
Так же, как и A*, разворачивает наилучшие вершины, пока хватает
памяти. Когда достигнут лимит памяти, алгоритм уничтожает
наихудший листовой узел, чтобы добавить новый. Значение
уничтоженного узла резервируется в родительском. Таким
образом, хотя нельзя сказать, куда именно надо следовать от
вершины n, все потомки которой были уничтожены, можно
сказать, есть ли смысл куда-либо от неё следовать. При этом
алгоритм всегда разворачивает самую новую из наилучших и
удаляет самую старую из наихудших вершин, чтобы не выбрать
для удаления и развёртывания один и тот же лист, если у всех
листьев одинаковые f-значения.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Эвристические функции
Эвристические функции
Вернёмся к «игре в восемь». Основные кандидаты на
эвристическую функцию:
1. h1 – количество фишек не на своём месте (в примере h1 = 8)
2. h2 – сумма расстояний всех фишек до их целевых позиций
(манхэттенское расстояние; в примере h2 = 3+1+2+2+2+3+3+2 =
18).
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Эвристические функции
Эвристические функции
Эффективный коэффициент ветвления b*.
Пусть общее количество вырабатываемых узлов равно N, а глубина
решения равна d. Тогда b* – коэффициент ветвления однородного
дерева глубины d, содержащего N+1 узлов.
d
N+1 = 1 + b* + (b*)2 + … + (b*)d =
 (b*)
i
i 0
Например, решение на глубине 5 с использованием 52 узлов даёт b* =
1,92. Хорошая эвристическая функция должна давать b*, близкое к 1.
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Эвристические функции
Составление эвристических функций
Использование ослабленных задач.
Фишка может быть передвинута из A в B, если эти квадраты
являются смежными по горизонтали или вертикали и квадрат B
пуст.
Ослабленные задачи:
1. Фишка может быть передвинута, если квадраты смежны
2. Фишка может быть передвинута, если квадрат B пуст
3. Фишка может быть передвинута из квадрата A в квадрат B.
При этом при получении m функций на подзадачах можно
использовать их все понемногу:
h(n) = max(h1(n), h2(n), …, hm(n)).
Информированный поиск в пространстве состояний
└ Алгоритм A*
└ Эвристические функции
Составление эвристических функций
Использование подзадач.
Базы данных с шаблонами: храним указанные точные стоимости
решений для каждого возможного экземпляра подзадачи, а
функцию считаем на основе соответствующей выборки из БД.
Download