Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających
Click here to load reader
-
Upload
michal-stanek -
Category
Documents
-
view
1.516 -
download
2
description
Transcript of Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających
Programowanie gier, modyfikacje alfabeta obcięcia oraz heurystyki funkcji oceniających.
Michał StanekData seminarium: 8 listopad 2005
Data oddania dokumentu: 13 Grudzień 2005
Streszczenie
Dokument poświęcony jest zagadnieniom związanym z grami komputerowymi. Po krótkim wstępie podane są podstawowe definicje oraz koncepcja algorytmu minmax. Opisany jest również ogólny liniowy model oceniania GLEM oraz algorytmy ProbCut oraz Multi ProbCut.
1. Wstęp
Gwałtowny rozwój komputerów w drugiej połowie ubiegłego wieku przyczynił się do znacznego postępu zarówno w nauce jak i przemyśle. Dały one możliwość realizacji rzeczy które wcześniej można było analizować jedynie teoretycznie. W głowie nie jednego naukowca zrodziło się wówczas pytanie, czy maszyna będzie w stanie dorównać kiedyś możliwością człowieka?
Zaczęła rozwijać się dynamicznie dziedzina zwana sztuczną inteligencją. Zadawano sobie pytanie w jaki sposób mierzyć zdolności maszyny? Dylemat ten rozwiązał Alan Turing konstruując słynny test Turinga. Test ten odnosi się jednak tylko do zdolności językowych. Sam Alan Turing a nawet Shannon rozważał rozszerzenie tego testu o przeprowadzenie rozgrywki w szachy, od wieków bowiem gra ta była uznawana za królową wszystkich gier. Turing stwierdził nawet w jednej ze swoich wypowiedzi z 1951 roku, że nikt nie jest w stanie napisać programu, który gra lepiej od niego samego. Mimo niezaprzeczalnie wielkiego geniuszu w tej kwestii się pomylił.
Mimo że nie ujęta w teście Turinga gra w szachy przez wielu uważana była za wyznacznik zdolności maszyny do myślenia. Określała granicę pomiędzy możliwościami ludzkiego umysłu a maszyną. Ostatecznie po 45 latach prób, zaczynając od roku 1952, kiedy to powstał pierwszy program A. Sammuela, maszyna pokonała szachowego mistrza świata.
Nie tylko szachy wzbudzały zainteresowanie uczonych. Badania i eksperymenty prowadzone były dla bardzo wielu popularnych gier, wśród nich othello, go warcaby. W wielu z nich ostateczny sukces, to znaczy zwycięstwo nad człowiekiem został osiągnięty dużo wcześniej niż w szachach. Przykładowo problem gry w warcaby uważa się obecnie za praktycznie rozstrzygnięty. Oznacza to, że w zdecydowanej większości przypadków jesteśmy w stanie określić wynik gry już po wykonaniu kilku pierwszych ruchów.
1
2. Gra, strategia i drzewo gry
Według definicji Von Noumana i Morgensterna gra to składa się z zestawu reguł określających możliwości wyboru postępowania jednostek znajdujących się w sytuacji określanej mianem konfliktu interesów. Każda z tych jednostek stara się maksymalizować swój własny zysk i jednocześnie zminimalizować zysk pozostałych graczy. Reguły gry określają też ilość informacji dostępną każdemu z graczy oraz wysokość wygranych i przegranych. [KWA04]
W ogólności grę można rozumieć jako rozgrywkę prowadzoną przez gracza lub graczy, zgodnie z ustalonymi zasadami gry, w celu osiągnięcia ściśle zdefiniowanego celu.
Należałoby również zdefiniować pojęcie równie ważne strategia gry, pod którym rozumieć będziemy kompletny zbiór zasad, które determinują posunięcia gracza, wybierane zależnie od sytuacji powstających podczas gry.
Gry można podzielić również na kilka kategorii w zależności od charakterystycznych cech.
Ze względu na ilość graczy:
• Gry bezosobowe (np. Gra w życie)
• Gry jednoosobowe (puzzle, pasjans)
• Gry dwuosobowe (szachy, warcaby, otello, go)
• Gry wieloosobowe (poker, brydż)
Wygrana i przegrana:
• Gry o sumie zerowej (wygrana jednego gracza oznacza przegraną drugiego gracza) – szachy, warcaby, otello
• Gry o sumie nie zerowej – np. Dylemat więźnia
Współpraca graczy:
• Kooperacyjne (gracze współpracują ze sobą)
• Niekooperacyjne (gracze nie współpracują ze sobą)
Występowanie w grze elementu losowości:
• Całkowicie losowe (ruletka)
• Częściowo losowe (brydż i inne gry karciane)
• Całkowicie deterministyczne (warcaby, szachy, otello, go)
To czym jest gra można wyrazić również pewnym równaniem:
Gra = cel + stan początkowy + operatory
2
Gdzie pod pojęciem operatora rozumieć możemy stosowanie reguł gry. Działanie operatora nie musi być deterministyczne – może go określać np. rozkład zmiennej losowej, w grach częściowo losowych takich np. brydż. Każdy operator może posiadać również koszt związany z jego zastosowaniem. Należy podkreślić, że w grze dwuosobowej mamy wpływ na wybór tylko połowy operatorów.
Rozpoczęcie gry ze stanu początkowego, a następnie stosowanie możliwych operatorów prowadzi do zbudowania tak zwanego drzewa gry, którego reprezentacja przedstawiona jest na rysunku 1.
Rysunek 1: Drzewo gry
3. Algorytm MinMax
Jednym z większych osiągnięć w teorii gier było opracowanie algorytmu minmax[KNU75]. Zasada jego działania opiera się na prostym spostrzeżeniu, że podczas gry każda ze stron stara się maksymalizować swoje zyski, przy jednoczesnej minimalizacji zysków przeciwnika1(podejście takie można zauważyć już w definicji Von Noumana i Morgensterna).
Zakładając że możemy oszacować stan gry w każdym momencie z dość dużym przybliżeniem, jesteśmy w stanie przewidzieć, które ruchy przybliżą nas do wygranej, a które nie. Oczywiście im głębiej będziemy analizować drzewo gry, tym lepiej można wybrać operatory, które prowadzą nas do wygranej. W ekstremalnym przypadku, gdy jesteśmy w stanie rozwinąć całe drzewo gry jednoznacznie możemy wybrać posunięcia prowadzące nas do wygranej. Algorytm minmax został opracowany i opublikowany przez Knutha i Moore'a w 1975 r. Stanowi on fundament działania wielu innych algorytmów. Ilustracja działania algorytmu minmax przedstawiona jest na rysunku 2.
Na jakość gry przy wykorzystaniu algorytmu minmax wpływają z jednej strony głębokość przeszukiwania z drugiej jakość funkcji heurystycznej. Nie da się osiągnąć zadowalających wyników jeżeli którykolwiek z tych elementów jest źle dobrany.
Algorytm minmax przyczynił się do powstania algorytmu alfabeta obcięcia, którego
1 Podejście takie jest prawidłowe w grach o sumie zerowej.
3
Stan początkowy
Operatory
Stany pośrednie
Stany końcowe
działanie polega na ograniczeniu ilości rozwijanych wierzchołków drzewa gry. Dokładne opisy algorytmu AlfaBeta obcięcia można znaleźć w pracy [KWA04].
Rysunek 2: Ilustracja działania algorytmu minmax
4. Konstrukcja funkcji heurystycznej
Jak wspomniano we wcześniejszym rozdziale na jakość działania algorytmy alfabeta obcięcia zasadniczy wpływ ma stworzenie odpowiedniej funkcji oceniającej. Funkcja oceniająca jest funkcją heurystyczną2, to znaczy konstruowaną w założeniu, że pewne stany gry są lepsze lub gorsze od innych. Funkcja heurystyczna zazwyczaj przyjmuje postać wielomianu postaci:
F(s) = w1 * x1 + ... + wn * xn, (1)
gdzie:
• s to pewien stan gry, który chcemy ocenić,
• x1 do xn to pewne cechy (np. ilość pionków na planszy, zajmowanie pewnych pól szachownicy),
• w1 do wn są wagami z jakimi brana jest pod uwagę wartość pewnej cechy.
Konstrukcja funkcji heurystycznej, to znaczy dobór odpowiednich parametrów oraz ich wag, zależy zazwyczaj od projektanta (programisty). Z jednej strony podejście takie jest dobre, ponieważ pozwala podzielić problem na dwa mniejsze:
• wyboru cech branych pod uwagę,
• doboru wagi każdej z wcześniej wybranych cech.
2 Heurystyka to każdy taki sposób postępowania, w którym po dokonaniu obserwacji dostrzegamy zależności między obserwacjami i na ich podstawie konstruujemy hipotezy pomagające nam w zrozumieniu pewnego zjawiska.
4
start
N1 N2 N3
4 7 0 3 3 5 6 2 9
Nasz ruch
Ruch przeciwnika
Nasz ruch
Z drugiej natomiast pozostawia pewien element subiektywności osobie, która konstruuje taką funkcję.
5. GLEM – ogólny liniowy model oceniania
W odpowiedzi na problemy związane z konstrukcją heurystycznych funkcji oceniających powstał GLEM (Generalized Linear Evaluation Model). Ideą jaka przyświecała jego powstaniu była chęć stworzenia standardowego sposobu rozwiązywania klasy problemów cechujących się tym, że funkcję heurystyczną można przedstawić jako kombinację liniową dostatecznej ilości cech [BURO02]. GLEM nie zwalnia nas co prawda z obowiązku wyboru cech podstawowych, przez autorów artykułu nazwanych atomowymi. Nadal zmuszeni jesteśmy określić jakie elementy mają być brane pod uwagę. Przez cechy atomowe rozumiemy tutaj na przykład cechy takie jak obecność konkretnego pionka na konkretnym polu planszy, posiadanie konkretnej karty itp. Resztę parametrów to znaczy wartości wag z jakimi cechy te będą brane pod uwagę dobierane są przez algorytm automatycznie na podstawie dostarczonych przykładów uczących.
Można wprowadzić pewne oznaczenia:
p⊂P oznacza, że p jest stanem gry i zawiera się w zbiorze wszystkich dopuszczalnych stanów.
ri p ma wartość prawda kiedy spełniona jest pewna cecha atomowa ri dla pewnego konkretnego stanu p
Występowanie cechy atomowej jest wartością logiczną to znaczy, że jesteśmy w stanie jednoznacznie stwierdzić, czy dana cecha jest obecna w danym stanie czy też nie. Koniunkcja cech atomowych stanowi konfiguracje. W skrócie konfiguracja może opisywać pewną konkretną sytuację na planszy i oznaczana jest przez c:
c p = r 1 p ∧ r 2 p ∧∧ r l p ; l≤n n –całkowita ilość cech atomowych
(2)
Mówimy, że konfiguracja jest spełniona dla pewnego konkretnego stanu p, jeżeli w stanie tym występują (są prawdziwe) wszystkie cechy atomowe występujące w definicji tej konfiguracji. Przykłady konfiguracji dla gry Othello znajdują się na rysunku 3.
Rysunek 3: Przykładowe konfiguracje [BURO97]
Wprowadźmy również funkcję pomocniczą val(c(p)) zdefiniowaną następująco:
5
val c p = {1, gdyr1 p ∧∧ r l p = true0, w przeciwnymrazie } (3)
Możemy wówczas zdefiniować funkcję heurystyczną GLEM:
e p =g∑i=1
n
wi⋅val ci p gdzie:
w1, ..., wn – wagi przypisane cechom
g: R > R jest rosnąca i różniczkowalna funkcją
(4)
Interpretacja funkcji GLEM może być następująca. Każda konfiguracja, czyli np. konkretna pozycja pionków na planszy, posiada swoją wagę. Ocena konkretnego stanu gry jest sumą wag tych konfiguracji, które są w danym stanie spełnione.
Oczywiście musimy odpowiedzieć sobie na pytanie skąd wziąć poszczególne konfiguracje. Autorzy GLEM [BUR02] piszą, że mogą one zostać wykryte automatycznie na podstawie odpowiedniej ilości przykładów uczących.
Ogólny algorytm generowania zbioru konfiguracji mógłby wyglądać następująco:
Wejście:
• zbiór cech atomowych ( A ),
• zbiór przykładów treningowych ( E ),
• minimalna liczba wystąpień konfiguracji w zbiorze testowym ( n )
Wyjście:
• konfiguracje na zbiorze A, które są aktywne przynajmniej n razy
Algorytm:
1. Stwórz zbiór poprawnych konfiguracji ( M ) i zainicjuj go wartościami ze zbioru A.
2. Weź kolejne elementy m ze zbioru M.
3. Dla każdego elementu m stwórz jego koniunkcję z elementem a ze zbioru A. Powstanie w ten sposób zbiór nowych konfiguracji T.
4. Dla każdego elementu t ze zbioru T sprawdź (każdej nowej konfiguracji), czy jest on aktywny przynajmniej n razy na zbiorze przykładów treningowych E.
5. Jeżeli element t jest aktywny przynajmniej n razy to dodaj go do wynikowego zbioru m i do punktu 2 jeżeli zostały jakieś konfiguracje do specjalizacji.
6
W wyniku działania algorytmu dostajemy zbiór takich konfiguracji, które są aktywne (spełnione) przynajmniej n razy na zbiorze przykładów treningowych jakim dysponujemy. Jednocześnie parametr n pozwala nam sterować stopniem ogólności (szczegółowości) generowanych rozwiązań. Dobór przykładów uczących w tym momencie jest niezmiernie istotny ze względu na to aby można było wykryć i uwzględnić również sytuacje nietypowe.
Aby wyznaczyć wartości poszczególnych wag dla każdej z wcześniej wyznaczonych konfiguracji musimy przeprowadzić minimalizację błędu kwadratowego. Błąd ten stanowi różnicę jaką uzyskujemy dla konkretnego stany przy obliczeniu wartości funkcji GLEM dla aktualnych wartości wag, a oceną stanu z przykładów treningowych. Należy tutaj zauważyć, że oceny tych samych stanów z wielu różnych partii muszą mieć ta samą wartość. Wartość błędu liczona jest ze wzoru
E w=∑i=1
n
o pi−e p i 2
gdzie:
n – ilość ocenionych pozycji treningowych,
pi – ita pozycja treningowa,
o(pi) – ocena itej pozycji treningowej,
e(pi) – wartość funkcji GLEM dla itej pozycji treningowej
(5)
Gdy dysponujemy już zbiorem konfiguracji kolejnym etapem jest dobór funkcji przejścia g. Funkcja ta musi być różniczkowalna w całej swojej dziedzinie, ze względu na to iż modyfikacja wag następuje w kierunku przeciwnym do gradientu łącznego błędu po poszczególnych wagach (wzór 5).
Oczywiście dobór tej funkcji powinien zależeć od natury problemu. W znakomitej większości przypadków zastosowanie funkcji (6) jest jednak wystarczające.
funckja : g x =1
1 e−x
pochodna: gx 1−gx
(6)
Podsumowując cechy GLEMa należy zwrócić uwagę na to, że cechy atomowe są bloczkami za pomocą których można budować bardziej skomplikowane wyrażenia. Umożliwia nam to tworzenie nowych cech przez rekombinacje starych i uzyskanie nieliniowych efektów.
Proces obliczeniowy jest prosty, wystarczy policzyć kombinację liniową argumentów. Nie jest nawet wymagane mnożenie ze względu na binarny charakter funkcji val (3).
Oczywiście wiadomo, że zastosowanie tej samej strategii dla wszystkich faz gry nie
7
jest optymalnym rozwiązaniem. Innymi zasadami należy kierować cię rozpoczynając grę w szachy, a innymi kończąc rozgrywkę. Podobnie autorzy algorytmu GLEM sugerują podział rozgrywki na kilka lub nawet kilkanaście faz, z których w każdej wartości wag oraz rozważane konfiguracje mogłyby być różne. Przykładowo program do gry w Othello o nazwie Logistello wyróżnia 13 różnych faz w czasie gry.
6. ProbCut i MultiProbCut
Algorytm minmax[KNU75] pomimo wielu zalet posiada też zasadniczą wadę, jaką jest konieczność rozwijania i badania dość dużej ilości stanów. Można byłoby uzyskać znaczny wzrost prędkości działania algorytmu minmax, jeżeli na pewnym poziomie analizy drzewa gry bylibyśmy w stanie oszacować wartość liścia. Autorzy algorytmu ProbCut[BUR02] postawili sobie identyczne pytanie, a wyniki ich badań dały zaskakujące rezultaty. Okazuje się, że wartości na poszczególnych głębokościach w drzewie gry są bardzo mocno ze sobą skorelowane (rysunek 4).
Rysunek 4: Szacowanie wartości liścia na podstawie wartości rodzica
Oznacza to tyle, że możliwe jest oszacowanie wartości stanu na poziomie h, będąc już na pewnym poziomie d (h > d). Wartość wierzchołka na poziomie h można wówczas przedstawić za pomocą poniższej zależności (7):
V h = aV d b e , hdgdzie:
Vh – ocena wierzchołka na poziomie h
Vd – ocena wierzchołka na poziomie d
a, b – współczynniki
e – zmienna losowa o rozkładzie normalnym, wartości oczekiwanej
0 i wariancji σ2
(7)
8
Vd
Vh
S
N1 N2 N3
4 7 0 3 3 5 6 2 9
Głębokość d
Głębokość h
Parametry d i h należy ustalić z góry natomiast wartości współczynników a i b dobierane są za pomocą metody regresji liniowej zastosowanej dla wystarczająco dużego zbioru przykładów uczących w postaci (Vd(pi), Vh(pi)), gdzie pi – jest konkretnym stanem gry.
Po dobraniu parametrów a i b możemy zbadać hipotezę Vd ≥ . β Jest ona prawdziwa z prawdopodobieństwem równym przynajmniej p wtedy i tylko wtedy, gdy prawdziwe jest (8):
vh−
−1 p
gdzie:
– dystrybuanta zmiennej losowej o rozkładzie normalnym (0,1)
(8)
Korzystając ze wzoru 7 oraz 8 otrzymujemy zależność, że hipoteza Vd ≥ zβ prawdopodobieństwem przynajmniej p w.t.w, gdy:
V d −1 p−b
a
(9)
Natomiast hipoteza, że Vd ≤ α z prawdopodobieństwem przynajmniej p w.t.w, gdy:
V d −1 p−b
a
(10)
ProbCut mimo wielu zalet posiada też wady. Jednym z największych jest to, że gdy ten statystyczny test nie powiedzie się rozwijane jest drzewo gry, aż do głębokości h. Właśnie z tego względu powstała ulepszona wersja tego algorytmu o nazwie Multi ProbCut [BUR97].
W Multi ProbCut wykorzystane jest spostrzeżenie, że pomimo iż test statystyczny nie powiedzie się na poziomie d, jest duże prawdopodobieństwo, że istnieje poziom k, taki, że d < k < h, który stanowi dostatecznie dobrą estymację wartości na poziomie h. Algorytm ten zakłada więc, że na danym poziomie drzewa sprawdzić można wiele potencjalnych estymatorów. W odróżnieniu również od ProbCut, Multi ProbCut zakłada, że parametr p może się zmieniać w czasie. Odpowiadałoby to zmianom np. w poszczególnych fazach gry.
7. Podsumowanie
Gry komputerowe stanowią fantastyczny “poligon” dla testowania nowych pomysłów i algorytmów. Wszędzie tam, gdzie standardowe metody przeszukiwania przestrzeni stanów okazują sie nie wystarczające można szukać pewnych zależności i konstruować pewne heurystyki pozwalające nam przyspieszyć wykonywanie obliczeń,
9
a tym samym uzyskiwać coraz lepsze wyniki. To właśnie przyświecało twórcom algorytmów GLEM, ProbCat oraz MultiProbCat.
Literatura:[KWA04] Kwaśnicka H., Spirydowicz A., „Uczący się komputer. Programowanie gier logicznych”.
[KNU75] Knuth D.E., Moore R.W., „An analysis of AlphaBeta Prunning”
[BUR02] Buro M., „ProbCut: an effective selective extension of the AlphaBeta Algorithm”
[BUR97]Buro M., „Experiments with MultiProbCut and a New HighQuality Evaluation Function for Othello. Workshop on on Game – Tree Search”
10