POLITECHNIKA KRAKOWSKA - WIEiK KATEDRA AUTOMATYKI i TECHNIK INFORMACYJNYCH Algorytmy i struktury danych www.pk.edu.pl/~zk/aisd_hp.html Wykładowca: dr inż. Zbigniew Kokosiński zk@pk.edu.pl
Wykład 5: Algorytmy z nawrotami. 1. Wprowadzenie. Starożytne początki. 2. Wyszukiwanie wyczerpujące w przestrzeni rozwiązań a idea algorytmu wyszukiwania z powrotami. 3. Przykład : problem komiwojażera (TSP). 4. Przykłady klasycznych algorytmów z powrotami: problem skoczka szachowego, problem ośmiu hetmanów. 5. Gry. Drzewo gry. Ocena rozwiązań w węzłach. 6. Technika alfa-beta odcinania gałęzi drzewa gry. 7. Wady i zalety algorytmów z powrotami.
Wprowadzenie. Starożytne początki Metoda wyszukiwania z nawrotami została wynaleziona w starożytności. Tezeusz przeszukał zaprojektowany przez Dedala labirynt w podziemiach pałacu w Knossos, aby odnaleźć i zabić w nim Minotaura. Nawroty przy przeszukiwaniu labiryntu oraz znalezienie drogi powrotnej do jego wejścia umożliwiła śmiałkowi nić otrzymana od Ariadny. Poniżej: rzymska mozaika w Recji (obecnie Szwajcaria) oraz labirynt wygenerowany komputerowo.
Idea algorytmu z nawrotami Wyszukiwanie z nawrotami (ang. backtracking) jest ogólną techniką wyszukiwania wszystkich rozwiązań (lub tylko jednego rozwiązania) problemu, która inkrementacyjnie buduje rozwiązanie częściowe, porzucając go gdy dalsze budowanie nie prowadzi już do dopuszczalnego rozwiązania, o czym decyduje stosunkowo prosty test. Jeżeli problem pozwala na zastosowanie wyszukiwania z nawrotami, to metoda ta może być znacznie efektywniejsza niż wyszukiwanie wyczerpujące, zakładające przeszukanie wszystkich potencjalnych rozwiązań, ponieważ pojedynczy test może wyeliminować nie jedno, a wiele rozwiązań niedopuszczalnych. Wyszukiwanie z nawrotami jest techniką bardzo przydatną w problemach zawierających ograniczenia (ang. constraints satisfaction problems), w optymalizacji kombinatorycznej, w analizatorach składniowych (parserach) itp. Termin backtracking zaproponował w latach 50. D.H. Lehmer.
Problem komiwojażera (TSP) Dany jest graf nieskierowany G(V,E) oraz funkcja f przypisująca wagi (koszt) wszystkim krawędziom e należącym do E. Wyznacz trasę z miasta A o minimalnym koszcie tak, aby każde miasto zostało odwiedzone dokładnie jeden raz.
Problem komiwojażera (TSP) - rekurencja Zakładamy następujący porządek przeszukiwania grafu wgłąb (DFS) z wierzchołka A : A B C E F D G H I K J L M. Algorytm z powrotami jest modyfikacją algorytmu DFS, polegającą na czyszczeniu po sobie przez procedurę visit zmian wprowadzonych do zmiennej id (kolejność odwiedzania k-tego wierzchołka) oraz elementu val[k](odnotowanie odwiedzin). Pierwsze wywołanie procedury to visit(1). Stosujemy reprezentację macierzową grafu.
Problem komiwojażera (TSP) - wyszukiwanie wyczerpujące Wszystkie trasy komiwojażera rozpoczynające się w mieście A (A jest korzeniem drzewa, trasy scieżkami od korzenia do liścia). Drzewo wyszukiwania wyczerpującego ma 153 wierzchołki.
Problem komiwojażera (TSP) wyszukiwanie z nawrotami (1) Jeżeli założymy, że na trasie komiwojażera rozpoczynajacej się w mieście A miasto C musi poprzedzać miasto B, to wyszukiwanie dopuszczalnej trasy zostanie znacznie ułatwione a liczba kroków zmaleje (algorytm z nawrotami).
Problem komiwojażera (TSP) wyszukiwanie z nawrotami (2) Jeżeli w poprzednim przykładzie zauważymy, że istnieją trasy dzielące nieodwiedzoną część grafu na niepołączone ze sobą fragmenty (np. AFE), to zadanie wyszukiwania zostanie dalej uproszczone (zmaleje liczba wywołań rekurencyjnych za cenę sprawdzania spójności grafu np. algorytmem DFS).
Problem komiwojażera (TSP) wyszukiwanie z nawrotami (2 c.d.) Drzewo wyszukiwania z nawrotami ma w tym przypadku tylko 19 węzłów.
Problem skoczka szachowego
Algorytm z nawrotami 1. Ustawiamy skoczka na polu startowym. 2. Wyznaczamy współrzędne dostępnych w danym kroku pól pozostających w obrębie szachownicy (ustalając ich uporządkowaną listę). Odwiedzamy kolejne nieodwiedzone dotąd pole. 3. Powtarzamy to postępowanie budując cześciową trasę skoczka. Jeżeli kolejnego ruchu nie da się wykonać, to cofamy się o jeden krok i wiersz i przesuwamy figurę na kolejne dostępne pole. Jeśli takie pole nie istnieje, cofamy się dalej (rekurencja z powrotami). Zbudowanie trasy złożonej z (n^2)-1 ruchów skoczka oznacza znalezienie rozwiazania. 4. Postępowanie można powtarzać do momentu znalezienia pierwszego rozwiązania, albo kontynuować aż skoczek znajdzie wszystkie możliwe rozwiązania z pola startowego.
Problem skoczka szachowego rozwiązania dla szachownicy 5x5 i 6x6
Problem ośmiu hetmanów
Problem ośmiu hetmanów
Algorytm z nawrotami 1. Pierwszego hetmana stawiamy na polu a1 (w wierszu 1, kolumnie a). 2. Dla drugiego hetmana szukamy wolnego, t.j. nieatakowanego pola w wierszu 2, będzie to pole c2. 3. Podobnie postępujemy z kolejnymi hetmanami. Jeżeli któregoś hetmana nie da się postawić w kolejnym wierszu, to cofamy się o jeden wiersz i przesuwamy figurę na kolejne wolne pole. Jeśli takie pole nie istnieje, cofamy się dalej (rekurencja z powrotami). Ustawienie na wolnym polu ósmego hetmana oznacza znalezienie rozwiazania. 4. Postępowanie można powtarzać do momentu znalezienia pierwszego rozwiązania, albo kontynuować aż hetman w wierszu 1 przejdzie przez wszystkie pola i wyznaczone zostana wszystkie możliwe rozwiązania (92, w tym 12 istotnie różnych).
Problem ośmiu hetmanów istotnie różne rozwiazania (N liczba sprawdzanych pól)
Gry. Kółko i krzyżyk - drzewo gry
Rekurencyjne przeszukiwanie z nawrotami
Odcinanie alfa-beta - definicje Wierzchołek minimalny wierzchołek w grafie posiadający wartość minimum z wartości wag swoich dzieci. Wierzchołek maksymalny wierzchołek w grafie posiadający wartość maksimum z wartości wag swoich dzieci. Wyeliminowanie poddrzewa o korzeniu w węźle minimalnym nazywamy odcięciem alfa. Wyeliminowanie poddrzewa o korzeniu w węźle maksymalnym nazywamy odcięciem beta.
Odcinanie alfa-beta
Odcinanie alfa-beta reguły 1 1. Jeżeli każdy z wierzchołków-dzieci wierzchołka n ma ustaloną wartość ostateczną albo został odcięty to dotychczasowa wartość próbna wierzchołka n staje się jego wartością ostateczną. 2. Jeżeli wierzchołek maksymalny x posiada wartość próbną v1, a jego dziecko posiada wartość ostateczną v2, to nową wartością próbną jest dla x wartość max(v1,v2). 3. Jeżeli wierzchołek minimalny y posiada wartość próbną v1, a jego dziecko posiada wartość ostateczną v2, to nową wartością próbną jest dla y wartość min(v1,v2).
Odcinanie alfa-beta reguły 2 4. Jeżeli wierzchołek maksymalny x jest rodzicem wierzchołka mimimalnego y i wartość próbna wierzchołka y jest nie większa od wartości próbnej wierzchołka x, to poddrzewo o korzeniu y możemy wyeliminować z dalszych poszukiwań (odcięcie alfa). 5. Jeżeli wierzchołek minimalny y jest rodzicem wierzchołka maksymalnego x i wartość próbna wierzchołka x jest nie mniejsza od wartości próbnej wierzchołka y, to poddrzewo o korzeniu x możemy wyeliminować z dalszych poszukiwań (odcięcie beta).
Odcinanie alfa-beta - przykład
Zalety algorytmów z nawrotami 1. Algorytm z nawrotami znajduje rozwiązanie dokładne danego problemu. 2. Algorytm z nawrotami jest zwykle efektywniejszy niż algorytm wyszukiwania wyczerpującego. 3. Algorytm z nawrotami nadaje się do uwzglednienia w wyszukiwaniach wszelkiego rodzaju złożonych ograniczeń problemu, zmniejszających rozmiar przestrzeni wyszukiwań. 4. Algorytm z nawrotami jest szczególnie cenny w optymalizacji kombinatorycznej (np. problem plecakowy). 5. Algorytm z nawrotami nadaje się dobrze do modelowania niektórych typów gier, gdzie umozliwia zastosowanie techniki odcinania alfa-beta.
Wady algorytmów z nawrotami 1. Nie wszystkie problemy umożliwiają zastosowanie techniki nawrotów. 2. Ponieważ algorytmy z nawrotami bazują na rekurencji mała liczba wywołań rekurencyjnych ma decydujące znaczenie. Wyeliminowanie jak największej liczby wywołań rekurencyjnych wymaga dodatkowej pracy i czasu. 3. W niektórych przypadkach efektywność algorytmu z nawrotami może być porównywalna jak wyszukiwania wyczerpującego.
Źródła przykładów i rysunków : 1. Aho A.V., Hopcroft J.E., Ullman J.D. : Algorytmy i struktury danych, Helion/Addison-Wesley 2003. 2. Sedgewick R. : Algorithms in C, Addison-Wesley 1990. 3. Wirth N. : Algorytmy + struktury danych = programy, WNT, Warszawa 1989. 4. Wikipedia + strony tematyczne.