You are on page 1of 10

Programowanie gier, modyfikacje alfa­beta obcięcia oraz 

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 min­max. 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 Min­Max
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   min­max   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   min­max 
przedstawiona jest na rysunku 2. 
Na   jakość   gry   przy   wykorzystaniu   algorytmu   min­max   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 min­max przyczynił się do powstania algorytmu alfa­beta 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 Alfa­Beta 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 min­max

4. Konstrukcja funkcji heurystycznej
Jak wspomniano we wcześniejszym rozdziale na jakość działania algorytmy alfa­beta 
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
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. 

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 – i­ta pozycja treningowa,
          o(pi) – ocena i­tej pozycji treningowej,
          e(pi) – wartość funkcji GLEM dla i­tej 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 

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 min­max[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 min­max, 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 , hd (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)

Korzystając   ze   wzoru   7   oraz   8   otrzymujemy   zależność,   że   hipoteza     Vd  ≥   β   z 


prawdopodobieństwem przynajmniej p w.t.w, gdy:

−1  p−b (9)


Vd 
a

Natomiast hipoteza, że Vd ≤ α z prawdopodobieństwem przynajmniej p w.t.w, gdy:

−1  p−b (10)


Vd 
a

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 Alpha­Beta Prunning”
[BUR02]   Buro   M.,   „ProbCut:   an   effective   selective   extension   of   the   Alpha­Beta 
Algorithm”
[BUR97]Buro   M.,   „Experiments   with   Multi­Prob­Cut   and   a   New   High­Quality 
Evaluation Function for Othello. Workshop on on Game – Tree Search”

10

You might also like