39
Algorytmy przeszukiwania grafów i drzew dla gier i łamigłówek Przemysław Klęsk [email protected] 1/ 39

Algorytmy przeszukiwania grafów i drzew dla gier i lamiglówekwikizmsi.zut.edu.pl/uploads/b/be/2_search.pdf · Best First Search, A∗, algorytm Dijkstry, i inne. Breadth First Search

  • Upload
    lamliem

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Algorytmy przeszukiwania grafów i drzewdla gier i łamigłówek

Przemysław Klę[email protected]

1/ 39

Zagadnienia i algorytmy

1 Zachłanne (wyczerpujące) przeszukiwanie grafu(algorytm Breadth First Search)

2 Sudoku, minimalne sudoku, problem n-hetmanów(algorytm Best-First Search)

3 Puzzle n2 − 1, labirynty, poruszanie się postaci wgrach komputerowych (algorytm A∗)

4 Jak A∗ ma się do Best First Search i algorytmuDijkstry?

5 Szachy, warcaby, GO, . . . (algorytm MIN-MAX)

2/ 39

Czy istnieje ścieżka do celu?

v1

v2

v3

v4 v5

v6

v7

v8

3/ 39

Własności algorytmu Breadth First Search

Wykonuje zachłanne (w skrajnym przypadkuwyczerpujące) przeszukiwanie całego grafu wszeż, aż donatrafienia na węzeł docelowy.Algorytm ten można traktować, jako ogólny schemat,którego szczególne (usprawnione) przypadki to algorytmy:Best First Search, A∗, algorytm Dijkstry, i inne.Breadth First Search operuje na dwóch zbiorach: Open(zawiera węzły, które mają być jeszcze rozpatrzone) iClosed (zawiera węzły, które już rozpatrzono).Każdy z węzłów ma możliwość zapamiętania jednegoswojego poprzednika, tak aby po znalezieniu rozwiązaniamożna było prześledzić ścieżkę.

4/ 39

Breadth First Search

Algorytm1 Ustaw w węźle początkowym pustego poprzednika i dodaj

ten węzeł do zbioru Open.2 Dopóki zbiór Open pozostaje niepusty powtarzaj:

2.1 Pobierz (i usuń) jeden węzeł ze zbioru Open. Nazwijmyten węzeł v .

2.2 Jeżeli v jest węzłem docelowym (spełnia warunek stopu),to przerwij cały algorytm i zwróć v jako wynik.

2.3 Włóż do zbioru Open tych wszystkich potomków węzłav , którzy nie występują w zbiorze Closed. Zapamiętaj wnich v jako ich poprzednika.

2.4 Włóż v do zbioru Closed.

5/ 39

Breadth First Search

Śledzenie ścieżki1 Przypiszmy do roboczego węzła o nazwie v , węzeł będący

rozwiązaniem.2 Inicjalizujemy ciąg reprezentujący ścieżkę zawartością v :

Path = (v).3 Dopóki v ma niepustego poprzednika, powtarzaj:

3.1 Przypisz w miejsce v jego poprzednika (v ← v .parent).3.2 Dopisz z przodu ścieżki Path zawartość v .

6/ 39

Przykładowe działanie (dla grafu ze str. 3)

1 Open = {v1}, Closed = {}.2 Open = {v1} �= ∅ więc wykonujemy ciało pętli:

2.1 v = v1, Open = {}.2.2 v = v1 �= v8 (warunek stopu niespełniony).2.3 Open = {v2, v6}.2.3 Closed = {v1}.

2 Open = {v2, v6} �= ∅ więc wykonujemy ciało pętli:2.1 v = v2, Open = {v6}.2.2 v = v2 �= v8 (warunek stopu niespełniony).2.3 Open = {v6, v3}.2.3 Closed = {v1, v2}.

