Qyshinsu

Transkrypt

Qyshinsu
Kierunek:
Informatyka
Przedmiot: Sztuczna Inteligencja
Sprawozdanie
Qyshinsu
Mystery of the Way
Zespół:
Ewelina Witanowska, I6, 84904
([email protected])
Joachim Szada-Borzyszkowski, I6, 84883
([email protected])
Czas realizacji projektu: Luty 2009
Zaliczenie projektu: Marzec 2009
–2–
Wstęp
Qyshinsu nie posiada wielkiej historii, czy tradycji. Jest to mało znana gra, przede wszystkim
dlatego, że jej idea powstała ledwo kilka lat temu. Sama gra została wynaleziona przez
Rodneya A. Fredericksona.
Już od początku tworzenia tej gry można przekonad się o jej możliwościach, którymi zaskakuje
wobec pierwszego, niepozornego wrażenia. Posiada prostą planszę z niewielką ilością pól, po kilka
rodzajów kamieni i kilka prostych reguł definiujących dozwolone ruchy. A jednak w tych krótkich
regułach tkwi potęga tej gry.
Zasady gry
Plansza
Zbudowana na planie koła plansza składa się z 12 ułożonych obok siebie pól dzielących ją wzdłuż
promieni okręgu, co obrazuje ilustracja poniżej. Inna reprezentacja planszy to 12 pól
umieszczonych regularnie na okręgu (pierścieniu). Zamknięcie pól w pojedynczy okrąg (pierścieo)
prowadzi do wyrównania znaczenia wszystkich pól – nie ma tu pól początkowych, koocowych,
brzegowych, narożnych. Z punktu widzenia planszy każde pole jest równoważne i sąsiaduje z 2
innymi, przez co nie istnieje podział ruchów wg typu pola, na którym są one wykonywane,
co może mied miejsce np. w grach o planszach opartych o szachownicę.
Rysunek 1: Przykładowa plansza do Qyshinsu (jedna z graficznych reprezentacji)
–3–
Pionki (kamienie)
Każdy z graczy ma do dyspozycji 12 pionków: po 2 sztuki z 6 rodzajów. Poszczególne kamienie
posiadają oznaczenia wartościowe, których znaczenie zostanie wyjaśnione dalej. Nieoznaczony
kamieo jest najczęściej określany jako „stary kamieo” (ang. Old Stone). Pozostałe – są opisane
zgodnie z oznaczeniem wartościowym jako: kamieo-1, kamieo2, …
Rysunek 2: Kamienie Qyshinsu (jedna z przykładowych realizacji)
Rozgrywka
Gra rozpoczyna się od położenia dowolnego kamienia przez pierwszego gracza na dowolnym
miejscu początkowo pustej planszy. Kolejne ruchy są determinowane ilościami poszczególnych
rodzajów kamieni na planszy, jak i poprzedzającymi ruchami przeciwnika.
Ruchem w grze jest położenie kamienia na pustym polu lub zdjęcie własnego kamienia z pola
planszy. Podstawowe zasady dotyczące ruchów:
Jeżeli przeciwnik w ostatnim ruchu położył lub zdjął któryś z numerowanych kamieni – zgodnie z
wartością kamienia-n) mamy prawo położyd lub zdjąd własny kamieo w odległości n pól od
ostatnio ruszanego przez przeciwnika kamienia.
Jeżeli w ostatnim ruchu przeciwnik położył „stary kamieo” na danym polu, to w obecnym ruchu
gracz musi położyd dowolny kamieo na najbliższym wolnym polu.
Jeżeli ostatni ruch przeciwnika polegał na zdjęciu „starego kamienia” – gracz zmuszony jest zdjąd
swój najbliższy kamieo.
Celem gry jest uniemożliwienie przeciwnikowi wykonania kolejnego ruchu. W praktyce sprowadza
się to do stworzenia blokady (pola wskazywane przez ostatni ruch przeciwnika są przez niego
zajęte) bądź doprowadzenie do sytuacji albo położenia „starego kamienia” i zarazem zapełnienia
planszy (nie pozostawienie żadnego wolnego pola) lub też zdjęcia „starego kamienia” z planszy,
gdy nie znajdują się na niej żadne kamienie przeciwnika (brak możliwości zdjęcia kamienia).
Pozostałe reguły
1) Możliwe jest wykonanie ruchów wyłącznie własnymi kamieniami, a więc tylko na polach
pustych lub zajętych przez własne kamienie (oczywiście przy zachowaniu zasady ruchu na
polach wyznaczonych przez przeciwnika).
–4–
2) Na planszy mogą leżed maksymalnie po 2 kamienia danego rodzaju (niezależnie od
koloru). Stąd każdy gracz posiada po 2 kamienie każdego rodzaju – z zasady wynika, że na
planszy mogą leżed maksymalnie 2 kamienie 1 gracza lub po jednym kamieniu każdego z
graczy.
3) Nie jest możliwe położenie danego kamienia na polu, z którego zdjęło się go w
poprzednim swoim ruchu. Ostatnie ograniczenie ma na celu wyeliminowanie pętli
polegających na sytuacji naprzemiennego dokładania i zdejmowania tych samych kamieni
na tych samych polach przez obu graczy, którzy sądziliby, że takie ruchy są
najoptymalniejsze, mimo, że w ogólności co każde 4 ruchy następowałby powrót do
powtarzającej się w nieskooczonośd patowej sytuacji (remisy w tej grze nie istnieją –
rozgrywka przeciąga się aż do zablokowania jednego gracza przez drugiego).
Dzięki temu problem cykli w grafie ruchów jest praktycznie wyeliminowany.
Implementacja
Stan gry i ruch
Ruch w grze jest odwzorowany przez obiekt klasy Ruch, zawierający zakodowanego liczbowo
gracza (w postaci ±1), rodzaj ruchu (1 dla kładzenia, 0 dla zdejmowania), rodzaju kamienia
(wg wartości (1..6, stary kamieo to właśnie wartośd 6) i miejsca jako indeksu tablicy pól.
Stan planszy w pamięci reprezentowany był przez obiekt klasy Plansza, który przechowuje stan pól
jako 12-elemwntową tablicę intów. Dwa ostatnio wykonane ruchy są pamiętane jako obiekty klasy
Ruch wkomponowane jako pola Planszy. Dodatkowo Plansza przechowuje również szereg pól
pomocniczych (m.in. wektor dostępności pól w ruchu, wektor semaforów ilości kamieni wg
rodzajów) ułatwiających ocenę stanu, jednak ich zawartośd zależy od stanu tablicy pól i ostatniego
ruchu.
Elementy tablicy pól Planszy przyjmują wartości z zakresu <-6; +6> - zgodnie z wartością leżących
na polach kamieni i stroną gracza (max – wartości dodatnie, min – ujemne); pola puste mają
wartośd 0 jako neutralną.
Każdy ruch przed jego wykonaniem (zapisem do tablicy pól planszy i aktualizacją pamięci ostatnich
ruchów) jest sprawdzany pod kątem dopuszczalności pól (tablica wartości boolowskich),
dopuszczalności kamieni (tablica samaforów) i poprawności (zgodnośd z 3 zasadami).
W momencie wykonania sprawdzonego już ruchu dokonywana jest aktualizacja tablicy pól zgodna
z tym ruchem, a następnie następuje przesunięcie w pamięci ostatnich ruchów (wcześniejszyRuch
= ostatniRuch; ostatniRuch = wykonywany).
Po wykonaniu ruchu są aktualizowane pomocnicze pola.
–5–
Przedstawiona obok plansza jest
reprezentowana przez tablicę pól:
[ 0, 1, -2, 0, 0, 2, 0, 0, 0, 0, 0, 0 ]
oraz 2 ostatnie ruchy:
ostatniRuch{kto=1, ruch=0, co=1, gdzie=4}
wczesniejszyRuch { kto=-1, ruch=0, co=6,
gdzie=3}.
OstatniRuch.kto == +1, więc ruch należy do
czerwonych.
Po wykonaniu ostatniego ruchu czarnych
tablica dostępnych pól wskazuje tylko na pole 3
(pole 5 jest zajęte przez czarnego) – pierwsza
zasada.
Rysunek 3: Przykładowa plansza w trakcie gry
Ponieważ już lezą 2 kamienie o wartości 2, tablica ilości możliwych kamieni dostępnych do
położenia wskazuje 0 dla indeksu 2 –druga zasada.
Czerwone nie mogą też położyd starego kamienia na polu 3, ponieważ w ostatnim ruchu zdjęły go
stamtąd (wczesniejszyRuch.co == 6, wczesniejszyRuch.gdzie == 3, wczesniejszyRuch.ruch = 0) –
zgodnie z zasadą trzecią.
Gracze
Gdy wykonywany jest ruch przez człowieka, odblokowywane są pola planszy i kamienie
(w przypadku kładzenia kamieni), o czym użytkownik jest informowany, co pozwala wczytad ruch
wykonany przez człowieka.
Natomiast każdy gracz komputerowy posiada własną metodę pozwalającą dla zadanej głębokości
przeszukiwad przestrzeo ruchów. Możliwe do wykonania ruchy są znajdywane poprzez
przeglądanie dostępnych pól – gdy dostępne pole jest puste – sprawdzane są ruchy polegające na
kładzeniu możliwych (zasada 2) kamieni, gdy pole jest zajęte przez gracza wykonującego ruch – na
tym polu możliwe jest jedynie zdjęcie tego kamienia.
W programie zostały umieszczone 4 algorytmy graczy komputerowych: przeglądanie pełnego
drzewa Min-Max (tylko dla celów porównawczych i wyznaczenia średniego branching factor dla
drzewa Qyshinsu), najprostsza implementacja Alfy-Bety, Alfa-Beta (fail-safe) i Alfa-Beta z tablicą
transpozycji. Zastosowanie tablicy historii ruchów nie miałoby tu sensu, ponieważ wartośd ruchu
silnie zależy tu od kontekstu, w jakim on występuje, dlatego informacja o ruchach bez informacji,
kiedy (również po jakim ruchu) zostały wykonane jest bezwartościowa.
Spośród wymienionych algorytmów najbardziej rozbudowana jest Alfa-Beta + TT, ponieważ
przeglądając kolejne możliwe do odwiedzenia stany, wybiera najlepsze możliwe rozwiązania,
które przechowuje w haszowanej tablicy o stałym czasie dostępu. Później te dane mogą zostad
wykorzystane, aby skrócid czas szukania optymalnego ruchu. W tej implementacji tablica
–6–
transpozycji przechowuje kontekst, w jakim został wykonany ruch (Stan planszy reprezentowany
jako obiekt) oraz wyznaczony wcześniej najlepszy ruch wraz z zaznaczeniem, na jakiej głębokości
występował (potrzebne do weryfikacji przydatności ruchu przy odczycie z TT).
Ocena stanu gry
Ocena dowolnego zadanego stanu gry opiera się o bilans różnicowy (zdarzenia/układy pozytywne
dla gracza Max są punktowane dodatnio, negatywne – ujemnie; dla gracza Min – analogicznie, ale
odwrotnie) Jest to suma kilku zliczeniowych ocen opartych o stan otoczenia wraz z przypisanymi
wagami.
Wybrane kryteria oceny stanu planszy:
 Stan terminalny – ±100 × głębokośd (głębokośd maleje wraz z kolejnymi rekurencyjnymi
wywołaniami, więc płytsze stany terminalne są bardziej preferowane)
 Możliwośd utworzenia blokady kamieniami numerowanymi – punktowane jest istnienie
pary kamieni gracza w parzystej odległości (warunek konieczny do stworzenia takiej
blokady)
dodatkowo punktowane są pozostałe elementy sprzyjające stworzeniu blokady, np. wolne
pole i możliwośd położenia kamienia wywołującego blokadę, czy leżący kamieo o
właściwej do blokady wartości (jego zdjęcie wywoła blokadę).
Ocena wg tego kryterium należy do zakresu <-45; +45> na dowolnej głębokości
 Możliwośd blokady poprzez położenie starego kamienia na ostatnim wolnym polu lub jego
zdjęcie w przypadku braku kamieni przeciwnika – ocena ±1 pkt.
Wyniki pomiarów
Aby mied możliwośd porównania jakości poszczególnych algorytmów, konieczne było
stwierdzenie, ile wierzchołków przeglądał każdy algorytm w każdym ruchu. Poniższa tabela
prezentuje średnie ilości przeglądanych wierzchołków w ruchu danego gracza. Wyniki są również
zilustrowane na wykresach na następnej stronie.
głęb. \ alg.
1
2
3
4
5
6
7
8
9
10
11
12
13
Min-Max
6
26
183
570
5 953
23 218
121 499
446 833
α-β
7
18
71
129
400
696
2 256
5 680
21 630
36 387
114 252
276 716
492 278
α-β + FS
7
17
54
148
385
1 147
2 380
3 252
9 538
26 910
79 303
202 551
450 637
α-β + TT
6
17
68
150
384
1 379
2 976
4 390
9 379
26 351
86 788
216 117
–7–
Wykres 1: przeglądane wierzchołki (w ruchu) w stosunku do głębokości przeglądania
500 000
400 000
300 000
200 000
100 000
0
0
2
4
6
8
10
12
14
4 000
3 000
2 000
1 000
0
0
1
2
MM
3
AB
4
FS
5
6
TT
Wykres 2: przeglądane wierzchołki (w ruchu) w stosunku do głębokości przeglądania (skala logarytmiczna)
100 000
10 000
1 000
100
10
1
0
2
4
6
8
10
12
14
1 000
100
10
1
0
1
2
MM
3
AB
4
FS
TT
5
6
–8–
Wnioski
Przestrzeń stanów
Maksymalny branching factor dla dowolnego stanu może wynosid maksymalnie 12 (oba pola
wolne, brak ograniczeo na kamienie). W praktyce średni branching factor dla Qyshinsu wynosi
ok. 6. Przestrzeo możliwych ruchów wykazuje tendencję spadkową, ponieważ już samym celem
gry jest zawężenie przestrzeni możliwych ruchów przeciwnika do 0 (całkowitego zablokowania
go), chociaż zdarzają się sytuacje powrotu do prawie stanu początkowego (wszystkie pola wolne
i 2 pola dostępne, zamiast wszystkich).
Dla małych instancji problemu (małe głębokości) działanie poszczególnych algorytmów
praktycznie się nie różniło, co więcej, rozbudowane algorytmy miały większą złożonośd
obliczeniową (dodatkowy nakład pracy poza podstawowe sprawdzanie), a zysk z ich stosowania
praktycznie nie istniał. Wraz ze wzrostem głębokości przeszukiwania widad coraz wyraźniej
przewagę zwłaszcza metody fail-soft i tablicy transpozycji (zmniejszenie il. ponownych przeglądao
poprzez wyeliminowanie większości ponownych odwiedzin stanów).
Jakościowo rozwiązania uzyskiwane prze różne algorytmy praktycznie nie różnią się, właściwie
jedyna różnica to czas uzyskiwania rozwiązania, przykładowo α-β + TT dla większych głębokości
potrzebuje sporego narzutu czasowego w pierwszych ruchach, a później głównie pogłębia
przeszukiwania i aktualizuje uzyskiwane wyniki.
Jakośd uzyskiwanych rozwiązao zależy przede wszystkim od doboru kryteriów i wag funkcji oceny
stanu. Drugim wyznacznikiem (chod już nie tak ważnym) jest głębokośd przeszukiwania, która
wyraża również precyzję wyboru ruchu poprzez ilośd stanów, do których można dotrzed
i porównad). Przy zastosowanym zestawie kryteriów wygranie z komputerem nie jest proste już
nawet przy stosunkowo małych głębokościach. Podobne porównanie dotyczące 2 realizacji tej gry
(2× komputer-człowiek i przekazywanie ruchów między programami) wykazało zbliżoną jakośd
wybieranych rozwiązao.

Podobne dokumenty