Wprowadzenie do Sztucznej Inteligencji Wykład Informatyka Studia InŜynierskie Przeszukiwanie przestrzeni stanów Przestrzeń stanów jest to czwórka uporządkowana [N,[, S, GD], gdzie: N jest zbiorem wierzchołków odpowiadających stanom w procesie rozwiązywania problemu jest zbiorem krawędzi, odpowiadających krokom w procesie rozwiązywania problemu S jest niepustym podzbiorem N,, zawierającym stany początkowe problemu GD jest niepustym podzbiorem N,, zawierającym stany docelowe problemu. Stany GD są opisane: przez podanie własności stanów występujących w przeszukiwaniu przez podanie własności ścieŝki tworzonej podczas przeszukiwania ŚcieŜką rozwiązania nazywamy ścieŝkę wiodącą przez ten graf z wierzchołka naleŝącego do S do wierzchołka naleŝącego do GD. 1
Podstawowe problemy teorii przeszukiwania przestrzeni stanów Czy metoda gwarantuje znalezienie rozwiązania? Czy algorytm zakończy się w kaŝdym przypadku, czy moŝe wpaść w pętlę nieskończoną? Czy jeśli rozwiązanie zostanie znalezione, to mamy gwarancję, Ŝe będzie to rozwiązanie optymalne? Jaka jest czasowa i pamięciowa ("przestrzenna") złoŝoność obliczeniowa procesu przeszukiwania? Czy i w jaki sposób moŝna zredukować złoŝoność obliczeniową? Sformułowanie zadania dla algorytmów przeszukiwania Definicja stanu przestrzeni Stan początkowy problemu (ang. initial state) Zbiór dopuszczalnych operatorów/akcji (ang. operator/action action set) lub funkcja następnika (ang. successor function) Zbiór stanów docelowych (ang. goal states) ) lub funkcja weryfikacji celu (ang. goal test) Funkcja kosztu ścieŝki (ang. path cost) - z reguły głębokość przeszukiwania 2
Problemy występujące w reprezentacji grafowej Powtarzające się stany (cykle) Identyfikacja grafu przestrzeni stanów: drzewa przeszukiwania, acykliczne grafy skierowane Rozmiar przestrzeni stanów (ograniczanie złoŝoności) Powtarzające się stany: efektywność przeszukiwania B B B C C C C C D Przestrzeń stanów Graf przeszukiwania
Powtarzające się stany: opis problemu Konieczne ze względu na efektywność przeszukiwania Nieuniknione w niektórych zadaniach (np. z odwracalnymi operatorami) - warunek zatrzymania Uwaga! Kompromis między kosztami przeszukiwania a kosztami wykrywania powtórzeń stanów Powtarzające się stany: metody przeciwdziałania Zakaz powrotu do bezpośrednio poprzedzającego stanu Wykrywanie cykli w ścieŝce - zakaz generowania jakiegokolwiek stanu poprzedzającego (pośrednio) Wykrywanie dowolnego powtarzającego się stanu w całym grafie przeszukiwania (duŝe wymagania pamięciowe!)
Przykład przeszukiwania przestrzeni stanów: problem komiwojaŝera 100 B E 7 12 0 100 12 D 7 12 0 100 C CDBE = 0 Przykład przeszukiwania przestrzeni stanów: problem komiwojaŝera 20 D 00 E 7 C E 2 D 2 C E C 100 B 10 22 17 D E 27 27 00 E 7 22 00 2 B 12 17 100 7 C D 22 20 D E E
Kierunki przeszukiwania przestrzeni stanów Przeszukiwanie w przód (ang. forward chaining) Przeszukiwanie w tył (ang. backward chaining) Przeszukiwanie dwukierunkowe (ang. bidirectional search) Przeszukiwanie w przód Start Cel
Przeszukiwanie w tył Start Cel Branching factor - co to takiego? 2 2 2 7
Kiedy przeszukiwanie w przód? Wszystkie lub większość danych zawarta jest w początkowym sformułowaniu problemu - np. interpretacja i analiza duŝych zbiorów danych Występuje duŝa liczba potencjalnych celów, ale jest tylko kilka moŝliwości zastosowania faktów i informacji wejściowych dla konkretnej instancji problemu Trudno sformułować hipotezę docelową - np. określanie struktury związków chemicznych Przeszukiwanie w przód wykorzystuje wiedzę i ograniczenia zawarte e w danych i opisie stanu początkowego problemu, aby pokierować przeszukiwaniem zgodnie z zasadami opisanymi przez operatory zmiany stanów. Kiedy przeszukiwanie w tył? Cel lub hipoteza jest dana w sformułowaniu problemu albo moŝna ją j łatwo sformułować np. dowodzenie twierdzeń matematycznych, systemy diagnostyczne Liczba reguł moŝliwych do zastosowania rośnie szybko i powoduje, Ŝe liczba odwiedzanych stanów jest bardzo duŝa; wczesna sekcja celów moŝe wyeliminować większość gałęzi tak, Ŝe przeszukiwanie będzie bardziej efektywne np. dowodzenie twierdzeń Dane o problemie nie są znane explicite,, tylko muszą być pozyskane przez rozwiązującego; przeszukiwanie w tył moŝe pomóc ukierunkować proces pozyskiwania danych - np. diagnostyka medyczna Przeszukiwanie wstecz wykorzystuje informacje o Ŝądanym celu i kieruje procesem przeszukiwania poprzez dobór odpowiednich operatorów zmiany stanów oraz eliminację pewnych gałęzi z przestrzeni stanów. 8
Przeszukiwanie dwukierunkowe Start Cel Przeszukiwanie dwukierunkowe Jednoczesne przeszukiwanie w przód i w tył Ograniczenie złoŝoności czasowej Problem generowania poprzedników stanu Problem wielu stanów docelowych (np. stany poprzedzające mata w szachach) Efektywna metoda sprawdzania występowania stanu w grafie przeszukiwania przeciwnego kierunku (problem wyminięcia!) Dobór odpowiedniej strategii przeszukiwania w kaŝdym kierunku 9
Praktyczna realizacja przeszukiwania - mechanizm nawrotów Start Cel Strategie przeszukiwania przestrzeni stanów Przeszukiwanie wszerz (ang. breadth-first search) Przeszukiwanie w głąb (ang. depth-first search) Przeszukiwanie w głąb z nawrotami (ang. depth-first search with backtracking) Przeszukiwanie z iteracyjnym pogłębianiem (ang. iterative deepening search) Przeszukiwanie metodą jednolitego kosztu (ang. uniform-cost search) 10
lgorytm przeszukiwania w głąb procedure depth_first_search(initial_state initial_state) begin open = [initial_state[ initial_state]; closed = []; while open [] do begin remove the leftmost state from open,, call it X; if X is goal state then return(success); generate all children of X; put X on closed; eliminate any children of X already on either open or closed, as this will cause loops in the search; put the remaining descendants, in order of discovery, on the LEFT end of open; end end. Przeszukiwanie w głąb - przykład 11
Przeszukiwanie w głąb - przykład Przeszukiwanie w głąb - przykład 12
Przeszukiwanie w głąb - przykład Przeszukiwanie w głąb - przykład itd. 1
lgorytm przeszukiwania w głąb (rekurencja) function depth_first_search(current_state current_state) begin if current_state is a goal then return(success) else begin add current_state to closed; while current_state has unexamined children do begin child := next unexamined child of current_state if child is not a member of closed then {check for loops} if depth_first_search(child child) ) = success then return(success) end end; return(fail) end. 8 2 1 7 Przeszukiwanie w głąb - przykład 8 2 1 7 2 8 1 7 1 7 2 18 1 7 19 28 1 7 1 7 8 2 1 7 7 1 1 7 8 20 2 29 7 1 8 2 1 7 7 1 1 1 7 1 7 2 1 8 7 2 1 8 7 9 12 1 21 2 0 1 2 8 7 8 2 1 7 8 2 1 7 2 8 1 7 2 8 1 7 1 7 1 7 7 1 7 1 8 2 1 7 8 1 2 7 7 1 7 1 1 2 7 8 1 2 8 7 cel 7 10 11 1 1 1 17 22 2 2 27 1 2 1
lgorytm przeszukiwania wszerz procedure breadth_first_search(initial_state initial_state) begin open = [initial_state[ initial_state]; closed = []; while open [] do begin remove the leftmost state from open,, call it X; if X is goal state then return(success); generate all children of X; put X on closed; eliminate any children of X already on either open or closed, as this will cause loops in the search; put the remaining descendants, in order of discovery, on the RIGHT end of open; end end. Przeszukiwanie wszerz - przykład 1
Przeszukiwanie wszerz - przykład Przeszukiwanie wszerz - przykład 1
Przeszukiwanie wszerz - przykład Przeszukiwanie wszerz - przykład 17
Przeszukiwanie wszerz - przykład itd. Przeszukiwanie wszerz - przykład 1 1 7 2 1 7 1 7 1 7 8 2 1 7 7 2 8 9 1 7 1 7 1 8 7 1 7 1 7 10 11 12 1 1 1 1 17 18 19 8 2 1 7 2 8 1 7 1 7 1 7 8 2 1 7 7 1 7 1 8 2 1 7 7 1 2 1 8 7 1 2 8 7 2 1 8 7 2 1 8 7 1 7 2 1 7 1 7 20 21 22 2 2 2 2 27 28 29 8 1 7 1 7 1 7 1 7 2 1 8 7 1 7 2 1 7 0 1 2 8 8 2 1 7 8 2 1 7 2 8 1 7 2 8 1 7 1 7 1 7 7 1 7 1 8 2 1 7 8 1 2 7 7 1 7 1 1 2 7 8 1 2 8 7 cel 7 8 9 0 1 2 7 18
lgorytm przeszukiwania z iteracyjnym pogłębianiem (1) procedure iterative_deepening_search(initial_state initial_state) begin for depth 0 to do begin if depth_limited_search(initial_state initial_state, depth) = success then return(its result); end; return(failure); end. lgorytm przeszukiwania z iteracyjnym pogłębianiem (2) function depth_limited_search(current_state current_state, depth) begin if current_state is a goal then return(success) else if depth = 0 then return(failure) else begin add current_state to closed; while current_state has unexamined children do begin child := next unexamined child of current_state if child is not a member of closed then {check for loops} if depth_limited_search(child child, depth-1) = success then return(success) end end; return(failure) end. 19
Iteracyjne pogłębianie - przykład depth=0 Iteracyjne pogłębianie - przykład depth=1 20
Iteracyjne pogłębianie - przykład depth=1 Iteracyjne pogłębianie - przykład depth=1 21
Iteracyjne pogłębianie - przykład depth=1 Iteracyjne pogłębianie - przykład depth=2 22
Iteracyjne pogłębianie - przykład depth=2 Iteracyjne pogłębianie - przykład depth=2 2
Iteracyjne pogłębianie - przykład depth=2 Iteracyjne pogłębianie - przykład depth=2 2
Iteracyjne pogłębianie - przykład depth=2 Iteracyjne pogłębianie - przykład depth=2 2
Iteracyjne pogłębianie - przykład depth=2 Iteracyjne pogłębianie - przykład depth=2 2
Iteracyjne pogłębianie - przykład depth=2 Iteracyjne pogłębianie - przykład depth= 27
Iteracyjne pogłębianie - przykład depth= Iteracyjne pogłębianie - przykład depth= 28
Iteracyjne pogłębianie - przykład depth= Iteracyjne pogłębianie - przykład depth= 29
Iteracyjne pogłębianie - przykład depth= itd. lgorytm Uniform-cost search procedure uniform_cost_search(initial_state initial_state) begin open = [initial_state[ initial_state]; closed = []; while open [] do begin remove the first state from open,, not already on closed, call it X; if X is a goal state then return(solution path that led to X); generate all children of X; put X on closed; for each child of X do assign path cost to the child state; add the child state to the open; end; re-order states on open according to path cost value (lower values first) end end. 0
lgorytm UCS - przykład(1) -0 B- C- D- koszt operacji lgorytm UCS - przykład(2) -0 B- C- D- koszt operacji 1
lgorytm UCS - przykład() -0 B- C- D- E-9 F-9 G H I J koszt operacji lgorytm UCS - przykład() -0 B- C- D- E-9 F-9 G-9 H-8 I J koszt operacji 2
lgorytm UCS - przykład() -0 B- C- D- 7 E-9 F-9 G-9 H-8 I-12 J-1 koszt operacji lgorytm UCS - przykład() -0 B- C- D- 7 E-9 F-9 G-9 H-8 I-12 J-1 2 K L M N O-10 P-11 Q R koszt operacji
lgorytm UCS - przykład(7) -0 B- C- D- 7 E-9 F-9 G-9 H-8 I-12 J-1 2 K-1 L-12 M N O-10 P-11 Q R koszt operacji lgorytm UCS - przykład(8) -0 B- C- D- 7 E-9 F-9 G-9 H-8 I-12 J-1 2 K-1 L-12 M-1 N O-10 P-11 Q R koszt operacji
lgorytm UCS - przykład(9) -0 B- C- D- 7 E-9 F-9 G-9 H-8 I-12 J-1 2 K-1 L-12 M-1 N-1 O-10 P-11 Q R koszt operacji lgorytm UCS - przykład(10) -0 B- C- D- 7 E-9 F-9 G-9 H-8 I-12 J-1 2 K-1 L-12 M-1 N-1 O-10 P-11 Q R koszt operacji
lgorytm UCS - przykład(11) -0 B- C- D- 7 E-9 F-9 G-9 H-8 I-12 J-1 2 K-1 L-12 M-1N-11 O-10 P-11 Q R 1 koszt operacji -12 itd. lgorytm UCS: charakterystyka Cechy szczególne Ocena heurystyczna stanu to koszt dojścia do tego stanu (koszt pokonanej ścieŝki od stanu początkowego) - koszt przejścia z dowolnego stanu do jego stanu potomnego musi być zawsze 0 Stanowi uogólnienie algorytmu przeszukiwania wszerz - w algorytmie przesz. wszerz koszt, to głębokość na jakiej leŝy stan Optymalny (gwarantuje znalezienie najkrótszego rozwiązania)!!! Wady DuŜe wymagania czasowe i pamięciowe (rosnące wykładniczo!)
Porównanie strategii przeszukiwania W głąb Iteracyjne Dwukie- Kryterium Wszerz Uniformcost z nawrotami pogłębianie runkowe ( jeśli moŝliwe) Czas B d B d B n B d B d/2 Pamięć B d B d Bn Bd B d/2 Optymalny? Tak Tak Nie Tak Tak Zupełny? Tak Tak Tak Tak Tak B - średnia liczba następników kaŝdego stanu (ang. branching factor) n - maksymalna głębokość przeszukiwania d - głębokość rozwiązania Zasady implementacji algorytmów przeszukiwania przestrzeni stanów 1. Reprezentacja rozwiązania problemu jako ścieŝki od stanu początkowego do stanu docelowego. 2. Przeglądanie systematyczne wszystkich ścieŝek w poszukiwaniu celu.. Powrót do poprzedniego stanu pozwalający na wznowienie przeszukiwania w sytuacji, gdy dotychczasowa ścieŝka nie prowadzi do celu - mechanizm nawrotów.. Struktury listowe umoŝliwiające utrzymywanie w sposób jawny danych o aktualnie analizowanych stanach: lista open,, pozwalająca na powrót do nie odwiedzonych jeszcze stanów, lista closed stanów juŝ odwiedzonych, pozwalająca na wykrywanie pętli i uniknięcie powtarzania bezowocnych ścieŝek.. Zastosowanie stosu w algorytmie przeszukiwania w głąb i kolejki jednokierunkowej w przeszukiwaniu wszerz. 7