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

Podobne dokumenty