Temat: Technika powrotów (ang. backtracking). Schemat algorytmu i
Transkrypt
Temat: Technika powrotów (ang. backtracking). Schemat algorytmu i
Temat: Technika powrotów (ang. backtracking). Schemat algorytmu i przykłady zastosowania. Przypomnienie Porównanie czasów realizacji algorytmu wykładniczego na dwóch komputerach o ró nej szybko ci wykonania operacji elementarnej Rozmiar n 20 Czas 1,04 s działania (2 n / 10 6 ) Czas działania (2 n / 10 9 ) 0,001 s 50 35,7 lat 100 200 4 ⋅ 1014 wieków 5 ⋅ 10 44 wieków 13 dni 4 ⋅ 1011 5 ⋅ 10 41 wieków wieków Problemy łatwo rozwi zalne to takie, dla których mo na poda algorytm o wielomianowej zło ono ci czasowej, czyli taki, którego koszt jest O(nk) (dla pewnego stałego k). Problemy o zło ono ci wy szej ni wielomianowa, czyli takiej, e nie da si jej ograniczy przez O(nk), dla dowolnego k, nazywamy trudno rozwi zalnymi. W ród problemów trudno rozwi zalnych wyró nia si : • Klas problemów, dla których, mo na udowodni , e nie istnieje algorytm wielomianowy. • Klas problemów, dla których, jak do tej pory nie udało si poda dowodu na brak wielomianowego rozwi zania. 1 Strategia powrotów, to strategia pozwalaj ca na skonstruowanie optymalnego rozwi zania ponadwielomianowego, w przypadku, gdy nie potrafimy poda rozwi zania wielomianowego albo wiemy, e takie rozwi zanie nie istnieje. 1. Schemat algorytmu typu backtracking Przyjmijmy, e dana jest przestrze stanów, przy czym stan jest sytuacj stanowi c rozwi zanie problemu albo mog c prowadzi do rozwi zania oraz sposób przechodzenia z jednego stanu w drugi. Aby rozwi za taki problem, musimy przeszuka przestrze stanów, przechodz c z jednego stanu w drugi, a znajdziemy si w stanie okre laj cym rozwi zanie problemu. Poniewa dla ka dego stanu mo e istnie wiele dopuszczalnych ruchów, czyli wiele stanów, do których mo na doj , mo emy wybra złe posuni cie. Je eli wykonamy zły ruch i znajdziemy si w sytuacji bez wyj cia (nie osi gaj c poprawnego rozwi zania i nie maj c wi cej dopuszczalnych posuni do wykonania), musimy cofn ostatni ruch i spróbowa zrobi inny. Je eli cofni cie ostatniego ruchu w dalszym ci gu nie prowadzi do rozwi zania, to cofamy ruch przedostatni i próbujemy dalej. Ta metoda nosi nazw metody powrotów. Metoda powrotów wymaga zapami tania wszystkich wykonanych ruchów czy te wszystkich odwiedzonych stanów, aby mo liwe było cofanie przesuni . Naturaln technik kodowania algorytmów opartych na strategii powrotów jest rekurencja. 2 Schemat algorytmu z powrotami Oznaczenia: <x1, ..., xn> - szukane rozwi zanie Ak - zbiór mo liwych rozszerze rozwi zania cz ciowego <x1, ..., xk-1> P – funkcja (algorytm), która dla danego rozwi zania cz ciowego <x1, ..., xi> przyjmuje warto 0, gdy ci g <x1, ..., xi> nie daje si rozszerzy do rozwi zania całkowitego, a 1 w przeciwnym przypadku. k – aktualna długo rozwi zania cz ciowego BackTracking(k) for y ∈ Ak if (P(x1 , x2 ,..., xk −1 , y ) == 1) { x k = y; if „ x1 , x 2 ,..., x k jest rozwi zaniem całkowitym" "wypisz rozwi zanie x1 , x 2 ,..., x k else BackTracking(k+1); Ak = Ak ∪ {y}; } 2. Przykłady zastosowania schematu powrotów a) Problem znalezienia drogi (cyklu) Hamiltona w grafie Droga (cykl) Hamiltona w grafie to droga (cykl) przechodz ca przez wszystkie wierzchołki grafu dokładnie raz. 3 Nie istnieje jednoznaczne kryterium, które pozwala, tak jak w przypadku drogi (cyklu) Eulera stwierdzi , czy dany graf ma drog (cykl) Hamiltona. Przykład 2 3 1 5 4 Powy szy graf ma wiele cykli Hamiltona, np.: 1-2-3-5-4-1 Algorytm naiwny Stosujemy pełny przegl d wszystkich mo liwo ci, tj. generujemy wszystkie mo liwe permutacje zbioru n–1 elementowego, gdzie n jest liczb wierzchołków grafu i sprawdzamy, czy okre laj one cykl (drog ) Hamiltona. Koszt algorytmu naiwnego Zakładaj c, e szukamy wszystkich cykli z ustalonego wierzchołka startowego, koszt algorytmu naiwnego jest równy T (n ) = (n − 1)! ⋅ n 4 Rozwi zanie problemu znajdowania Hamiltona oparte na strategii powrotów wszystkich cykli G – graf o n wierzchołkach ponumerowanych od 1 do n , s – wierzchołek startowy X – tablica z wierzchołkami analizowanego rozwi zania cz ciowego DOP – tablica logiczna rejestruj ca mo liwo wykorzystania wierzchołków w cyklu; DOP[i]=1, gdy wierzchołek mo e by wykorzystany w aktualnie generowanym rozwi zaniu cz ciowym, DOP[i]=0, gdy wierzchołek i został ju wykorzystany w generowanym cyklu. k – długo rozwi zania cz ciowego Hamilton(k) y=X[k-1]; for (v∈V && (v, y) ∈E) { if (k = = n +1 && v == s) “X zawiera cykl Hamiltona”; else if DOP[v]) { X[k]=v; DOP[v]=0; Hamilton(k +1); DOP[v]=1; } } Wywołanie funkcji Hamilton for (i=1; i<=n; i++) do DOP[i]=1; X[1]=s; 5 DOP[s]=0; Hamilton(2); Przykład 2 3 1 5 4 1 2 4 5 3 4 5 5 3 4 4 1 1 4 3 5 3 2 5 5 2 1 3 2 2 3 6 1 Zło ono czasowa algorytmu generowania cykli Hamiltona Drzewo mo liwych "rozszerze " rozwi zania cz ciowego jest drzewem wielokierunkowym o wysoko ci równej co najwy ej n. Je eli za operacj elementarn przyjmiemy ka de wywołanie rekurencyjne procedury Hamilton, to koszt algorytmu jest równy liczbie w złów w drzewie. Mo na pokaza , e liczba ta jest O(2n). b) Problem ustawienia hetmanów na szachownicy Problem ten rozwa any był po raz pierwszy przez Gaussa w 1850 roku i polega na znalezieniu takiego ustawienia o miu hetmanów na szachownicy, aby aden z hetmanów nie szachował adnego innego (hetman szachuje inne figury w tym samym wierszu i kolumnie, w której stoi i dodatkowo po przek tnych). Szachownica w problemie Gaussa miała wymiary 8x8. Przykład Pola szachowane przez figur hetmana. Pole na którym stoi hetman jest oznaczone liter H, a pola szachowane przez hetmana s wypełnione liter S. S S S S S S S S S H S S S S S S S S S S S S S S S S 7 Idea algorytmu Próbujemy umie ci pierwszego hetmana na szachownicy, potem drugiego, ale tak, by nie mógł zbi pierwszego, nast pnie trzeciego tak, aby nie był w konflikcie z dwoma ju postawionymi i tak dalej, dopóki nie umie cimy wszystkich. Je li na przykład szósty hetman nie mo e by umieszczony na adnej pozycji nie koliduj cej z wcze niejszymi, to wykonujemy powrót i wybieramy inn pozycj dla pi tego hetmana i próbujemy znowu ustawi szóstego. Je li to nie pomaga, to ponownie przestawiamy pi tego. Je li wszystkie mo liwo ci dla pi tego hetmana zostały wyczerpane, przestawiamy czwartego i proces zaczyna si od nowa. Algorytm szuka wszystkich mo liwych rozwi za . Dla szachownicy 8 na 8 jest ich a 92. Przykład Przykładowe rozwi zanie problemu ustawienia o miu hetmanów. 8 Pseudokod algorytmu rozwi zuj cego problem ustawienia hetmanów n - rozmiar szachownicy; liczba pól w pionie i poziomie i jednocze nie liczba hetmanów do ustawienia PutQueen(r) r – numer wiersza, w którym próbujemy ustawi hetmana for (c = 0;c< n; c++) if („pozycja [r, c] nie jest atakowana”) { „umie hetmana na pozycji [r, c]”; if (r < n-1) PutQueen(r+1); else „wypisz rozwi zanie”; „usu hetmana z pozycji [r, c]”; } Optymalna implementacja powy szego pseudokodu powinna w krótkim czasie realizowa nast puj ce operacje: • sprawdzenie, czy pozycja [r, c] nie jest atakowana, • umie hetmana na pozycji [r, c], • usu hetmana z pozycji [r, c]. Zauwa my, e: • Indeksy wszystkich pól na "lewych przek tnych" spełniaj warunek: r + c = nl, gdzie nl jest numerem lewej przek tnej. nl przyjmuje warto od 0 do 2n-1. • Indeksy wszystkich pól na "prawych przek tnych" spełniaj warunek: r - c = nr, gdzie nr jest numerem prawej przek tnej. nr przyjmuje warto od -n+1 do n-1. 9 Przykład Dla uproszczenia przyjrzyjmy si szachownicy 4 na 4. Wiersze i kolumny szachownicy ponumerujemy liczbami od 0 do 3. 0, 0 0, 1 0, 2 0, 3 1, 0 1, 1 1, 2 1, 3 2, 0 2, 1 2, 2 2, 3 3, 0 3, 1 3, 2 3, 3 • Struktura danych dla wszystkich lewych przek tnych to jednowymiarowa tablica logiczna LeftDiagonal. Je eli LeftDiagonal[i]=0, to lewa przek tna o numerze i jest szachowana. • Struktura danych dla wszystkich prawych przek tnych to jednowymiarowa tablica logiczna RightDiagonal. Je eli RightDiagonal[i]=0, to prawa przek tna o numerze i jest szachowana. • Potrzebna b dzie podobna tablica dla kolumn Column. Je eli Column[i]=0, to kolumna o numerze i jest szachowana. Nie jest potrzebna tablica dla wierszy, poniewa i - ty hetman "w druje" wzdłu wiersza i, a wszystkie hetmany o numerach mniejszych ni i zostały ju ustawione w wierszach o numerach mniejszych ni i. 10 • Tablica PositionInRow to tablica jednowymiarowa, która przechowuje rozwi zania cz ciowe i całkowite problemu. Je eli PositionInRow[i]=j, to hetman z wiersza i jest ustawiony w kolumnie o numerze j. Algorytm rozwi zuj cy problem ustawienia czterech hetmanów n – rozmiar szachownicy LeftDiagonal – tablica logiczna o indeksach od 0 do 2n-2 RightDiagonal - tablica logiczna o indeksach od -n+1 do n-1 Column – tablica logiczna o indeksach od 0 do n-1 PositionInRow – tablica wynikowa PutQueen(r) for (c=0; c<n; c++) if (Column[c] && LeftDiagonal[r+c] && RightDiagonal[r-c]) { PositionInRow[r]=c; Column[c]=0; LeftDiagonal[r+c]=0; RightDiagonal[r-c]=0; if (r < n-1) PutQueen(r + 1); else “wypisz wynik –PositionInRow”; Column[c]=1; LeftDiagonal[r + c]=1; RightDiagonal[r - c]=1; }; 11 Kroki prowadz ce do pierwszego udanego ustawienia czterech hetmanów, wykonywane przez funkcj PutQueen PutQueen(0) (0,0) (0,1) (1,2) (1,3) (1,3) (2,0) (2,1) (3,2) Zmiany w czterech tablicach wykorzystanych w funkcji PutQueen PositionInRow 0 0 0 1 1 2 3 3 2 1 0 3 2 0 0 0 0 Column 1 1 0 0 2 0 1 0 3 1 0 0 0 0 0 1 1 1 1 0 LeftDiagonal 2 1 1 0 3 4 5 6 0 1 1 1 0 0 1 1 1 0 0 1 -3 1 1 1 -2 1 0 0 RightDiagonal -1 0 1 2 3 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 12