Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

10

Click here to load reader

description

Dokument opisuje modyfikacje algorytmu alfa-beta obcięcia jak również możliwe modyfikacje i podejścia do funkcji oceniających.

Transcript of Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

Page 1: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

Programowanie gier, modyfikacje alfa­beta 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 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

Page 2: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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

Page 3: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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 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

Stan początkowy

Operatory

Stany pośrednie

Stany końcowe

Page 4: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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]. 

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

start

N1 N2 N3

4 7 0 3 3 5 6 2 9

Nasz ruch

Ruch przeciwnika

Nasz ruch

Page 5: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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

Page 6: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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

Page 7: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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 – i­ta pozycja treningowa,

          o(pi) – ocena i­tej pozycji treningowej,

          e(pi) – wartość funkcji GLEM dla i­tej 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

Page 8: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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). 

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

Page 9: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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

Page 10: Programowanie gier, modyfikacje alfa-beta obcięcia oraz heurystyki funkcji oceniających

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