
- •Лекции 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.3.Стратегии поиска в пространствах состояний
Под стратегией поиска понимается алгоритм исследования пространства состояний при поиске пути от начального состояния к целевому, допускающий программную реализацию. Поэтому граф должен задаваться отношениями так, что соответствующие им предикаты можно было бы использовать в программе для представления множеств узлов и связывающих их путей.
Эти отношения могут быть представлено в турбо- прологовской программе явно, в виде множества фактов. Но такой вариант при наличии пространства состояний с сколько-нибудь значительной сложностью может оказаться практически неприемлемым или невозможным. Поэтому, чаще всего отношения определения узлов и их преемников задается системой правил, содержащих переменные (см. Пример 5.1.1. ).
5.3.1. Поиск с возвратами
В дальнейшем под раскрытием узла (вершины) будем понимать построение всех его преемников- потомков «первого поколения».
Стратегия поиска с возвратами использует в общем случае три списка вершин : список вершин, представляющий ациклический путь от текущей вершины до начальной -C;
список новых (не исследованных ранее) состояний ,соответствующих текущему –N;
список вершин – тупиков (среди их потомков целевой вершины не оказалось)- T.
Алгоритм поиска с возвратами запускается из начального состояния и следует по некоторому пути до тех пор, пока не достигнет цели либо не упрется в тупик. Если цель достигнута, поиск завершается, и в качестве решения задачи возвращается путь к цели. Если же поиск привел в тупиковую вершину, то алгоритм возвращается в ближайшую из пройденных вершин и исследует все ее вершины-братья, а затем спускается по одной из ветвей, ведущих от вершины-брата.
Алгоритм поиска с возвратами.
Присвоить значения: C =[]; N = [S], T = [ ], где S –исходная вершина
Извлечь первую вершину X из списка N ; если вершина X целевая, поместить ее в начало списка C , работу закончить, принять в качестве решения (SOL) список C иначе перейти к следующему пункту.
Раскрыть X и удалить всех ее потомков принадлежащих хотя бы одному из названных трех списков; перейти к следующему пункту.
Если все потомки вершины X были удалены, то удалить ее из списков C и N, поместить вершину X в список T и, если N = [], констатировать неудачу (решение не найдено), иначе перейти к пункту 1; иначе перейти к следующему пункту.
4. Поместить оставшихся потомков вершины X в начало списка N и перейти к пункту 1.
Алгоритм работает до тех пор, пока не достигнет цели либо не исследует все пространство состояний. На рис. 5.9. изображен процесс поиска с возвратами в гипотетическом пространстве состояний. Пунктирные стрелки указывают направление процесса поиска в пространстве состояний. Вершины пронумерованы в порядке их обхода до обнаружения целевой вершины G согласно изложенному алгоритму , путь [ A, C, G] является решением задачи. Приведем программу на языке Турбо- Пролог, реализующую этот алгоритм. В дальнейшем для определенности в программах будем использовать данные домена symbol и применять следующие обозначения:
s- тип данных symbol;
l- список с элементами типа s, l= s*;
eq (l, l)- предикат сравнения списков, принимающий истинное значение при совпадении его аргументов и ложное в противном случае;
udob (l, l, l)- предикат удаления элементов второго аргумента, принадлежащих и первому аргументу , принимает истинное значение, если третий аргумент равен результату указанного удаления и ложное в противном случае;
ap (l, l, l)- предикат присоединения первого аргумента в начало второго с помещением результата в третий аргумент
(системы правил определяющих эти три предиката , ввиду их простоты, в программах будут опускаться);
preemn (s, l)- предикат ,определяющий список l – преемников (потомков первого поколения) вершины s;
gs (s)- предикат, задающий целевую вершину
(два последних предиката зависят от решаемой задачи и поэтому их описание в общей программе не может быть приведено);
solve( , …, l) – предикат поиска пути l – решения задачи;
sol – предикат, задающий цель программы.
Пример 5.3.1
/*Программа: поиск с возвратами */
domains
s=symbol
l= s*
predicates
ap (l, l, l)
eq (l, l)
udob (l, l, l)
preemn (s, l)
gs(s)
solve (l, l, l, l)
sol
clauses
sol:-solve ([s], [], [], P), write (“sol =”,P),nl.
solve ([X|N], C, T, P):- C1= [X|C], gs(X), P= C1.
solve ([X|N], C, T, P):- C1= [X|C], preemn (X, L), udob (C1, L, L1),
udob (N, L1, L2), udob (T, L2, L3), eq(L3, []),udob ([X], C1,C2),
udob ([X], N,N1), T1= T, solve (N1,C2,T1,P1), P=P1.
solve ([X|N], C, T, P):- C1= [X|C], preemn (X, L), udob (C1, L, L1),
udob (N, L1, L2), udob (T, L2, L3), ap(L3, [X|N], N1),
T1=T, solve (N1,C1,T1,P1), P=P1.
solve ([],C,T,P):- P= resh.net, write(P),nl.
goal
sol