Zadanie 1: Piętnastka
Transkrypt
Zadanie 1: Piętnastka
Informatyka, studia dzienne, inż. I st. semestr VI Sztuczna Inteligencja i Systemy Ekspertowe 2010/2011 Prowadzący: mgr Michał Pryczek piątek, 12:00 Data oddania: Ocena: Grzegorz Graczyk 150875 Marek Rogalski 150982 Zadanie 1: Piętnastka∗ 1. Cel Celem zadania było doświadczalne sprawdzenie i ocena różnych strategii przeszukiwania przestrzeni stanów. W ramach zadania należało napisać program rozwiązujący układankę ”piętnastka”. Program realizował zadanie przeszukując przestrzeń stanów z pomocą trzech strategii: przeszukiwania wszerz, przeszukiwania wgłąb, best first search, oraz przeszukiwania wiązką. 2. Wprowadzenie Przeszukiwanie przestrzeni stanów jest jednym z podejść do szukania rozwiązań problemów dla których możliwa jest reprezentacja w postaci zbioru stanów. Jeśli rozważany zbiór stanów określa dodatkowo przejścia między stanami, można do jego przeszukiwania zastosować bardziej systematyczne podejście. W szczególności, możliwe staje się szukanie rozwiązań optymalnych pod kątem odległości od stanu początkowego (liczonej w ilości krawędzi). Kolejną właściwością, która często pojawia się w podobnych zadaniach jest możliwość wprowadzenia pewnej funkcji oceny (kosztu). Obecność takiej funkcji pozwala na konstrukcję algorytmów, które przeszukując przestrzeń stanów skupiają się na stanach obiecujących pod kątem funkcji oceny (minimalizujących koszt). ∗ SVN: http://serce.ics.p.lodz.pl/svn/labs/sise/mp_pt1030/alois@591 1 Wszystkie powyższe własności występują w rozwiązywanym przez nas problemie. Aby je sprawdzić zbudowaliśmy program korzystający z następujących strategii: — przeszukiwanie wszerz - w pierwszej kolejności stany o najmniejszej odległości od stanu początkowego. Taki model przeszukiwania możemy realizować dodając wszystkich nieodwiedzonych sąsiadów aktualnie odwiedzanego stanu do kolejki, a następnie odwiedzając kolejnego kandydata z kolejki według takiego samego schematu. — przeszukiwanie wgłąb - kolejność przeszukiwania, w której przeszukując stany /zagłębiamy się/ w kolejne nieodwiedzone wierzchołki z aktualnie odwiedzanego wierzchołka. Model taki możemy zrealizować w sposób analogiczny do przeszukiwania wszerz, jednak zamiast kolejki, stosując stos. — przeszukiwanie /best first/ - kolejność przeszukiwania, w której w pierwszej kolejności odwiedzamy najbardziej obiecujące stany (najniższa wartość funkcji kosztu). Analogicznie do poprzednich przypadków, i ta strategia może zostać zrealizowana za pomocą zbioru wierzchołków oczekujących na przejrzenie. W tym przypadku zbiór ten przybierze postać kolejki priorytetowej. — przeszukiwanie wiązką - w tej kolejności przeszukiwania, odwiedzamy w pierwszej kolejności stany o najmniejszym koszcie. Dodając stany do zbioru wierzchołków oczekujących dbamy o to by nie przekroczyć pewnego ograniczenia powyżej którego ignorujemy nowo dodawane stany. 3. Manual Projekt składa się z 3 programów: game, display oraz show. Najprostszym sposobem użycia jest ‘./game params ¡ in‘ wczytujący opis planszy i wyświetlający wynik. Pozostałe sposoby użycia to: ‘./display params < in | ./show‘ - szukanie rozwiązania wyświetlając na żywo aktualnie przeszukiwany stan. ‘(cat in; cat) | ./show‘ - uruchomienie układanki w wersji interaktywnej. ‘(cat in; cat out) | ./show 500‘ - prezentacja rozwiązania zapisanego w pliku out poprzez wykonywanie ruchu co pół sekundy 4. Opis implementacji W implementacji należy wyróżnić dwie struktury: strategię oraz stan. Strategia została zaimplementowana jako klasa abstrakcyjna posiadająca metody Push, Pop oraz metodę pozwalającą pobrać kolejność dodawania następników. Rolą strategii jest przechowanie zbioru stanów oraz pobieranie ich w odpowiedniej kolejności. Struktura stan posiada dwie implementacje - optymalną pod kątem czasu przechowującą stan jako tablicę ze stanami wszystkich pól oraz optymalną 2 pod kątem pamięci przechowującą stan jako numer permutacji odpowiadający danemu stanowi (numer jest ograniczony do 64 bitów, więc ta struktura nadaje się tylko dla mniejszych układanek). Wybór struktury następuje za pomocą flag kompilacji - domyślną strukturą jest optymalna pod kątem czasu. 5. Materiały i metody Doświadczenia wykonaliśmy na zestawie układanek: - czterech losowych układankach 3x3 (porównanie wszystkich metod) - czterech losowych układankach 3x4 (porównanie wszystkich metod) - dziesięciu układankach 4x4 których optymalne rozwiązania są długości od 1 do 16 (porównanie wszystkich metod) - czterech losowych układankach 4x4 (porównanie wszystkich metod) - trzech losowych układankach - 5x5, 6x6, oraz 7x7 (funkcje heurystyczne) 6. Wyniki Poniższa tabelka przedstawia długości rozwiązań dla 5 losowych testów o wymiarach 3x3: Test 1 2 3 4 5 BFS 18 18 22 20 25 DFS Heurystyka 1 Heurystyka 2 88962 46 20 83374 44 28 24348 52 40 21632 34 32 817 45 47 Ponadto podczas prób zauważono, że BFS nawet w wersji niedeterministycznej zwraca rozwiązanie tej samej długości, zaś DFS o długości losowej. Testy wydajnościowe przeprowadzono dla losowych układanek o różnych rozmiarach: Rozmiar BFS 3x3 0m0.116s 3x4 – 4x4 – 5x5 – 6x6 – 7x7 – 8x8 – DFS 0m1.416s – – – – – – Heurystyka 1 Heurystyka 2 0m0.004s 0m0.004s 0m0.004s 0m0.004s 0m0.004s 0m0.008s 0m0.016s 0m0.276s 0m0.024s 0m7.868s 0m0.156s – 0m19.709s – Przygotowano także testy dla układanek 4x4 o nielosowych stopniach skomplikowania. Pierwsza kolumna oznacza długość optymalnego rozwiązania, zaś + i - symbolizują powodzenie bądź porażkę algorytmu. 3 Optymalne BFS in 1 3 2 9 3 16 4 28 5 60 6 99 7 400 8 972 9 1758 10 3568 Optymalne nn1 in 1 3 2 5 3 6 4 8 5 10 6 11 7 16 8 24 9 470 10 469 BFS out 1 4 7 12 26 43 189 460 836 1711 nn1 out 1 2 3 4 5 6 8 11 204 203 BFS + + + + + + + + + + nn1 + + + + + + + + + + 4 DFS in DFS out 3 1 5 2 6 3 62155 31916 82394 42331 3640991 1870722 3641806 1871138 82394 42331 3629611 1864756 3623708 1861674 nn2 in nn2 out 3 1 5 2 6 3 8 4 10 5 11 6 13 7 15 8 16 9 18 10 DFS + + + + + + nn2 + + + + + + + + + + 7. Dyskusja Pierwsza seria testów pozawala wyciągnąć wnioski dotyczące optymalności rozwiązań. Rozwiązania uzyskane algorytmem DFS w widoczny sposób odbiegają od wyników uzyskanych innymi algorytmami. Na podstawie posiadanej wiedzy możemy stwierdzić, że rozwiązania uzyskane algorytmem BFS są najoptymalniejszymi istniejącymi rozwiązaniami. W wypadku heurystyk znalezione rozwiązania są tego samego rzędu co rozwiązania najoptymalniejsze - są zaledwie 2 dłuższe. Dowodzi to przeszacowania w użytych heurystykach pozwalając jednak odnajdywać rozwiązania znacznie szybciej. Testy wydajnościowe pokazały, że algorytmy BFS i DFS nie nadają się do rozwiązywania układanek większych niż 3x3. W wypadku układanki 3x4 liczba osiągalnych stanów wynosi 240 milionów co przekraczało możliwości naszego sprzętu badawczego. 5 8. Wnioski — Algorytm BFS jako jedyny z badanych znajduje optymalne (najmniej ruchów) rozwiązania. — Algorytm DFS znajduje rozwiązania bardzo nieoptymalne tysiące razy dłuższe niż optymalne. Z tego powodu nie nadaje się on do tego rodzaju przeszukiwania stanów. — Algorytmy heurystyczne znajdują rozwiązania znacznie szybciej niż algorytmy BFS bądź DFS znajdując jednocześnie rozwiązania zaledwie kilka razy gorsze niż optymalne. Literatura [1] http://theory.stanford.edu/˜amitp/GameProgramming/ [2] http://xkcd.com/688/ Na końcu należy obowiązkowo podać cytowaną w sprawozdaniu literaturę, z której grupa korzystała w trakcie prac nad zadaniem (przykład na końcu szablonu) 6