1 / 51

Изкуствен интелект Упражнение № 2

Изкуствен интелект Упражнение № 2. спец. Информатика, IV курс 2005/2006 учебна година. Задачи за търсене в пространството от състояния. Удовлетворяване на ограничения ( Constraint satisfaction problem - CSP) Т ърсене на целево състояние Моделиране на игри за двама играчи.

jake
Download Presentation

Изкуствен интелект Упражнение № 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Изкуствен интелектУпражнение № 2 спец. Информатика, IV курс 2005/2006 учебна година

  2. Задачи за търсене в пространството от състояния • Удовлетворяване на ограничения(Constraint satisfaction problem - CSP) • Търсене на целево състояние • Моделиране на игри за двама играчи

  3. Търсене на целево състояние (Търсене на път в граф) • Графът (graph)се състои от множество Nотвъзли / върхове / състояния (nodes)и множествоAот наредени двойки от върхове, наречени дъги (arcs). • Върхът n2е съсед (neighbor)наn1, ако съществува дъга между n1 и n2, т.е. <n1,n2> є A. • Път (path)е последователност от върхове n0, n1, ...nk ¸такава че<ni-1,ni> є A, i=1..k .

  4. Търсене на целево състояние (Търсене на път в граф) • Дадени са начални върхове/състояния (start nodes)и крайни/ целеви състояния (goal nodes), решение (solution)е път от начално състояние до крайно състояние.

  5. Пример: Граф

  6. Пример: Мрежа g s

  7. Общ алгоритъм • Общ алгоритъм за търсене: • даден е граф • начални състояния • целеви състояния • последователно да се изследват пътищата от началните състояния

  8. Общ алгоритъм • Поддържа се фронт/граница(frontier)от пътищата, които са били изследвани • По време на процеса на търсене фронта се разширява в посока към неизследваните възли, докато се достигне до целеви възел

  9. Общ алгоритъм • Предполагаме, че след като алгоритъма за търсене намери един път, може да му бъде зададено да търси още решения и тогава процесът трябва да продължи • Начинът, по който фронта се разширява и това точно коя стойност от фронта се избира дефинира стратегията на търсене (search strategy).

  10. frontier start node unexplored nodes explored nodes

  11. Основни алгоритми • Неинформирано (сляпо) търсене • Информирано (евристично) търсене

  12. Основни алгоритми • Неинформирано (сляпо) търсене • търсене в дълбочина (Depth-first search) • търсене в ширина (Breadth-first search) • търсене в ограничена дълбочина (Depth-bound search) • итеративно търсене по нива(Iterative-deepening search)

  13. Търсене в дълбочина • При търсенето в дълбочина фронтът се обработва като стек • Ако фронта е [p1,p2, . . .] • избира се p1 • пътищата p1', p1'',…, p1(k), които разширяват p1се добавят в началото на стека (преди p2), т.е. [p1', p1'',…, p1(k),p2, . . .] • p2 се обработва едва след като всички пътища, които са продължение на p1 са били изследвани

  14. Представяне на графа arc(Node1,Node2). arc(Node1,Node2,Cost). arc(a,b). arc(d,e). arc(a,d). arc(e,c). arc(b,a). arc(e,d). arc(b,c). arc(c,e). arc(d,a). arc(d,b). arc(d,c). b a c e d

  15. Построяване на дървото arc(a,b). arc(a,d). arc(b,a). arc(b,c). arc(c,e). arc(d,a). arc(d,b). arc(d,c). arc(d,e). arc(e,c). arc(e,d). a b d b a c b c e c e e c c e d d e

  16. Представяне на фронта приТърсене в дълбочина Начално състояние [[a]] [[b a] [d a]] [[c b a] [d a]] [[e c b a] [d a]] I-во решение: [e c b a] => [a b c e] Преудовлетворяване: [[d a]] [[b d a] [c d a] [e d a]] [[c b d a] [c d a] [e d a]] [[e c b d a] [c d a] [e d a]] II-ро решение: [e c b d a] => [a d b c e] Преудовлетворяване: [[c d a] [e d a]] [[e c d a] [e d a]] III-то решение: [e c d a] => [a d c e] Преудовлетворяване: [[e d a]] IV-то решение: [e d a] => [a d e] a b Целево състояние d c b c e e c c e d e

  17. Търсене в дълбочина 1 2 3 13 4 12 14 16 15 5 7 8 10 6 9 11

  18. Търсене в дълбочина (Depth-first) depth_first([Path|Stack],Goal,FinalPath) :- extend(Path,NewPaths), append(NewPaths, Stack,NewStack), depth_first(NewStack,Goal,FinalPath).

  19. Търсене в дълбочина (Depth-first) depth_first([[Goal|Path]|_],Goal,FinalPath):- reverse([Goal|Path],FinalPath). reverse([],[]). reverse([X|Rest],List):- reverse(Rest,NewRest), append(NewRest,[X],List).

  20. Генериране на всички решения • Често при решаване на задачи се налага да се генерират всички решения на цел и да се съхраняват в единична структура от данни • Това позволява да се преобразува търсенето с връщане назад (backtracking) в итерация и решава един сериозен проблем: при backtracking е много трудно да се предава информация от една “итерация” на backtracking към следваща

  21. Стандартни предикати • Съществуват три “стандартни” предиката за генериране на всички решения • findall/3 събира всички екземпляри в реда, в който те са намерени, но не обработва свободни променливи вдясно • setof/3 връща множество от екземпляри (списък в стандартния ред без повторения) и обработва свободни променливи вдясно • bagof/3 хибрид между findall/3 и setof/3

  22. Стандартни предикати findall(Template,Enumerator,List) Намира всички екземпляри на Template, за които Enumerator е удовлетворим, и ги натрупва в списък по реда, в който те са намерени (т.е. първият намерен екземпляр се поставя като първи елемент на списъка, а последният - като последен елемент на списъка) и свързва List с този списък. Обикновено List е променлива, а Template е променлива или терм, чийто аргументи са променливи, но могат да бъдат и произволни

  23. Пример 1 likes(bill, cider). likes(dick, beer). likes(harry, beer). likes(jan, cider). likes(tom, beer). likes(tom, cider). | ?- findall(X,likes(X,Y),S). S = [bill,dick,harry,jan,tom,tom]

  24. Пример 1 likes(bill, cider). likes(dick, beer). likes(harry, beer). likes(jan, cider). likes(tom, beer). likes(tom, cider). | ?- findall(X/Y,likes(X,Y),S). S = [bill/cider,dick/beer,harry/beer,jan/cider,tom/beer,tom/cider] | ?- findall(X,likes(X,beer),S). S = [dick,harry,tom] | ?- findall(Y,likes(tom,Y),S). S = [beer,cider]

  25. Разширяване на фронта extend([Node|Path],NewPaths) :- findall([NewNode,Node|Path], (arc(Node,NewNode,_), not member(NewNode,[Node|Path])), NewPaths).

  26. Търсене в дълбочина (Depth-first) depth_first([[Goal|Path]|_],Goal,FinalPath):- reverse([Goal|Path],FinalPath). depth_first([Path|Stack],Goal,FinalPath) :- extend(Path,NewPaths), append(NewPaths,Stack,NewStack), depth_first(NewStack,Goal,FinalPath). extend([Node|Path],NewPaths) :- findall([NewNode,Node|Path], (arc(Node,NewNode,_), not member(NewNode,[Node|Path])), NewPaths).

  27. arc('Arad','Zerind',75). arc('Arad','Sibiu',140). arc('Arad','Timisoara',118). arc('Bucharest','Fagaras',211). arc('Bucharest','Pitesti',101). arc('Bucharest','Giurgiu',90). arc('Bucharest','Urziceni',85). arc('Craiova','Dobreta',120). arc('Craiova','Rimnicu',146). arc('Craiova','Pitesti',138). arc('Dobreta','Mehadia',75). arc('Dobreta','Craiova',120). arc('Eforie','Hirsova',86). arc('Fagaras','Sibiu',99). arc('Fagaras','Bucharest',211). arc('Giurgiu','Bucharest',90). arc('Hirsova','Urziceni',98). arc('Hirsova','Eforie',86). arc('Iasi','Neamt',87). arc('Iasi','Vaslui',92). arc('Lugoj','Timisoara',111). arc('Lugoj','Mehadia',70). arc('Mehadia','Lugoj',70). arc('Mehadia','Dobreta',75). arc('Neamt','Iasi',87). arc('Oradea','Zerind',71). arc('Oradea','Sibiu',151). arc('Pitesti','Rimnicu',97). arc('Pitesti','Craiova',138). arc('Pitesti','Bucharest',101). arc('Rimnicu','Sibiu',80). arc('Rimnicu','Pitesti',97). arc('Rimnicu','Craiova',146). arc('Sibiu','Arad',140). arc('Sibiu','Oradea',151). arc('Sibiu','Fagaras',99). arc('Sibiu','Rimnicu',80). arc('Timisoara','Arad',118). arc('Timisoara','Lugoj',111). arc('Urziceni','Bucharest',85). arc('Urziceni','Hirsova',98). arc('Urziceni','Vaslui',142). arc('Vaslui','Iasi',92). arc('Vaslui','Urziceni',142). arc('Zerind','Arad',75). arc('Zerind','Oradea',71). Пример

  28. Пример | ?- depth_first([['Arad']],'Craiova',Path). Path = ['Arad','Zerind','Oradea','Sibiu', 'Fagaras','Bucharest','Pitesti', 'Rimnicu','Craiova']?; Path= ['Arad','Zerind','Oradea','Sibiu', 'Fagaras','Bucharest', 'Pitesti','Craiova']

  29. Търсене в ширина • При търсенето в ширина фронтът се обработва като опашка • Ако фронта е [p1,p2, . . .pn] • избира се p1 • пътищата p1', p1'',…, p1(k), които разширяват p1се добавят в края на опашката (след pn), т.е. [p2, …,pn, p1', p1'',…,p1(k)] и се обработват едва след като всички пътища p2, …, pn, се изследват • Намира най-краткия път

  30. Търсене в ширина 1 2 3 6 7 4 5 13 12 14 8 9 10 11 22 20 21 18 19 17 15 16 24 25 23

  31. Търсене в дълбочина (Depth-first) depth_first([Path|Stack],Goal,FinalPath) :- extend(Path,NewPaths), append(NewPaths, Stack,NewStack), depth_first(NewStack,Goal,FinalPath).

  32. Търсене в ширина (Breadth-first) breadth_first([Path|Stack],Goal,FinalPath):- extend(Path,NewPaths), append(NewPaths, Stack,NewStack), breadth_first(NewStack,Goal,FinalPath).

  33. Търсене в ширина (Breadth-first) breadth_first([Path|Queue],Goal,FinalPath):- extend(Path,NewPaths), append(NewPaths, Queue,NewQueue), breadth_first(NewQueue,Goal,FinalPath).

  34. Търсене в ширина (Breadth-first) breadth_first([Path|Queue],Goal,FinalPath):- extend(Path,NewPaths), append(Queue, NewPaths,NewQueue), breadth_first(NewQueue,Goal,FinalPath).

  35. Търсене в ширина (Breadth-first) breadth_first([[Goal|Path]|_],Goal, FinalPath):- reverse([Goal|Path],FinalPath). breadth_first([Path|Queue],Goal,FinalPath) :- extend(Path,NewPaths), append(Queue,NewPaths,NewQueue), breadth_first(NewQueue,Goal,FinalPath). extend([Node|Path],NewPaths) :- findall([NewNode,Node|Path], (arc(Node,NewNode,_), not member(NewNode,[Node|Path])), NewPaths).

  36. Пример ?- breadth_first([['Arad']],'Craiova',Path). Path =['Arad','Sibiu','Rimnicu','Craiova']

  37. Търсене в ограничена дълбочина • Задава се максимална дълбочина Depth, на която ще търсим решение • Търсим път, който минава през не повече от Depth на брой върха на графа

  38. Търсене в ограничена дълбочина Depth=4 1 2 9 10 13 3 6 12 11 14 4 5 7 8

  39. Търсене в дълбочина (Depth-first) depth_first([Path|Stack],Goal,FinalPath) :- extend(Path,NewPaths), append(NewPaths, Stack,NewStack), depth_first(NewStack,Goal,FinalPath).

  40. Търсене в ограничена дълбочина (Depth-bound) depth_bound(Depth,[Path|Stack],Goal,FinalPat):- extend(Path,NewPaths), append(NewPaths, Stack,NewStack), depth_bound(Depth,NewStack,Goal,FinalPath).

  41. Търсене в ограничена дълбочина (Depth-bound) depth_bound(Depth,[Path|Stack],Goal,FinalPat):- extend1(Depth,Path,NewPaths), append(NewPaths, Stack,NewStack), depth_bound(Depth,NewStack,Goal,FinalPath).

  42. Търсене в ограничена дълбочина (Depth-bound) extend1(Depth,Path,NewPaths) :- length(Path,Len), Len < Depth, !, extend(Path,NewPaths). extend1(_,_,[]). extend([Node|Path],NewPaths) :- findall([NewNode,Node|Path], (arc(Node,NewNode,_), not member(NewNode, [Node|Path])), NewPaths).

  43. Търсене в ограничена дълбочина (Depth-bound) depth_bound(Depth,[[Goal|Path]|_],Goal,FinalPath):- reverse([Goal|Path],FinalPath). depth_bound(Depth,[Path|Stack],Goal,FinalPath):- extend1(Depth,Path,NewPaths), append(NewPaths,Stack,NewStack), depth_bound(Depth,NewStack,Goal,FinalPath). extend1(Depth,Path,NewPaths) :- length(Path,Len), Len < Depth-1, !, extend(Path,NewPaths). extend1(_,_,[]).

  44. Пример |?- depth_bound(5,[['Arad']],'Craiova',Path). Path=['Arad','Sibiu','Rimnicu', 'Pitesti','Craiova']?; Path=['Arad','Sibiu','Rimnicu','Craiova'] ?; no

  45. Итеративно търсене по нива • Често пространството от състояния е много голямо и се изискват много ресурси (време и памет), за да бъде поддържан големия фронт, което прави процеса на търсене много бавен и труден. • Основната идея е да се преизчисляват елементите от фронта, вместо да се пазят • Прави се търсене в ограничена дълбочина при Depth=1, 2, … • Ако целевият път не се намери на дълбочина dсе търси на дълбочина d+1. • Намира най-краткия път

  46. Итеративно търсене по нива • Ако не съществува път от началното до целевото състояние в дадения граф и вече е построено е изследвано цялото пространство от състоянията, тогава всяко нарастване на дълбочината Depth ще води до построяване на едно и също пространство и многократното му претърсване. • За да се гарантира завършване на процеса, той се ограничава, като нарастването на дълбочината Depth се ограничава до предварително зададена максимална стойност Max, т.е. Depth ≥Max.

  47. Итеративно търсене по нива 1 Depth=4 Depth=1 1 1 Depth=2 2 9 2 3 3 6 10 13 1 Depth=3 2 4 5 8 11 12 14 7 15 5 3 4 6 7

  48. Итеративно търсене по нива (Iterativedeepening) • Тук като груба оценка за максималната дълбочина е използван броя на дъгите в графа. • Търсенето започва при Depth=1 iterative_deepening(Stack,Goal,FinalPath) :- findall(arc(X,Y,Z),arc(X,Y,Z),Graph), length(Graph,Max),iterative_deepening1(1,Stack,Goal,FinalPath,Max).

  49. Итеративно търсене по нива (Iterativedeepening) iterative_deepening1(Depth,Stack,Goal,Path,Max):- nl,write(depth=Depth), depth_bound(Depth,Stack,Goal,Path). iterative_deepening1(Depth,Stack,Goal,Path,Max):- Depth1 is Depth+1, Depth =< Max,!, iterative_deepening1(Depth1,Stack,Goal,Path,Max).

  50. Итеративно търсене по нива (Iterativedeepening) iterative_deepening(Stack,Goal,Path) :- findall(arc(X,Y,Z),arc(X,Y,Z),Graph),length(Graph,N), iterative_deepening1(1,Stack,Goal,Path,N). iterative_deepening1(Depth,Stack,Goal,Path,Max) :- nl,write(depth=Depth), depth_bound(Depth, Stack,Goal,Path). iterative_deepening1(Depth,Stack,Goal,Path,Max) :- Depth1 is Depth+1, Depth =< Max,!,iterative_deepening1(Depth1,Stack,Goal,Path,Max).

More Related