Professional Documents
Culture Documents
heurystyki funkcji oceniających.
Michał Stanek
Data 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.
Stan początkowy
Operatory
Stany pośrednie
Stany końcowe
Rysunek 1: Drzewo gry
3. Algorytm MinMax
Jednym z większych osiągnięć w teorii gier było opracowanie algorytmu min
max[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
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].
start Nasz ruch
N1 N2 N3 Ruch przeciwnika
4 7 0 3 3 5 6 2 9 Nasz ruch
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.
4
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:
r i 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 (2)
n –całkowita ilość cech atomowych
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
{ }
(3)
val c p = 1, gdy r 1 p ∧ ∧ r l p = true
0, w przeciwnym razie
Możemy wówczas zdefiniować funkcję heurystyczną GLEM:
∑
n (4)
e p =g wi ⋅ val ci p
i=1
gdzie:
w1, ..., wn – wagi przypisane cechom
g: R > R jest rosnąca i różniczkowalna funkcją
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
n
2 (5)
E w=∑ o pi −e p i
i=1
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
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.
1 (6)
funckja : g x =
1 e −x
pochodna : g x 1−g x
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).
Vd
Głębokość d
S
N1 N2 N3
Głębokość h
4 7 0 3 3 5 6 2 9
Vh
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 , hd (7)
gdzie:
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
8
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):
v h − (8)
−1 p
gdzie:
– dystrybuanta zmiennej losowej o rozkładzie normalnym (0,1)
Natomiast hipoteza, że Vd ≤ α z prawdopodobieństwem przynajmniej p w.t.w, gdy:
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