(4g) Wykład 3 i 4 w oparciu o: S. Russel, P. Norvig. Artificial Intelligence. A Modern Approach P. Kobylański Wprowadzenie do Sztucznej Inteligencji 81 / 198
(4g) agenci rozwiązujący problemy przykłady problemów poszukiwanie rozwiązania strategie przeszukiwania bez wiedzy heurystyczne strategie przeszukiwania algorytm A* funkcje heurystyczne P. Kobylański Wprowadzenie do Sztucznej Inteligencji 82 / 198
(4g) Agenci rozwiązujący problemy schemat formułowanie poszukiwanie wykonanie wfazieformułowania zostaje sformułowany cel (goal) oraz na jego podstawie zostaje sformułowany problem w fazie poszukiwania agent poszukuje rozwiązanie problemu będące ciągiem akcji do wykonania wfaziewykonania agent wykonuje akcje z ciągu akcji będących rozwiązaniem problemu P. Kobylański Wprowadzenie do Sztucznej Inteligencji 83 / 198
(4g) Agenci rozwiązujący problemy function SIMPLE-PROBLEM-SOLVING-AGENT(percept) returns an action persistent seq, anactionsequence,initiallyempty state, somedescriptionofthecurrentworldstate goal, agoal,initiallynull problem, aproblemformulation state UPDATE-STATE(state, percept) if seq is empty then goal FORMULATE-GOAL(state) problem FORMULATE-PROBLEM(state, goal) seq SEARCH(problem) if seq = failure then return anullaction action FIRST(seq) seq REST(seq) return action P. Kobylański Wprowadzenie do Sztucznej Inteligencji 84 / 198
(4g) Agenci rozwiązujący problemy Problem może być sformułowany przez następujące jego składowe: Stan początkowy. Opis dostępnych dla agenta akcji. Dladanegostanus, ACTIONS(s) dostarcza zbiór akcji jakie mogą być wykonane w stanie s. Model przejść opisujący co każda akcja robi. Funkcja RESULT(s, a) zwraca stan będący wynikiem wykonania akcji a wstanies. Przestrzenią stanów jest graf o węzłach będących stanami i łukach odpowiadającym możliwym przejściom. Test celu, który jest warunkiem sprawdzającym czy w danym stanie osiągnięto cel. Może on być zadany albo jako zbiór stanów albo jako predykat. Koszt ścieżki jest funkcją przypisującą każdej ścieżce liczbę. Koszt powinien odpowiadać mierze efektywności jaką uznaje agent. Koszt kroku c(s, a, s 0 ) 0, to koszt wykonania akcji a wstanies i osiągnięcie stanu s 0 = RESULT(s, a). P. Kobylański Wprowadzenie do Sztucznej Inteligencji 85 / 198
(4g) Przykłady problemów: świat odkurzacza Stany: Stany określone są położeniem agenta i położeniem brudu. Agent może być w jednym z dwóch miejsc i każde z nich może być brudne lub nie. Zatem jest 2 2 2 = 8 możliwych stanów. Większe środowisko z n miejscami ma n 2 n stanów. Stan początkowy: Każdystanmożebyćstanempoczątkowym. Akcje: Wkażdymstaniemożnawykonaćtrzyakcje:Left, Right, Suck. Model przejść: Pełnaprzestrzeństanówprzedstawionajestna następnej stronie. Test celu: Sprawdza czy we wszystkich miejscach jest czysto. Koszt ścieżki: Każdy koszt kroku równy 1, zatem koszt ścieżki jest równy licznie kroków na ścieżce. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 86 / 198
(4g) Przykłady problemów: świat odkurzacza L R L R S S R R L R L R L L S S S S L R L R S S P. Kobylański Wprowadzenie do Sztucznej Inteligencji 87 / 198
(4g) Przykłady problemów: 8-puzzle 7 2 4 1 2 5 6 3 4 5 8 3 1 6 7 8 Start State Goal State P. Kobylański Wprowadzenie do Sztucznej Inteligencji 88 / 198
(4g) Przykłady problemów: 8-puzzle Stan: Stan opisany jest położeniem każdej z ośmiu płytek i jednego pustego miejsca w kwadracie o dziewięciu polach. Stan początkowy: Każdystanmożebyćprzyjętyzapoczątkowy. Zauważ, że każdy zadany cel może być osiągnięty z dokładnie połowy możliwych stanów. Akcje: Wnajprostszymsformułowaniurozpatrujesięczteryakcje przemieszczające puste pole w jednym z czterech kierunków: Left, Right, Up, Down. Różne podzbiory tych akcji są dopuszczalne w zależności od położenia pustego miejsca. Model przejścia: W wyniku wykonania akcji puste miejsce i odpowiednia sąsiednia płytka z liczbą zamieniają się miejscami. Test celu: Sprawdza czy osiągnięto konfigurację końcową. Możliwe są inne inne konfiguracje końcowe. Koszt ścieżki: Każdy koszt kroku równy 1, zatem koszt ścieżki jest równy liczbie kroków na ścieżce. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 89 / 198
(4g) Przykłady problemów: problem 8 hetmanów P. Kobylański Wprowadzenie do Sztucznej Inteligencji 90 / 198
(4g) Przykłady problemów: problem 8 hetmanów Stany: Każderozmieszczenieod0do8hetmanównaszachownicy jest stanem. Stan początkowy: Pusta szachownica. Akcja: Dostawieniejednegohetmananapustepoleszachownicy. Model przejścia: Zwracaszachownicęzdostawionymjednym hetmanem. Test celu: 8hetmanówustawionychnaplanszy,żadenniejest atakowany. Wpowyższymsformułowaniujest64 63 57 1.8 10 14 stanów. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 91 / 198
(4g) Przykłady problemów: problem 8 hetmanów Stany: Każderozmieszczenien hetmanów (0 apple n apple 8), po jednym w n skrajnie lewych kolumnach. Stan początkowy: Pusta szachownica. Akcja: Dostawienie jednego hetmana w skrajnie lewej pustej kolumnie, na takiej pozycji, która nie jest bita przez żadnego z hetmanów na lewo od dostawianego hetmana. Model przejścia: Zwracaszachownicęzdostawionymjednym hetmanem. Test celu: 8hetmanówustawionychnaplanszy,żadenniejest atakowany. Wpowyższymsformułowaniujesttylko2057stanów. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 92 / 198
(4g) Przykłady problemów: problemy rzeczywiste wyznaczanie tras wyznaczanie objazdów (tras będących cyklem) problem komiwojażera projektowanie VLSI nawigacja robotów automatyczny montaż podzespołów P. Kobylański Wprowadzenie do Sztucznej Inteligencji 93 / 198
(4g) Poszukiwanie rozwiązania Dopuszczalne ciągi akcji rozpoczynające się w stanie początkowym tworzą drzewo poszukiwań. Węzły w drzewie poszukiwań odpowiadają stanom a rozwidlenia odpowiadają akcjom. Rozszerzenie (expanding) stanu, polega na zastosowaniu do niego wszystkich dopuszczalnych akcji, co generuje nowy zbiór stanów. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 94 / 198
(4g) Poszukiwanie rozwiązania: przegląd drzewa function TREE-SEARCH(problem) returns asolution, orfailure initialize the frontier using the initial state of problem loop do if the frontier is empty then return failure choose a leaf node and remove it from the frontier if the node contains a goal state then return the corresponding solution expand the chosen node, adding the resulting nodes to the frontier P. Kobylański Wprowadzenie do Sztucznej Inteligencji 95 / 198
(4g) Poszukiwanie rozwiązania: przegląd grafu function GRAPH-SEARCH(problem) returns asolution, orfailure initialize the frontier using the initial state of problem initialize the explored set to be empty loop do if the frontier is empty then return failure choose a leaf node and remove it from the frontier if the node contains a goal state then return the corresponding solution add the node to the explored set expand the chosen node, adding the resulting nodes to the frontier only if not in the frontier or explored set P. Kobylański Wprowadzenie do Sztucznej Inteligencji 96 / 198
(4g) Poszukiwanie rozwiązania: infrastruktura dla algorytmu poszukiwania Dla każdego węzła n wdrzewie,mamystrukturęzawierającąnastępujące składowe: n.state: stan z przestrzeni stanów odpowiadający węzłowi; n.parent: węzeł w drzewie z którego wygenerowano ten węzeł; n.action: akcja jaką zastosowano u rodzica aby wygenerować ten węzeł; n.path-cost: koszt, oznaczany tradycyjnie przez g(n), ścieżki od stanu początkowego do węzła, zgodnie ze wskaźnikami na rodziców. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 97 / 198
(4g) Poszukiwanie rozwiązania: infrastruktura dla algorytmu poszukiwania function CHILD-NODE(problem, parent, action) returns anode return anodewith STATE = problem.result(parent.state, action), PARENT = parent, ACTION= action, PATH-COST = parent.path-cost + problem.step-cost(parent.state, action) P. Kobylański Wprowadzenie do Sztucznej Inteligencji 98 / 198
(4g) Poszukiwanie rozwiązania: infrastruktura dla algorytmu poszukiwania Granica (frontier) będzie przechowywana w strukturze kolejki (queue) z następującymi operacjami: EMPTY?(queue) zwraca true tylko wtedy gdy nie ma więcej elementów w kolejce. POP(queue) usuwa element z kolejki i zwraca go. INSERT(element, queue) wstawia element i zwraca otrzymaną nową kolejkę. Możliwe są następujące kolejki: FIFO usuwa najstarszy element w kolejce; LIFO usuwa najnowszy element w kolejce (nazywa się też stosem); kolejka priorytetowa usuwa element o najwyższym priorytecie. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 99 / 198
(4g) Poszukiwanie rozwiązania: infrastruktura dla algorytmu poszukiwania PARENT 5 4 Node ACTION = Right PATH-COST = 6 6 1 8 STATE 7 3 2 P. Kobylański Wprowadzenie do Sztucznej Inteligencji 100 / 198
(4g) Poszukiwanie rozwiązania: ocena algorytmu poszukiwania Zupełność: Czyalgorytmgwarantujeznalezienierozwiązaniagdyono istnieje? Optymalność: Czyalgorytmznajdujerozwiązanieonajmniejszym koszcie ścieżki? Złożoność czasowa: Jak długo trwa poszukiwanie rozwiązania? Złożoność pamięciowa: Ilepamięcipotrzebanawykonanie poszukiwania? P. Kobylański Wprowadzenie do Sztucznej Inteligencji 101 / 198
(4g) Poszukiwanie rozwiązania: miary wydajności rozmiar przestrzeni stanów V + E współczynnik rozgałęzienia b równy maksymalnej liczbie następników dowolnego węzła głębokość równa liczbie kroków od korzenia do danego węzła P. Kobylański Wprowadzenie do Sztucznej Inteligencji 102 / 198
(4g) Strategie poszukiwania bez wiedzy: przeszukiwanie wszerz function BREADTH-FIRST-SEARCH(problem) returns asolution, orfailure node anodewithstate= problem.initial-state, PATH-COST = 0 if problem.goal-test(node.state) then return SOLUTION(node) frontier afifoqueuewithnode as the only element explored an empty set loop do if EMPTY?(frontier) then return failure node POP(frontier) /* choose the shallowest node in frontier */ add node.state to explored for each action in problem.actions(node.state) do child CHILD-NODE(problem, node, action) if child.state is not in explored or frontier then if problem.goal-test(child.state) then return SOLUTION(child) frontier INSERT(child, frontier) P. Kobylański Wprowadzenie do Sztucznej Inteligencji 103 / 198
(4g) Strategie poszukiwania bez wiedzy: przeszukiwanie wszerz Głębokość Węzły Czas Pamięć 2 110 0.11 milisekund 107 kilobytes 4 11110 11 milisekund 10.6 megabytes 6 10 6 1.1 sekund 1 gigabyte 8 10 8 2minuty 103gigabytes 10 10 10 3godziny 10terabytes 12 10 12 12 dni 1 petabytes 14 10 14 3.5 roku 99 petabytes 16 10 16 350 lat 10 exabytes Przy założeniu, że współczynnik rozgałęzienia b = 10; 1 milion węzłów/sekundę; 1000 bajtów/węzeł. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 104 / 198
(4g) Strategie poszukiwania bez wiedzy: przeszukiwanie z jednolitym kosztem function UNIFORM-COST-SEARCH(problem) returns asolution, orfailure node anodewithstate= problem.initial-state, PATH-COST = 0 if problem.goal-test(node.state) then return SOLUTION(node) frontier apriorityqueueorderedbypath-cost,withnode as the only element explored an empty set loop do if EMPTY?(frontier) then return failure node POP(frontier) /* choose the lowest-cost node in frontier */ if problem.goal-test(node.state) then return SOLUTION(node) add node.state to explored for each action in problem.actions(node.state) do child CHILD-NODE(problem, node, action) if child.state is not in explored or frontier then frontier INSERT(child, frontier) else if child.state is in frontier with higher PATH-COST then replace that frontier node with child P. Kobylański Wprowadzenie do Sztucznej Inteligencji 105 / 198
(4g) Strategie poszukiwania bez wiedzy: przeszukiwanie wgłąb function DEPTH-FIRST-SEARCH(problem) returns asolution, orfailure node anodewithstate= problem.initial-state, PATH-COST = 0 if problem.goal-test(node.state) then return SOLUTION(node) frontier a LIFO queue with node as the only element explored an empty set loop do if EMPTY?(frontier) then return failure node POP(frontier) /* choose the deepest node in frontier */ add node.state to explored for each action in problem.actions(node.state) do child CHILD-NODE(problem, node, action) if child.state is not in explored or frontier then if problem.goal-test(child.state) then return SOLUTION(child) frontier INSERT(child, frontier) P. Kobylański Wprowadzenie do Sztucznej Inteligencji 106 / 198
(4g) Strategie poszukiwania bez wiedzy: ograniczone przeszukiwanie wgłąb function DEPTH-LIMITED-SEARCH(problem, limit) returns asolution, orfailure/cutoff return RECURSIVE-DLS(MAKE-NODE(problem.INITIAL-STATE), problem, limit) function RECURSIVE-DLS(node, problem, limit) returns asolution, orfailure/cutoff if problem.goal-test(node.state) then return SOLUTION(node) else if limit = 0 then return cutoff else cuto _occured? false for each action in problem.actions(node.state) do child CHILD-NODE(problem, node, action) result RECURSIVE-DLS(child, problem, limit 1) if result = cuto then cuto _occured? true else if result 6= failure then return result if cuto _occured? then return cuto else return failure P. Kobylański Wprowadzenie do Sztucznej Inteligencji 107 / 198
(4g) Strategie poszukiwania bez wiedzy: iteratywne ograniczone przeszukiwanie wgłąb function ITERATIVE-DEEPENING-SEARCH(problem) returns asolution, orfailure for depth = 0 to 1 do result DEPTH-LIMITED-SEARCH(problem, depth) if result 6= cuto then return result P. Kobylański Wprowadzenie do Sztucznej Inteligencji 108 / 198
(4g) Strategie poszukiwania bez wiedzy: przeszukiwanie dwukierunkowe Start Goal P. Kobylański Wprowadzenie do Sztucznej Inteligencji 109 / 198
(4g) Strategie poszukiwania bez wiedzy: porównanie strategii Kryterium BFS UCS DFS DLS IDS BI-DIR Zupełna? tak? tak? nie nie tak tak? Czas O(b d ) O(b 1+bC /"c ) O(b m ) O(b l ) O(b d ) O(b d/2 ) Pamięć O(b d ) O(b 1+bC /"c ) O(bm) O(bl) O(bd) O(b d/2 ) Optymalna? tak? tak nie nie tak? tak? Gdzie b jest współczynnikiem rozgałęzienia; d jest głębokością najpłytszego rozwiązania; m jest maksymalną głębokością drzewa poszukiwania; l jest ograniczeniem głębokości; " jest dolnym ograniczeniem kosztu kroku; C jest kosztem optymalnego rozwiązania. Znak zapytania oznacza, że strategia ma tę własność ale przy pewnych dodatkowych założeniach. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 110 / 198
(4g) Heurystyczne strategie przeszukiwania: najpierw najlepszy strategia najpierw najlepszy jest ogólnym podejściem do przeszukiwania jest przykładem algorytmu TREE-SEARCH albo GRAPH-SEARCH, w którym węzeł do rozszerzenia jest wybierany na podstawie funkcji oceny (evaluation function) f (n) funkcja f (n) estymuje koszt należy zastąpić w algorytmie UNIFORM-COST-SEARCH funkcję g(n) funkcją f (n) większość strategii najpierw najlepszy używa funkcję heurystyczną: h(n) =estymacja kosztu najtańszej ścieżki od stanu w węźle n do celu funkcja heurystyczna zawiera dodatkową wiedzę o problemie wykorzystywaną w algorytmie przeszukiwania P. Kobylański Wprowadzenie do Sztucznej Inteligencji 111 / 198
(4g) Heurystyczne strategie przeszukiwania: zachłannie najpierw najlepszy strategia zachłanna najpierw najlepszy stara się rozszerzać węzeł, który jest najbliższy celowi za funkcję oceny przyjmuje funkcję heurystyczną: f (n) =h(n) Example Zgodnie ze strategią zachłanną, algorytm wyznaczający drogę między miastami może w pierwszej kolejności kierować się do miast, które są w linii prostej najbliżej celu (funkcja h SLD STRAIGHT-LINE DISTANE) P. Kobylański Wprowadzenie do Sztucznej Inteligencji 112 / 198
(4g) Heurystyczne strategie przeszukiwania: A* szczególną formą strategii najpierw najlepszy jest algorytm A* walgorytmiea*oceniasięwęzełzapomocąnastępującejfunkcji: f (n) =g(n)+h(n) stosowana funkcja f (n) jest oceną najtańszego rozwiązania przechodzącego przez węzeł n algorytm A* różni się od algorytmu przeszukiwania z jednolitym kosztem (UNIFORM-COST-SEARCH) jedynie tym, że zamiast funkcji g(n) używa funkcję g(n)+h(n) P. Kobylański Wprowadzenie do Sztucznej Inteligencji 113 / 198
(4g) Heurystyczne strategie przeszukiwania: A* przykład 71 Oradea Neamt Arad 118 75 Zerind 140 151 Sibiu 80 99 Fagaras 87 Iasi 92 Vaslui Timisoara Rimnicu Vilcea 111 Lugoj 97 Pitesti 211 142 70 Mehadia 146 101 85 Urziceni 98 Hirsova 75 Drobeta 120 Craiova 138 Bucharest 90 Giurgiu 86 Eforie P. Kobylański Wprowadzenie do Sztucznej Inteligencji 114 / 198
(4g) Heurystyczne strategie przeszukiwania: A* przykład (a) The initial state (b) After expanding Arad Arad 366=0+366 Arad Sibiu 393=140+253 Timisoara 447=118+329 Zerind 449=75+374 (c) After expanding Sibiu Arad Sibiu Timisoara Zerind 447=118+329 449=75+374 Arad Fagaras Oradea Rimnicu Vilcea 646=280+366 415=239+176 671=291+380 413=220+193 (d) After expanding Rimnicu Vilcea Arad Sibiu Timisoara Zerind 447=118+329 449=75+374 Arad Fagaras Oradea 646=280+366 415=239+176 671=291+380 Rimnicu Vilcea Craiova Pitesti Sibiu 526=366+160 417=317+100 553=300+253 (e) After expanding Fagaras Arad Sibiu Timisoara Zerind 447=118+329 449=75+374 Arad Fagaras Oradea Rimnicu Vilcea 646=280+366 671=291+380 Sibiu Bucharest Craiova Pitesti Sibiu 591=338+253 450=450+0 526=366+160 417=317+100 553=300+253 (f) After expanding Pitesti Arad Sibiu Timisoara Zerind 447=118+329 449=75+374 Arad Fagaras Oradea Rimnicu Vilcea 646=280+366 671=291+380 Sibiu Bucharest Craiova Pitesti Sibiu 591=338+253 450=450+0 526=366+160 553=300+253 Bucharest Craiova Rimnicu Vilcea 418=418+0 615=455+160 607=414+193 P. Kobylański Wprowadzenie do Sztucznej Inteligencji 115 / 198
(4g) Heurystyczne strategie przeszukiwania: A* warunki na optymalność dopuszczalność h(n) jest dopuszczalna jeśli nigdy nie przeszacowuje kosztu osiągnięcia celu monotoniczność h(n) jest monotoniczna jeśli dla każdego węzła n ikażdego jego następnika n 0 wygenerowanego akcją a zachodzi: h(n) apple c(n, a, n 0 )+h(n 0 ) Theorem Każda heurystyczna funkcja monotoniczna jest dopuszczalna. Example Funkcja h SLD jest monotoniczna. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 116 / 198
(4g) Heurystyczne strategie przeszukiwania: A* optymalność Theorem Wersja A* w formie przeglądu drzewa (TREE-SEARCH) jest optymalna jeśli h(n) jest dopuszczalna. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 117 / 198
(4g) Heurystyczne strategie przeszukiwania: A* optymalność Theorem Wersja A* w formie przeglądu grafu (GRAPH-SEARCH) jest optymalna jeśli h(n) jest monotoniczna. Dowód. 1 Jeśli h(n) jest monotoniczna, to wartości f (n) na dowolnej ścieżce są niemalejące: f (n 0 )=g(n 0 )+h(n 0 )=g(n)+c(n, a, n 0 )+h(n 0 ) g(n)+h(n) =f (n) 2 Jeśli A* wybiera węzeł n do rozszerzenia, to optymalna ścieżka do n została znaleziona. W przeciwnym przypadku w granicy byłby inny węzeł n 0 na optymalnej ścieżce od węzła początkowego do n, ale z nierosnących wartości f na ścieżce, węzeł n 0 powinien być wybrany wcześniej. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 118 / 198
(4g) Heurystyczne strategie przeszukiwania: A* optymalność Wewnątrz konturu dla wartości V znajdują się węzły o ocenie f (n) apple V. CEL CEL a) gdy h(n) = 0 b) gdy h(n) dokładniej oszacowuje P. Kobylański Wprowadzenie do Sztucznej Inteligencji 119 / 198
(4g) Heurystyczne strategie przeszukiwania: A* przykład Dla heurystycznej funkcji h SLD : O Z N A T 380 S 400 R F I V L P D M C 420 G B U H E P. Kobylański Wprowadzenie do Sztucznej Inteligencji 120 / 198
(4g) Heurystyczne strategie przeszukiwania: A* optymalność Niech C będzie kosztem ścieżki optymalnego rozwiązania, wówczas A* rozszerza wszystkie węzły, dla których f (n) < C A* może rozszerzyć niektóre węzły, dla których f (n) =C A* nie rozszerza żadnego węzła, dla którego f (n) > C żaden inny algorytm znajdujący optymalne rozwiązanie nie gwarantuje rozszerzenia mniejszej liczby węzłów niż A* P. Kobylański Wprowadzenie do Sztucznej Inteligencji 121 / 198
(4g) Heurystyczne strategie przeszukiwania: A* złożoność obliczeniowa Załóżmy, że koszt kroku jest stały. niech =h h będzie błędem bezwzględnym, gdzie h jest rzeczywistym kosztem przejścia od korzenia do celu niech " =(h h)/h będzie błędem względnym analiza złożoności bardzo mocno zależy od przyjętej przestrzeni stanów załóżmy, że jest jeden stan będący celem a akcje są odwracalne (np. układanka 8-puzzle) złożoność czasowa A* jest rzędu O(b ) dla stałego kosztu kroku i głębokości rozwiązania d jest rzędu O(b "d ) bardzo istotna jest również złożoność pamięciowa ponieważ wszystkie algorytmy przeszukujące grafy przechowują w pamięci wszystkie wygenerowane węzły P. Kobylański Wprowadzenie do Sztucznej Inteligencji 122 / 198
(4g) Heurystyczne strategie przeszukiwania: IDA* najprostszą redukcją złożoności pamięciowej algorytmu A* jest zaadaptowanie w nim idei iteratywnego ograniczonego przeszukiwania algorytm IDA* używa dla odcięcia f -wartości g + h zamiast głębokości IDA* jest praktyczny dla wielu problemów z jednostkowym kosztem kroku i unika pamiętania posortowanej kolejki węzłów P. Kobylański Wprowadzenie do Sztucznej Inteligencji 123 / 198
(4g) Heurystyczne strategie przeszukiwania: heurystyczna z ograniczoną pamięcią function RECURSIVE-BEST-FIRST-SEARCH(problem) returns asolution, orfailure return RBFS(problem, MAKE-NODE(problem.INITIAL-STATE), 1) function RBFS(problem, node, f _limit) returns asolution,orfailureandanewf-cost limit if problem.goal-test(node.state) then return SOLUTION(node) successors [] for each action in problem.actions(node.state) do add CHILD-NODE(problem, node, action) intosuccessors if successors is empty then return failure, 1 for each s in successors do /* update f with value from previous search, if any */ s.f max(s.g + s.h, node.f ) loop do best the lowest f -value node in successors if best.f > f _limit then return failure, best.f alternative the second-lowest f -value among successors result, best.f RBFS(problem, best, min(f _limit, alternative)) if result 6= failure then return result P. Kobylański Wprowadzenie do Sztucznej Inteligencji 124 / 198
(4g) Heurystyczne strategie przeszukiwania: heurystyczna z ograniczoną pamięcią przykład (a) After expanding Arad, Sibiu, and Rimnicu Vilcea 447 Sibiu 393 415 Arad Fagaras Oradea Rimnicu Vilcea 646 415 671 413 Arad 366 Timisoara Zerind 447 449 Craiova Pitesti Sibiu 526 417 553 (b) After unwinding back to Sibiu and expanding Fagaras Arad 366 Arad 447 Sibiu 393 417 Fagaras Oradea 646 415 671 Rimnicu Vilcea 413 417 Timisoara 447 Zerind 449 Sibiu 591 Bucharest 450 (c) After switching back to Rimnicu Vilcea and expanding Pitesti Arad 366 447 Sibiu 393 Timisoara 447 Zerind 449 447 Arad Fagaras Oradea Rimnicu Vilcea 646 415 450 671 417 447 Craiova Pitesti Sibiu 526 417 553 Bucharest Craiova Rimnicu Vilcea 418 615 607 P. Kobylański Wprowadzenie do Sztucznej Inteligencji 125 / 198
(4g) Heurystyczne strategie przeszukiwania: heurystyczna z ograniczoną pamięcią optymalność Theorem Jeśli h(n) jest dopuszczalna, to RBFS jest algorytmem optymalnym. złożoność pamięciowa RBFS jest liniowa jest w stosunku do głębokości najgłębszego optymalnego rozwiązania RBFS, podobnie jak IDA*, wykorzystuje za mało pamięci: między iteracjami IDA* przechowuje tylko jedną wartość: limit f -kosztu między iteracjami RBFS przechowuję więcej informacji ale używa tylko liniowo dużej pamięci, nawet jeśli dostępne jest jej więcej P. Kobylański Wprowadzenie do Sztucznej Inteligencji 126 / 198
(4g) Funkcje heurystyczne: układanka 8-puzzle Średnia długość rozwiązania dla losowego przykładu 8-puzzle wynosi 22. Współczynnik rozgałęzienia wynosi około 3. Pełne drzewo przeglądu ma około 3 22 3.1 10 10 stanów. Przeszukiwanie grafu zmniejsza tę liczbę około 170000 razy, gdyż jest tylko 9!/2 = 181, 440 różnych osiągalnych stanów. Układanka 15-puzzle ma jednak około 10 13 różnych osiągalnych stanów, zatem konieczne jest opracowanie heurystyk. Dwie proste heurystyki opracowane dla 15-puzzle: h 1 liczba płytek nie znajdujących się na swoim docelowym miejscu h 2 suma odległości płytek od ich docelowych miejsc (odległość Manhattan) P. Kobylański Wprowadzenie do Sztucznej Inteligencji 127 / 198
(4g) Funkcje heurystyczne: wpływ heurystyki na działanie jeśli liczba węzłów generowanych przez A* wynosi N agłębokośćd, to efektywny współczynnik rozwidlenia b jest średnią liczbą potomków w zrównoważonym drzewie o N + 1węzłachi głębokości d: N + 1 = 1 + b +(b ) 2 + +(b ) d dobrze zaprojektowana heurystyka ma wartość b bliską 1 ocenę h 1 i h 2 przeprowadzono eksperymentalnie rozwiązując 1200 przykładów po 100 dla każdej z długości rozwiązania 2, 4,...,24 P. Kobylański Wprowadzenie do Sztucznej Inteligencji 128 / 198
(4g) Funkcje heurystyczne: wpływ heurystyki na działanie Tabela : Średnia ze 100 przykładów 8-puzzle dla każdej z długości rozwiązania d Liczba generowanych węzłów Współczynnik efektywnego rozgałęzienia d IDS A (h 1 ) A (h 2 ) IDS A (h 1 ) A (h 2 ) 2 10 6 6 2.45 1.79 1.79 4 112 13 12 2.87 1.48 1.45 6 680 29 18 2.73 1.34 1.30 8 6384 39 25 2.80 1.33 1.24 10 47127 93 39 2.79 1.38 1.22 12 3644035 227 73 2.78 1.42 1.24 14 539 113 1.44 1.23 16 1301 211 1.45 1.25 18 3056 363 1.46 1.26 20 7276 676 1.47 1.27 22 18094 1219 1.48 1.28 24 39135 1641 1.48 1.26 P. Kobylański Wprowadzenie do Sztucznej Inteligencji 129 / 198
(4g) Funkcje heurystyczne: wpływ heurystyki na działanie dla d = 12 algorytm A* z heurystyką h 2 jest 50000 razy bardziej efektywny od algorytmu IDS heurystyka h 2 dominuje heurystykę h 1,gdyżdladowolnegon h 2 (n) h 1 (n) heurystyka h 2 jest lepsza od heurystyki h 1 P. Kobylański Wprowadzenie do Sztucznej Inteligencji 130 / 198
(4g) Funkcje heurystyczne: tworzenie dopuszczalnych heurystyk z relaksacji problemów relaksacją problemu nazywamy takie przeformułowanie problemu, w którym osłabiono warunki Example (Relaksacje układanki 8-puzzle) Zregułyopisującejakcję: Płytka może być przesunięta z kwadratu A na kwadrat B jeśli A poziomo lub pionowo sąsiaduje z B i B jest pusty. możemy wygenerować trzy relaksacje przez usunięcie jednego lub obu warunków: 1 Płytka może być przesunięta z kwadratu A na kwadrat B jeśli A sąsiaduje z B. 2 Płytka może być przesunięta z kwadratu A na kwadrat B jeśli B jest pusty. 3 Płytka może być przesunięta z kwadratu A na kwadrat B. Z relaksacji (1) można wyprowadzić h 2,z(2)można wyprowadzić heurystykę Gaschinga, natomiastz(3)można wyprowadzić h 1. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 131 / 198
(4g) Funkcje heurystyczne: tworzenie dopuszczalnych heurystyk z relaksacji problemów załóżmy, że mamy kolekcję dopuszczalnych heurystyk h 1, h 2,...,h m i żadna z nich nie dominuje żadnej innej poniższa heurystyka jest dopuszczalna, monotoniczna i dominuje każdą ze swoich składowych: h(n) =max{h 1 (n), h 2 (n),...,h m (n)} program ABSOLVER (Prieditis, 1993) generuje automatycznie heurystyki na podstawie relaksacji problemu i innych technik ABSOLVER wygenerował nową heurystykę dla 8-puzzle, która była lepsza od znanych wcześniej oraz wygenerował pierwszą użyteczną heurystykę dla kostki Rubika P. Kobylański Wprowadzenie do Sztucznej Inteligencji 132 / 198
(4g) Funkcje heurystyczne: tworzenie dopuszczalnych heurystyk z podproblemów Przykład podproblemu w układance 8-puzzle: 2 4 1 2 5 6 3 54 6 8 3 1 7 8 Start State Goal State Należy ułożyć liczby 1, 2, 3, 4 nie przejmując się położeniem innych liczb. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 133 / 198
(4g) Funkcje heurystyczne: tworzenie dopuszczalnych heurystyk z podproblemów Koszt rozwiązania podproblemu jest dolnym oszacowaniem rozwiązania pełnego problemu. Koszt rozwiązania podproblemu można traktować jako funkcję heurystyczną h(n). Można rozpatrywać różne podproblemy odpowiadające wzorcom 1 2 3 4, 2 4 6 8, 5 6 7 8iinnych. Uzyskane w ten sposób heurystyki można łączyć w jedną istotnie lepszą od nich heurystyk. Nie każde oceny z różnych wzorców można dodawać (mogą mieć wspólne ruchy). Mówimy, że dwa wzorce są rozłączne jeśli odpowiadają podproblemom, w których porusza się rozłączne zbiory płytek. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 134 / 198
(4g) Funkcje heurystyczne: tworzenie dopuszczalnych heurystyk z podproblemów Tworzy się bazy rozłącznych wzorców. Oceny z takich wzorców można dodawać nie naruszając dopuszczalności heurystyki. Stosując bazę rozłącznych wzorców można rozwiązać 15-puzzle w czasie kilku milisekund liczba generowanych węzłów jest zmniejszona 10000 krotnie w stosunku do odległości Manhattan. Dla układanki 24-puzzle przyspieszenie jest milionkrotne. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 135 / 198
(4g) Funkcje heurystyczne: uczenie heurystyk niech x 1 (n) i x 2 (n) będą dwiema miarami dla węzła n, np.x 1 (n) jest liczbą płytek nie na miejscu a x 2 (n) liczbą par sąsiadujących płytek, które nie sąsiadują w stanie będącym celem zocenx 1 (n) i x 2 (n) można stworzyć liniową kombinację: h(n) =c 1 x 1 (n)+c 2 x 2 (n) współczynniki c 1 i c 2 są korygowane aby uzyskać jak najlepszą ocenę heurystyczną powyższa heurystyka spełnia warunek h(n) =0dlawęzła odpowiadającego stanowi końcowemu powyższa heurystyka nie musi być dopuszczalna ani monotoniczna P. Kobylański Wprowadzenie do Sztucznej Inteligencji 136 / 198
(4g) Dodatek: kody źródłowe w Prologu :- module(trans, [start/1, action/3, goal/1]). start(s0). action(s0, a1, s1). action(s1, a2, s2). action(s2, a3, s3). action(a3, a4, s0). action(s1, a5, s4). action(s4, a6, s5). action(s2, a7, s5). goal(s5). P. Kobylański Wprowadzenie do Sztucznej Inteligencji 137 / 198
(4g) Dodatek: kody źródłowe w Prologu :- module(dfs, [dfs/1]). dfs(solution) :- start(start), dfs(start, [], Solution). dfs(state, _, []) :- goal(state). dfs(state, Explored, [Action Rest]) :- action(state, Action, New), \+ member(new, Explored), dfs(new, [State Explored], Rest). P. Kobylański Wprowadzenie do Sztucznej Inteligencji 138 / 198
(4g) Dodatek: kody źródłowe w Prologu :- module(bfs, [bfs/1]). bfs(solution) :- start(start), bfs([(start, [])], [], Solution). bfs([(state, Solution) _], _, Solution) :- goal(state). bfs([(state, Path) Rest], Explored, Solution) :- findall((new, [Action Path]), (action(state, Action, New), \+member(new, Explored)), Successors), append(rest, Successors, Queue), bfs(queue, [State Explored], Solution). P. Kobylański Wprowadzenie do Sztucznej Inteligencji 139 / 198
(4g) Dodatek: kody źródłowe w Prologu :- module(ids, [ids/1]). ids(solution) :- start(start), nat(limit), rdls(start, Limit, [], Solution). rdls(state, _, _, []) :- goal(state). rdls(state, Limit, Explored, [Action Rest]) :- Limit > 0, Limit1 is Limit - 1, action(state, Action, New), \+ member(new, Explored), rdls(new, Limit1, [State Explored], Rest). nat(0). nat(n) :- nat(n1), N is N1+1. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 140 / 198
(4g) Dodatek: kody źródłowe w Prologu Example (Farmer-wilk-koza-kapusta) start([farmer, wilk, koza, kapusta] - []). goal([] - _). action(l1-p1, na_prawy, L2-P2) :- select(farmer, L1, L2), P2 = [farmer P1], dopuszczalny(l2). action(l1-p1, na_lewy, L2-P2) :- select(farmer, P1, P2), L2 = [farmer L1], dopuszczalny(p2). action(l1-p1, na_prawy(x), L3-P2) :- select(farmer, L1, L2), select(x, L2, L3), P2 = [farmer, X P1], dopuszczalny(l3). action(l1-p1, na_lewy(x), L2-P3) :- select(farmer, P1, P2), select(x, P2, P3), L2 = [farmer, X L1], dopuszczalny(p3). dopuszczalny(x) :- \+ (member(koza, X), member(kapusta, X)), \+ (member(wilk, X), member(koza, X)). P. Kobylański Wprowadzenie do Sztucznej Inteligencji 141 / 198
(4g) Dodatek: kody źródłowe w Prologu Example (cd.)?- time(dfs(x)). % 276 inferences, 0.000 CPU in 0.000 seconds (94% CPU, 4524590 Lips) X = [na_prawy(koza), na_lewy, na_prawy(wilk), na_lewy(koza), na_prawy(kapusta), na_lewy, na_prawy(koza)].?- time(bfs(x)). % 1,485 inferences, 0.001 CPU in 0.001 seconds (94% CPU, 2801887 Lips) X = [na_prawy(koza), na_lewy, na_prawy(kapusta), na_lewy(koza), na_prawy(wilk), na_lewy, na_prawy(koza)].?- time(ids(x)). % 2,220 inferences, 0.000 CPU in 0.000 seconds (99% CPU, 4922395 Lips) X = [na_prawy(koza), na_lewy, na_prawy(wilk), na_lewy(koza), na_prawy(kapusta), na_lewy, na_prawy(koza)]. P. Kobylański Wprowadzenie do Sztucznej Inteligencji 142 / 198