Wykonali: Aleksandra Kuchta, Łukasz Wójcik
Transkrypt
Wykonali: Aleksandra Kuchta, Łukasz Wójcik
Sztuczna Inteligencja, Semestr trzeci, Kierunek Informatyka, Wydział Informatyki i Zarządzania, Politechnika Poznańska ATOLL Wykonali: Aleksandra Kuchta, WFT, PP, nr 76690, rok IV Łukasz Wójcik, WIiZ, PP, nr 84908, rok II Plan sprawozdania: 1. Strona tytułowa 2. Opis gry 3. Implementacja 3.1. Reprezentacja stanu gry 3.2. Generacja ruchów dopuszczalnych 3.3. Metody przeszukiwania przestrzeni stanów gry - algorytmy grające 3.4. Funkcja oceny heurystycznej stanu gry 4. Testy wydajności i porównania algorytmów 5. Wnioski, uwagi i podsumowanie 2. Opis gry. Autorem gry, jej zasad i planszy jaką wykorzystaliśmy w implementacji jest Mark Steere. Il.1. Zdjęcia autora Marka Steere’a. Jak utrzymuje autor pierwowzorem gry jest Hex, znana gra planszowa. Stanowi ona pewien szczególny przypadek opisywanej przez nas gry. Różni się planszą i zasadą podmiany za kamień przeciwnika zamiast ruchu na wolne pole (zasada ta nie występuje w grze Atoll). O ile historia gry Atoll nie jest zbyt długa i barwna (wymyślono ją w styczniu 2008 roku), to Hex ma za sobą wieloletnią tradycję. W 1942 roku, jak podaje Wikipedia ,„wynalazł” ją Piet Hein rozważając zagadnienie „czterech barw”. Dotyczyło ono hipotezy, mówiącej o tym, że mapę można pokolorować jedynie 4 kolorami tak, aby granica między państwami nie oddzielała pól o tej samej barwie. Została wprowadzona w Instytucie Nielsa Bohra. Podobno równocześnie grę wymyślił wybitny matematyk i laureat nagrody Nobla John Nash. Historia głosi, że na uniwersytecie w Princeton (gdzie wykładał J. Nash), studenci grywali w nią na heksagonalnych kafelkach na terenie uczelni. Il. 2. Gra planszowa Hex, na której wzorował się autor projektując grę Atoll Zasady gry którą się zajęliśmy są jasne i proste. Została ona zaprojektowana dla 2 osób. Gra się na planszy, którą stanowi siatka składająca się z heksagonalnych pół. Warianty plansz są różne, my opracowaliśmy planszę w kształcie sześciokąta. Na obrzeżach znajdują się pokolorowane pola (tak samo jak pionki-kamienie, które będziemy stawiać). Il. 3. Różne warianty planszy gry Atoll. My zaimplementowaliśmy wersję widoczną na ilustracji trzeciej po lewej stronie u dołu. Grę zaczyna gracz posiadający pionki czarne. Musi on postawić jeden kamień na planszy, na wolnym polu. Nie ma możliwości odmowy ruchu. Po tym ruchu pora na gracza białego, który postępuje podobnie jak gracz czarny. Celem gry jest połączenie 2 przeciwległych wysp łańcuchem swoich pionków. Można do tego wykorzystać obrzeża planszy. W uogólnionej wersji plansza może mieć kształt dowolnej figury, na której przeciwległych krańcach będą znajdować się pionki tego samego koloru. Mimo, że nie wolno nam zmieniać zasad gry uznaliśmy, że kolor jest jedynie wartością estetyczną i pozwoliliśmy na małą zmianę. Stawiamy pionki czerwone (w zasadach czarne) i beżowe. Mamy nadzieje, że autor nie ma nic przeciwko. 3. Implementacja 3.1 Reprezentacja stanu gry Plansza reprezentowana jest jako wektor 73 pól, z których każde posiada informacje o tym do którego należy gracza oraz z którymi polami sąsiaduje. pion jest reprezentowany przez zmienną 'kto' w klasie pole – 0 oznacza puste pole, 1 gracza czerwonego, 2 gracza białego. przykład planszy i jej reprezentacja w pamięci: plansza[0] { plansza[1] { plansza[2] { plansza[3] { plansza[4] { plansza[5] { kto = 1; sasiedzi {1, 2, 61, 73}} kto = 2; sasiedzi {0, 3, 4, 7, 73}} kto = 0; sasiedzi {0, 4, 5, 8, 61}} kto = 1; sasiedzi {1, 6, 7, 11, 72, 73}} kto = 0; sasiedzi {0, 1, 2, 7, 8, 12}} kto = 0; sasiedzi{2, 8, 9, 13, 61, 62}} itd. 3.2 Generacja ruchów dopuszczalnych Możliwe ruchy pamiętane są na liście. W grze nie występują żadne ruchy poza dostawianiem nowych pionów. Dostawienie pionu powoduje usunięcie z listy możliwych ruchów numeru pola, na które postawiono pion. Lista wolnych pól jest mieszana przy każdym wywołaniu algorytmu Alfa-Beta lu Alfa-Beta FS Zastosowano także randomizację poprzez 60 krotne losowanie dwóch pozycji na liście i zamianę ich. 3.3 Metody przeszukiwania przestrzeni stanów gry - algorytmy grające W grze zastosowano następujące algorytmy: algorytm AlfaBeta algorytm AlfaBeta z iteracyjnym pogłębianiem. 3.4 Funkcja oceny heurystycznej stanu gry Zastosowana funkcja heurystyczna jest funkcją odległościową. Obliczane są najkrótsze odległości pomiędzy przeciwległymi wyspami przy założeniu, że odległość do sąsiada o kolorze gracza wynosi 0, do pustego pola 1, a do pola przeciwnika nieskończoność. Wartością zwracaną przez funkcję jest 10 - (minimalna liczba ruchów gracza do wygranej) pomniejszone o 2*(10-minimalna liczba ruchów gracza przeciwnego) Funkcja domyślnie zwraca wartości z przedziału (-20, 10) Wady: • przy odpowiednim rozstawieniu pionków (tak, że 2 pionki tego samego gracza będą miały dwóch wspólnych sąsiadów [układ kilku takich sytuacji]) algorytm może nie wychwycić, że jest już na przegranej pozycji. Zalety: • dzięki składowej (2*10-min. gracza przeciwnego) algorytm gra w sposób bezpieczniejszy – na pierwszym miejscu stawia blokowanie przeciwnika, a dopiero potem atakuje. Opis funkcji : • min1 = min(drogi gracza1) • min2 = min(drogi gracza2) • Ocena = (10 – min1) – 2*(10-min2) 4. Testy wydajności i porównania algorytmów 450000 400000 2 3 4 5 350000 300000 250000 AlfaBeta 324 6547 30918 404293 Iteracyjne 372 4760 22693 305549 AlfaBeta 200000 Iteracyjne 150000 100000 50000 0 1,5 2 2,5 3 3,5 4 4,5 5 5,5 Jak widać, algorytm z iteracyjnym pogłębianiem wypadł nieco lepiej od „czystej” AlfaBety. Nie wpływa jednak znacząco na przeszukiwaną przestrzeń, przez co niemożliwe jest zwiększenie głębokości przeszukiwania w sensownym czasie. 5. Wnioski, uwagi i podsumowanie Z uwagi na cechy gry łatwo można zauważyć, że przestrzeń zmienia się w trakcie rozgrywki w sposób stały, niezależnie od przebiegu rozgrywki. Odcięcia, które mogą powstać są bardzo trudne do przewidzenia z uwagi na randomizację ruchów w każdym wywołaniu algorytmu. Metoda z iteracyjnym pogłębianiem okazała się lepsza, dzięki niej powstało więcej odcięć w trakcie działania alfa-bety. Wygrana z komputerem nie sprawia większych trudności, wystarczy stawiać pionki tak, aby miały wspólnych 2 sąsiadów. Nie udało się dostosować funkcji oceny heurystycznej tak, aby wychwytywała takie sytuacje. W grze nie ma prawa wystąpić cykl. Remis ogłaszany jest jedynie w przypadku, gdy żaden z graczy nie będzie miał możliwości wygrania gry. Funkcja oceny z pewnością może zostać ulepszona. Szansą na jej poprawę mogłoby być znalezienie sposobu na wyeliminowanie przypadków gdy przeciwnik stawia pionki w sposób opisany powyżej. Można ograniczyć też randomizację jedynie do pierwszego wywołania algorytmu, kosztem jednak naturalnej gry algorytmu. Komputer grałby wtedy bardziej schematycznie. W trakcie wykonywania gry nie wystąpiły większe problemy natury implementacyjnej, wszystkie drobne błędy spowodowane były słabą znajomością języka C#.