2 Open = {v6, v3} �= ∅ więc wykonujemy ciało pętli:2.1 v = v6, Open = {v3}.2.2 v = v6 �= v8 (warunek stopu niespełniony).2.3 Open = {v3, v7} (uwaga: v1 jako potomek v6 nie jest

dodawany do Open, bo jest już w Closed.2.4 Closed = {v1, v2, v6}.

2 . . .7/ 39

Uwagi o Breadth First Search

Zbiory Open i Closed w przypadku Breadth First Searchzazwyczaj implementuje się jako zwykłe kolejki FIFO.Dopiero w specjalizowanych wersjach algorytmu tj. walgorytmach BestFirstSearch i A∗, zbiory te implementujesię odpowiednio jako: kolejkę priorytetową i hashmapę.Jeżeli przeszukiwanie dotyczy drzewa (grafu bez cykli), tozbiór Closed można pominąć.Breadth First Search nie jest w żaden sposóbukierunkowany na szybsze dotarcie do rozwiązania(przeszukuje wszeż): nie minimalizuje długości ścieżki, niewykorzystuje żadnej heurystyki.

8/ 39

Własności algorytmu Best First Search (JudeaPearl)

Każdemu przeszukiwanemu stanowi (węzłowi) vnadawana jest heurystyczna ocena liczbowa f (v) ,szacująca na ile daleko dany stan jest od docelowego.Algorytm przeszukuje w pierwszej kolejności stany onajniższej wartości funkcji heurystycznej.Zbiór Open implementowany jest przez kolejkępriorytetową (ang. PriorityQueue) porządkującą stany wgheurystyki. Wstawienie nowego elementu do kolejki zzachowaniem porządku ma złożoność O(log n).Wyciągnięcie elementu z kolejki ma złożoność O(1).Zbiór Closed implementowany jest przez hashmapę.Sprawdzenie, czy pewien stan już był rozpatrzony i jest wzbiorze Closed, ma złożoność O(1).Każdy stan przechowuje dotychczas najkorzystniejszegodla niego poprzednika.9/ 39

Sudoku

Mając dany pewien stan początkowy planszy 9 × 9, podzielonejdodatkowo na 9 podkwadratów o wymiarach 3 × 3 każdy, należynapełnić planszę tak, aby w każdym wierszu, w każdej kolumnie i wkażdym podkwadracie były wykorzystane wszystkie liczby ze zbioru{1, 2, . . . , 9}.

1*5 *37 **8*7* *** *****8 1** *****3 *7* **174* *1* *632** *4* 9***** **5 1***** *** *8*4** 62* 5*7

−→

195 237 648674 859 312328 164 759853 976 421749 512 863216 348 975962 785 134537 491 286481 623 597

(Best First Search w Javie: czas = 1607 ms (procesor 2 GHz), odwiedzonych stanów = 3168.)

10/ 39

Ogólne sudoku n2

Mając dany pewien stan początkowy planszy n2 × n2,podzielonej dodatkowo na n2 podkwadratów owymiarach n × n każdy, należy napełnić planszę tak,aby w każdym wierszu, w każdej kolumnie i wkażdym podkwadracie były wykorzystane wszystkieliczby ze zbioru {1, 2, . . . , n2}.

11/ 39

Problem n-hetmanów

Na szachownicy n × n należy ustawić n hetmanów, wtaki sposób, aby żaden przez żadnego „nie byłszachowany”.

Dla n = 2, 3 rozwiązanie nie istnieje. Przykład rozwiązania dlan = 4:

QQ

QQ

12/ 39

Best First Search

Algorytm1 Ustaw w stanie początkowym pustego poprzednika i

dodaj ten stan do zbioru Open.2 Dopóki zbiór Open pozostaje niepusty powtarzaj:

2.1 Pobierz (i usuń) jeden stan v ze zbioru Open (jest tostan najlepszy w sensie zadanej heurystyki).

2.2 Jeżeli v jest stanem docelowym (spełnia warunek stopu),to przerwij cały algorytm i zwróć v jako wynik.

2.3 Wygeneruj wszystkie stany potomne dla v i dla każdegoz nich wykonaj:2.3.1 Jeżeli stan występuje w Closed, to nie badaj go dalej.2.3.2 Policz wartość heurystyki dla tego stanu.2.3.2 Jeżeli stan nie występuje w Open, to dodaj go ustawiając v jako

jego poprzednik.2.3.3 Jeżeli stan występuje w Open, to podmień w nim wartość

heurystyki i poprzednika, o ile nowo obliczona wartość jestkorzystniejsza.

2.4 Włóż v do zbioru Closed.13/ 39

Przykładowe proste heurystyki

Dla sudokuRozpoczynamy od zadanej planszy (stan początkowy) idostawiamy w puste pola dopuszczalne liczby (maks. 9potomków na każdym poziomie drzewa).

f (v) =

{∞, jeżeli stan jest niepoprawny;

liczba pustych pól.

Dla n-hetmanówRozpoczynamy od pustej szachownicy i dostawiamy wkolejnych wierszach hetmany.

f (v) =

{∞, jeżeli hetmany szachują się;

liczba pustych wierszy.14/ 39

Uwagi o Best First Search

Best First Search przeszukuje wgłąb (a niewszeż) coraz bardziej oddalając się od stanupoczątkowego.Przy natknięciu się na stan niepoprawny (wszczególności, gdy wszyscy potomkowie sąniepoprawni), algorytm wycofuje się do stanów ogorszej wartości heurystyki.Liczba takich wycofań zależy od: jakości podanejheurystyki i od sposobu budowania stanówpotomnych (pewną wiedzę o problemie możnazawrzeć już tu, aby nie dopuszczać do stanówbezpośrednio niepoprawnych).

15/ 39

Minimalne sudoku

Problem (w ogólności dla sudoku n2)

Znaleźć wszystkie początkowe układy sudoku, dla którychistnieje dokładnie jedno rozwiązanie i które mają minimalnąliczbę ustalonych pól w stanie początkowym.

Dowód, że takie stany istniejąPoczynając od dowolnej rozwiązanej planszy (całkowiciewypełnionej) odbieramy kolejno po jednej liczbie isprawdzamy, czy nadal można będzie rozwiązać sudokujednoznacznie. Przerywamy, gdy będzie istniało więcej niżjedno rozwiązanie. Zważywszy na fakt, że całkowicie pustaplansza nie jest jednoznacznie rozwiązywalna, widać że takiepostępowanie będzie miało punkt stopu przy pewnymczęściowym zapełnieniu planszy. �

16/ 39

Poszukiwanie minimalnych sudoku

Zarys algorytmu zachłannego

Rozpoczynamy od pełnej (rozwiązanej) planszy.

Potomkami danego stanu są stany powstałe przez odebranie jednejliczby z rodzica. Zatem możemy utworzyć n2 potomków — tyle, ilejest pól.

Dla każdego potomka sprawdzamy, wykonując algorytm Best FirstSearch dla zwykłego problemu sudoku, czy istnieją co najmniej 2rozwiązania.

Jeżeli pewien stan ma jedno rozwiązanie, a wszystkie jego potomkimają więcej niż jedno, to należy go zapamiętać jako kandydata naminimalne sudoku.

Algorytm musimy jednak wykonać, aż do przejrzenia pełnego grafu.Nie można zatrzymać się na pierwszym rozwiązaniu, jako że winnych „rejonach” grafu, mogą istnieć rozwiązania o mniejszejliczbie elementów na planszy początkowej.

17/ 39

Poszukiwanie minimalnych sudoku

Dla n = 2Rozpoczynając od poniższej planszy znaleziono 128minimalnych sudoku (mających 4 pozycje ustalone).

12 3434 1223 4141 23

→** **** 12** **4* *3

,

** **** 12** **41 **

,

** **** 12** *14* **

, . . .

Oczywiście, aby poznać prawdziwą liczbę wszystkichrozwiązań „bazowych” należałoby: (1) utożsamićwszystkie układy równoważne sobie ze względu na jedną zosi symetrii planszy, (2) utożsamić wszystkie stanyrównoważne sobie ze względu na permutację symboli, (3)uruchomić przeszukiwanie dla wszystkich nietożsamychukładów początkowych.

18/ 39

Poszukiwanie minimalnych sudoku

Dla n = 3Nie udało się wykonać programu do końca przy 2GBpamięci RAM, a swap’owanie bardzo istotnie spowalniapracę programu. Sugestia: można próbować zadanieobliczyć w sposób rozproszony (na wielu maszynach).Udało się na pewno wykryć, że minimalne sudoku 32 są oliczności początkowej � 18.

19/ 39

Własności algorytmu A∗ (Hart, Nilsson, Raphael,1968)

Funkcja decydująca o porządku wyciągania stanów zezbioru Open jest sumą dwóch funkcji:

f (v) = g(v) + h(v),

gdzie g(v) wyraża faktyczny koszt (odległość) przebytyod stanu początkowego do v , natomiast h(v) jestheurystyką szacującą koszt (odległość) od stanu v dostanu docelowego.Funkcja h musi być tzw. dopuszczalną heurystyką,tzn. nie wolno jej przeszacowywać kosztu (odległości) dostanu docelowego (o tym dokładniej jeszcze później. . . ).W zastosowaniach typu routing (gdzie mamyfizyczny/geograficzny graf) częstym i poprawnymwyborem dla h, jest zwykła odległość w linii prostej od vdo stanu docelowego (na pewno nie przeszacowujemy).

20/ 39

Własności algorytmu A∗ (Hart, Nilsson, Raphael,1968)

W odróżnieniu od Best First Search, A∗ bierze pod uwagętakże g(v), a nie tylko heurystykę zorientowaną na cel. Azatem w budowanej ścieżce z jednej strony preferowane sąstany bliskie początkowemu, a z drugiej jednocześniebliskie końcowemu (w sensie minimalizacji tej sumy).W algorytmie, każdy stan v musi mieć możliwośćzapamiętania swoich trzech wartości: g(v), h(v), f (v).Przechodząc od pewnego stanu v do pewnego stanu w ,wartość funkcji g wyznaczamy jako:g(w) = g(v) + d(v , w), gdzie d(v , w) oznacza kosztprzejścia z v do w .

21/ 39

A∗

Algorytm1 Dla stanu początkowego wyznacz wartość h, a następnie

ustaw: g = 0, f = 0 + h. Ustaw także pustegopoprzednika i wstaw stan początkowy do zbioru Open.

2 Dopóki zbiór Open pozostaje niepusty powtarzaj:2.1 Pobierz (i usuń) jeden stan v ze zbioru Open (jest to

stan najlepszy w sensie wartości f ).2.2 Jeżeli v jest stanem docelowym (spełnia warunek stopu),

to przerwij cały algorytm i zwróć v jako wynik.2.3 Wygeneruj wszystkie stany w potomne dla v i dla

każdego z nich wykonaj:2.3.1 Jeżeli stan w występuje w Closed, to nie badaj go dalej.2.3.2 Policz: g(w) = g(v) + d(v , w) i f (w) = g(w) + h(w).2.3.2 Jeżeli stan nie występuje w Open, to dodaj go ustawiając v jako

jego poprzednik.2.3.3 Jeżeli stan występuje w Open, to podmień w nim wartości g i f

(oraz poprzednika), o ile są korzystniejsze.

2.4 Włóż v do zbioru Closed.22/ 39

Zastosowania A∗

Ogólnie: poszukiwanie najkrótszej ścieżki w grafie. . .routing problems,poruszanie się postaci (boot’ów) w grachkomputerowych,przechodzenie labiryntów,układanki, łamigłówki, gdzie należy dodatkowozminimalizować liczbę ruchów (np. puzzlen2 − 1),. . .

23/ 39

Labirynty — wyniki A∗

Rozmiary siatki: 30 × 30, odwiedzonych stanów do momentu rozwiązania: 258.24/ 39

Labirynty — wyniki A∗

Rozmiary siatki: 30 × 30, odwiedzonych stanów do momentu rozwiązania: 331.25/ 39

Labirynty — wyniki A∗

Rozmiary siatki: 50 × 50, odwiedzonych stanów do momentu rozwiązania: 1441.26/ 39

Dobra i zła (przeszacowująca) heurystyka

h(v) =√

(vx − goalx)2 + (vy − goaly )2

lub h(v) = |vx − goalx | + |(vy − goaly )|

h(v) = 4√

(vx − goalx)2 + (vy − goaly )2

27/ 39

Puzzle n2 − 1

Dla n = 3Wychodząc od stanu początkowego i przesuwając pola zliczbami w miejsce puste ’9’ (w ogólności niech pole pusterówne jest ’n2’), należy w jak najmniejszej liczbie ruchów dojśćdo stanu docelowego:

1 2 34 5 67 8 9

28/ 39

Puzzle n2 − 1

Przykładowa heurystykaDla danego węzła v niech vix oraz viy oznaczająodpowiednio współrzędne x i y , na których położona jestliczba i w układance.Niech lewe górne pole ma współrzędne (0, 0) a prawedolne (n − 1, n − 1).Przykładowa funkcja heurystyczna może mieć wówczaspostać:

h(v) =12

∑i∈{1,2,...,n2}

(|vix − ((i −1) mod n)|+ |viy −�(i −1)/n�|

).

29/ 39

Przykładowa ścieżka A∗ dla puzzle 22 − 1

Odwiedzonych stanów: 15.

30/ 39

Przykładowa ścieżka A∗ dla puzzle 32 − 1

Odwiedzonych stanów: 19.

31/ 39

Własności A∗ i monotoniczność heurystyki

Heurystyka jest na pewno dopuszczalna, jeżeli jest monotoniczna,tzn.:

∀v ,w h(v) � d(v ,w) + h(w). (1)

Innymi słowy, dodanie do jakiejkolwiek ścieżki dodatkowego węzłapowoduje, że nowa ścieżka jest niekrótsza od poprzedniej. Arówność może mieć miejsce tylko, gdy dodamy węzeł poruszając siępo prostej do celu.

Jeżeli heurystyka h spełnia w/w warunek to algorytm A∗

gwarantuje, że: (1) znalezione rozwiązanie jest optymalne (ścieżkanajkrótsza), (2) sam algorytm jest optymalny w ramach h, tj. żadeninny algorytm używający h jako heurystyki nie odwiedzi mniejszejliczby stanów niż A∗.

Niech h∗ oznacza doskonałą heurystykę tj. taką, która ani nieprzeszacowuje, ani nie niedoszacowuje. Algorytm pracujący napodstawie h∗ jest także doskonały — odwiedza możliwie najmniejwęzłów. Stąd też oryginalnie rozróżniano dwie nazwy tegoalgorytmu A i A∗.

32/ 39

Jak A∗ ma się do algorytmu Dijkstry i Best FirstSearch?

Przy ustawieniu ∀v h(v) = 0 algorytm A∗ staje sięklasycznym algorytmem Dijkstry do poszukiwanianajkrótszej ścieżki w grafie z punktu do punktu.Przy ustawieniu ∀v g(v) = 0 algorytm A∗ staje sięalgorytmem Best First Search. Nieistotna jest długośćścieżki, liczy się tylko osiągnięcie/odkrycierozwiązania/rozwiązań (np. sudoku, problem nhetmanów).

33/ 39

Algorytm MIN-MAX (lub MINIMAX)

Stosuje się do gier dwuosobowych jak np. szachy,warcaby, GO, itp..Algorytm w wersji niezmodyfikowanej składa się z dwóchczęści: (1) budującej drzewo gry do zadanej głębokości(np. poprzez Breadth First Search), (2) przechodzącejdrzewo od dołu w górę i nadającej oceny poszczególnymstanom gry, tak że w efekcie ocenione zostają możliweruchy pochodzące od stanu podstawowego.Przechodzenie drzewa w górę rozpoczyna się odwystawienia ocen stanom końcowym (liściom). Zwyklejest to heurystyka np. różnica pomiędzy liczbą bierekbiałych i czarnych.Następnie drzewo przechodzone jest poziomami w górę.Każdy poziom jest skojarzony z ruchami jednego z graczy.Jeden z graczy nazywany jest minimalizującym, drugimaksymalizującym.

34/ 39

Algorytm MIN-MAX (lub MINIMAX)

Zwycięstwo gracza maksymalizującego reprezentowanejest przez ∞ (w szachach: białe matują czarne), aminimalizującego −∞ (czarne matują białe).Pozycje inne niż zwycięskie musimy oceniaćheurystycznie. Np. jedna z najprostszych heurystyk dlaszachów mierzy różnicę pomiędzy „materiałem” białych aczarnych, licząc piony za 1 pkt., skoczki za 3 pkt., gońceza 3.5 pkt, wieże za 5 pkt., hetmana za 9 pkt.Tylko poziom najniższy (stany liście) jest ocenianyheurystycznie. Oceny dla wyższych poziomów wynikają zminimaksowej procedury przechodzenia drzewa w górę.Uwaga: w literaturze ruch jednego z graczy nazywany jestczęsto półruchem (ang. ply), a przesuwanie się o jedenpoziom w drzewie liczone jest jako ±1

2 . Dopiero 2 ruchyobu graczy traktowane są jako całe posunięcie.

35/ 39

Ilustracja fragmentu drzewa gry dla szachów

36/ 39

Algorytm MIN-MAX (lub MINIMAX)

Rysunek: Źródło: http://en.wikipedia.org/wiki/Image:Minimax.svg

37/ 39

Algorytm MIN-MAX (lub MINIMAX)

Podstawowym problemem algorytmu w wersjiniezmodyfikowanej jest duża złożoność pamięciowa. Niechdla uproszczenia n oznacza średnią lub stałą liczbę ruchówdostępną na każdym poziomie dla każdego z graczy (dlaszachów n ≈ 40). Wówczas przejrzenie m poziomówgłębokości wymaga O(n · n · · · n︸ ︷︷ ︸

m

) = O(nm) pamięci.

Najbardziej znaną modyfikacją algorytmu, która redukujew pewnym stopniu złożoność pamięciową, jest przycinanieα-β (ang. α-β cutoffs).

Nie ma wydzielonych osobnych dwóch części (budowanie drzewa,minmax), drzewo jest po części budowane i oceniane równocześnie.Dla każdego stanu przechowywana jest para (α, β) oznaczającaodpowiednio gwarantowane dotychczas: minimalny zysk graczamaksymalizującego i maksymalną stratę gracza minimalizującego.Poddrzewa, które na pewno nie mogą wpłynąć na (α, β), są pomijane(nie byłyby one wynikiem optymalnego postępowania obu graczy).

W efekcie algorytmowi można zadać większą głębokość przeszukiwania.

38/ 39

Algorytm MIN-MAX (lub MINIMAX)

Efekt horyzontuZ uwagi na ograniczoną głębokość przeszukiwania, algorytmmoże cierpieć na tzw. efekt horyzontu — następny ruch pozanajgłębszym przejrzanym poziomem może okazać siękatastrofalny dla jednego z graczy, mimo że poziom wyżejoceny są dla niego korzystne (np. w szachach nie rozpatrzenieaż do tzw. pozycji martwej kombinacji zbić).

39/ 39