Go-Moku  i  Threat-Space Search

 

Na podstawie opracowania:

Go-Moku and Threat-Space Search

L.V. Allis, H. J. van den Herik, M. P. H. Huntjens

 

 

Cel gry Go-Moku

 

W grze bierze udział dwóch graczy. Jeden dysponuje pionkami białymi a drugi czarnymi. Umawiamy się, że czarny kolor zaczyna rozgrywkę. Na planszy 15x15 pól (najczęściej pola to przecięcia 15 pionowych i 15 poziomych linii) należy ułożyć 5 swoich pionków obok siebie w jednej linii. Linia może być pozioma, pionowa lub ukośna.

Rysunek 1.  Wygrana grającego czarnymi pionami przez ukośną linię pięciu pionków.

 

 Jeśli żadnemu z graczy nie uda się ułożyć współliniowej piątki pionków swojego koloru i plansza będzie całkowicie zapełniona, gra kończy się remisem. 

 

Inne warianty gry

 

A.  Plansza 19x19 (to jeszcze zwiększa przewagę czarnego koloru)

B.  Tylko ciąg dokładnie pięciu pionów wygrywa, linie złożone z 6 lub więcej nie wygrywają (popularna wersja Go-Moku)

C.  Czarny kolor ma narzucone ograniczenie na drugi ruch: nie może postawić pionka w kwadracie o boku 5, którego środkiem jest pierwszy czarny pionek (redukuje przewagę czarnego koloru, ale nie likwiduje jej całkowicie).

D.  Renju – profesjonalny wariant

      biały kolor nie ma żadnych ograniczeń

      czarny nie może utworzyć linii dłuższej niż 5, a także dwóch trójek lub dwóch czwórek, gdyż jeśli to zrobi uznaje się go za przegranego w grze

(to również niweluje przewagę czarnego koloru ale nadal wygląda na to, że jest to kolor uprzywilejowany, powoduje to również konieczność stosowania różnych strategii gry w zależności od koloru gracza)

E.   Renju z możliwością zamiany koloru przez białego gracza – polega to na tym, że po pierwszym ruchu czarnego koloru koniecznie w środku planszy, biały musi postawić swojego pionka na jednym z ośmiu sąsiednich pól, gracz czarny wykonuje drugi ruch a następnie biały przed swoim drugim ruchem decyduje czy chce pozostać przy swoim kolorze czy zamienić się kolorami z czarnym graczem. Prowadzi to do tego, że w optymalnej sytuacji czarny tak postawi drugiego pionka, żeby teoretycznym wynikiem gry był remis.

 

 

Wprowadzenie

 

Przez dziesięciolecia japońscy mistrzowie gry Go-Moku byli przekonani, że zaczynający gracz ma pewną wygraną.

Jednak nie było to wcześniej udowodnione matematycznie ani też żaden program komputerowy nie okazał się niepokonany kiedy grał czarnymi pionkami.

Zauważono dużą rozbieżność między sposobem w jaki aktualną sytuację na planszy analizują najlepsi gracze i jak wybierają kolejny ruch, a tym jak robią to algorytmy przeszukiwania stosowane powszechnie w grach. Stąd postanowiono przyjrzeć się bliżej grze Go-Moku i spróbować znaleźć lepsze techniki przeszukiwania.

 

Definicje 

Do dalszego rozpatrywania problemu potrzebne będą następujące definicje:

 

 Threat – zagrożenie, groźba, (tu: szach) będziemy rozumieć jako sytuację, w której przeciwnik jest zmuszony do wykonania ruchu z pewnego małego zbioru ruchów (jeśli nie chce przegrać od razu). Główne typy zagrożeń mają swoje nazwy (rozpatrujemy z pozycji koloru czarnego):

a)   four - czwórka – jest zdefiniowana jako linia pięciu pól, z których gracz atakujący ma zajęte dowolne cztery a piąte pole jest wolne

b)  straight four  - czwórka w linii – to sekwencja czterech pionków gracza atakującego ograniczona z obu końców przez wolne pola

c)   three – trójka – linia siedmiu pól, z których trzy środkowe są zajęte przez atakującego a pozostałe wolne

d)  three – trójka - linia sześciu pól, z których trzy z czterech środkowych są zajęte przez gracza atakującego a trzy pozostałe są wolne

e)   broken three – rozbita trójka – linia sześciu pól, z których trzy (nie tworzące sekwencji) z czterech wewnętrznych są zajęte przez atakującego, a pozostałe są wolne

 

Rysunek 2. Rodzaje zagrożeń.

 

Jeśli gracz tworzy czwórkę (przypadek a) to zagraża wygraną w następnym ruchu. Dlatego ruch ten musi zostać odparowany natychmiast przez drugiego gracza.

Jeśli tworzona jest czwórka w linii (przypadek b) oznacza to przegraną dla gracza broniącego, gdyż na obronę jest już za późno.

Jeśli gracz ustawi trójkę stwarza zagrożenie utworzenia czwórki w linii w następnym ruchu. Dlatego mimo tego, że zagrożenie rozkłada się na dwa ruchy musi zostać odparowane przez gracza broniącego już w tym posunięciu. Jeśli mamy do czynienia z przypadkiem trójki bez ograniczeń (przypadek c) z obu stron, są dwa ruchy obronne. Jeśli z trójką nieograniczoną z jednej strony (przypadek d) wtedy broniący może wykonać jeden z trzech ruchów.

W przypadku rozbitej trójki również gracz broniący musi wybrać w kolejnym posunięciu jeden z trzech ruchów (przypadek e).

 

Aby WYGRAĆ gracz musi doprowadzić do podwójnego zagrożenia:

·       przez czwórkę w linii

·       przez dwa rozłączne zagrożenia

Wtedy gracz broniący nie może obu naraz odparować i przegrywa.

 

Sekwencja zagrożeń (threat sequence) w większości przypadków występuje jako seria ruchów, z których każdy kolejny jest zagrożeniem i powoduje konieczność odparowania ataku przez gracza broniącego, przed wystąpieniem podwójnego zagrożenia (double threat). Gracz broniący ma bardzo ograniczone możliwości wyboru pola na kolejny ruch (jedynie pola, które odparują zagrożenie).

Sekwencję prowadzącą do wygranej (do podwójnego zagrożenia) nazywamy sekwencją zwycięstwa.

 

Przykładowe sekwencje:

 

Rysunek 3. Przykładowa rozgrywka.

 

Na rysunku 3 przedstawiona jest przykładowa sekwencja zagrożeń dzięki której kolor czarny wygrywa. Składa się ona z zagrożeń tylko typu czwórka. W związku z tym, że odpowiedź na tego typu zagrożenie jest tylko jedna cała sekwencja ruchów białego koloru jest wymuszona i jednoznacznie wyznaczona.

 

Rysunek 4. Przykładowa rozgrywka.

 

Na rysunku 4 jest pokazany przykład rozgrywki, w której zwycięstwo dla czarnego koloru jest osiągnięte przez sekwencję dwóch trójek.

W międzyczasie pojawiają się dwie czwórki ze strony białego koloru. Mimo tego jego przegrana jest nieunikniona (jest jedynie trochę odwleczona w czasie).

W tym przypadku jednak dokładna sekwencja zwycięstwa dla czarnego koloru jest zależna od reakcji przeciwnika na dwie trójki. W takich przypadkach będziemy stosować termin drzewo zwycięstwa. W praktyce w sekwencji zwycięstwa takie czwórki ze strony przeciwnika są pomijane.

 

Analiza mistrzów Go-Moku

 

Podczas obserwacji dwóch rosyjskich graczy mających stopnie piąty dan w GoMoku okazało się, że mają oni dużą łatwość w znajdowaniu obszaru na planszy gdzie można skonstruować sekwencję zwycięstwa i nie ma przy tym znaczenia ile trójek na nią się składa. Długość takiej sekwencji waha się w granicach 5 do 20 ruchów.

 

Wyodrębniono kolejne kroki w znajdowaniu zwycięskich sekwencji przez najlepszych graczy:

1.   Wybierana jest najlepsza część planszy, która wydaje się najkorzystniejsza dla atakującego. Następnie decyduje się czy wystarczająco dużo pionków tworzy układ, w którym warto jej szukać. Opiera się to na „odczuciach” gracza, biorących się z dużego doświadczenia w osądzaniu stanu gry.

2.   Rozpatrzone zostają zagrożenia, szczególnie te powiązane z innymi atakującymi pionkami będącymi już na planszy. Ruchy obronne przeciwnika są zwykle lekceważone.

3.   Jeśli zostanie znaleziony wariant, w którym atakujący może stworzyć podwójne zagrożenie sprawdza się jaki wpływ na taką sekwencję mogą mieć ruchy obronne przeciwnika. Jeśli ma on jakiś wybór przy obronie sprawdza się czy wszystkie ścieżki prowadzą do wygranej. Sprawdza się także czy przeciwnik może uformować w międzyczasie jedną lub więcej czwórek neutralizując atak.

4.    Jeśli tylko kilka wariantów obrony nie prowadzi do wygranej atakującego, są one badane czy w nich nie da się znaleźć w nich innej zwycięskiej sekwencji.

5.   W praktycznej grze zwykle sekwencja zwycięstwa ma jeden wariant czyli ruchy obronne są nieznaczące.

6.   Rozmiar przestrzeni przeszukiwania jest poważnie zmniejszony przez analizę jednostronną (atakującego). Tylko jeśli znajdzie się sekwencję zwycięstwa badane są możliwe przypadki ruchów obronnych przeciwnika.

Na pozycjach bez wygrywających sekwencji wykonuje się ruchy zwiększające potencjalne możliwości tworzenia zagrożeń lub w przypadku obronnych ruchów zmniejszenia tej możliwości u przeciwnika. Człowiek ocenia te możliwości na podstawie dwóch aspektów:

·       Bezpośrednich kalkulacji np. jeśli oponent nie reaguje w tej części planszy

·       Tzw. dobrego kształtu, czyli konfiguracji, w której pionki dobrze współgrają ze sobą

 

Strategie programów komputerowych

 

Najlepsze programy korzystają z wariantów algorytmu alfa-beta. Na każdej pozycji jedynie ograniczona liczba ruchów jest sprawdzana – ogranicza się tylko do tych najlepiej rokujących (wybór opiera się na heurystyce). Niektóre stosują dodatkowo przycinanie liści, dla których ewaluacja daje nikłe nadzieje na sukces. Najsilniejsze programy przeszukują do 16 ruchów. W fazie początkowej korzystają z tzw. książki otwarć, czyli bazy danych układów początkowych.

 

Pomiędzy programami są różnice. Na przykład program Polygon (1992) najpierw szuka wygranej w drzewie bez użycia funkcji oceniającej. Wykorzystując tablice transpozycji sięga czasem nawet 20 do 30 poziomów (lub nawet więcej). Jeśli nie znajdzie wygrywającej ścieżki przeprowadza n-poziomowe przeszukiwanie z użyciem funkcji oceny. Następnie symuluje wykonanie ruchu i sprawdza czy przeciwnik nie ma teraz wygrywającej ścieżki. Jeśli ma to ruch jest cofany i wybierany jest nowy przez n-poziomowe przeszukiwanie.

 

Kolejny przykład to Vertex (1991) nie używa tablic transpozycji, ani specjalnych technik przeszukiwania. Standardowo przegląda na głębokość 16 ruchów. Wybiera 14 najbardziej obiecujących ruchów dla każdego stanu planszy. Wraz z użyciem rozwiniętej księgi otwarć cechy te spowodowały, że był mistrzem w 1991.

 

Człowiek vs. komputer    

 

Człowiek stosuje metody przeszukiwania optymistycznego, programy konwencjonalne algorytmy przeszukiwania stanów (drzewiaste). Moc obliczeniowa komputerów stara się pokryć duże narzuty na rozgałęzienia i kosztowną funkcję oceny (znacznie gorszą niż ludzka ocena).  Stąd dążenie do symulowania myślenia ekspertów.

Zaprezentujmy interesujący ekstremalny przypadek:

 

Rysunek 5.  Przykład stanu planszy.

 

Czarny gracz może utworzyć czwórkę przez jeden z 16 ruchów (np. a4, a5, a11, a12 itd.). Ma zatem

8!x28 ≈ 10.000.000

możliwości przeprowadzenia 8 ruchów (z 8 wymuszonymi reakcjami przeciwnika).

Jeśli zostaną użyte tablice transpozycji (zapamiętujemy wszystkie stany planszy i nie liczymy ich wielokrotnie) wciąż jest do obsłużenia 6.000 możliwych kombinacji. To musi przeszukać komputer.

Człowiek po spojrzeniu na taką planszę od razu wie, że nie ma sensu przeprowadzać żadnego z tych ruchów, a już tym bardziej nie ma znaczenia kolejność ich wykonania.

 

 Zmodyfikowana sytuacja z poprzedniego rysunku:

Rysunek 6. Przykład stanu planszy z zagrożeniami.

 

W sytuacji z rysunku 6 czarny kolor ma sekwencję zwycięską ale algorytmy będą niepotrzebnie rozszerzać drzewo stanów przez badanie posunięć w tych częściach planszy, w których nie ma wartościowych ruchów (prowadzących do wygranej).

 

Konkluzja jest taka, że konwencjonalne algorytmy nie symulują ludzkiego procesu myślowego w przypadku tej gry.

 

 

Threat-Space Search

 

Trzeba położyć nacisk na ograniczenie rozmiaru drzewa przeszukiwania i jak najefektywniejsze przeszukiwanie pozostających gałęzi.

Znaczna oszczędność przychodzi wraz ze zdeterminowaniem ruchów obronnych przeciwnika. Gdy weźmiemy pod uwagę różne możliwości obrony w przypadku trójki (2 pola lub 3 pola, na które broniący może postawić pionka) okaże się, że przestrzeń bardzo nam się powiększy. Dlatego przyjmiemy, że gracz broniący wykonuje wszystkie ruchy odparowujące atak naraz. Jeśli mimo tego nadal jesteśmy w stanie znaleźć wygrywającą sekwencję to możemy mieć pewność, że ruchy przeciwnika nie miały znaczenia. Wadą jest to, że faktycznie możemy nie znaleźć jakiejś sekwencji zwycięskiej mimo, że takowa istnieje.

 

Zatem zredukowaliśmy przestrzeń do ruchów atakujących.

Wprowadzamy 6 nowych pojęć:

1.   gain squarezdobyte pole – pole na które atakujący stawia pionka

2.   cost squares  pola stracone – pola na które broniący stawia pionki w odpowiedzi na atak

3.   rest squares – pozostałe pola – pola należące do zagrożenia (z wykluczeniem pola zdobytego)

4.   Zagrożenie A jest zależne od zagrożenia B jeśli zdobyte pole B jest jednym z pozostałych pól A.

5.   Drzewo zależności A jest zakorzenione w A i składa się jedynie z zależnych węzłów. Tzn. potomkowie węzła J są zagrożeniami zależnymi od J („zagrożenie w synu wykorzystuje pionka postawionego w ojcu”).

6.   Drzewa zależności P i Q są w konflikcie jeśli w drzewie P istnieje zagrożenie A i w drzewie Q zagrożenie B, w taki sposób, że zdobyte pole w A jest straconym w B lub odwrotnie, lub pokrywa się choć jedno pole stracone w A i w B.

 

Przykład:

Rysunek 7. Przykład definicji.

 

Na rysunku 7 zagranie e15 tworzy czwórkę (zdobyte pole to e15, stracone d15, pozostałe pola a15,b15,c15).

Następnie (po czarny e15, biały d15) rozważmy ruch atakującego na i11.

 

Rysunek 8. Przykład zależności zagrożeń.

 

Widać, że czwórka z polem zdobytym i11 jest zależna od czwórki z polem zdobytym e15.

Drzewo zależności zagrożenia i11 ma korzeń w czwórce i11, którego jedynym dzieckiem jest czwórka e15 (ta czwórka jest zależna tylko od pionków już będących na planszy więc nie ma potomków w drzewie zależności).

 

Przykładem drzew w konflikcie są ruchy e15 z obroną d15 i atak d15 z obroną e15. Nie mogą one zajść w tym samym przebiegu więc są w konflikcie. Przy większych drzewach zależności przeszukiwanie czy węzły nie są w konflikcie jest dość czasochłonne.

 

Dwa pomocne stwierdzenia:

1.   Zagrożenie A niezależne od B nie ma prawa wystąpić w drzewie przeszukiwania B.

2.   W drzewie threat-space search występują tylko zagrożenia powodowane przez atakującego. Po znalezieniu potencjalnej sekwencji zwycięskiej jest sprawdzane czy oprze się każdemu kontratakowi.

 

Drzewo przeszukiwania dla rysunku 6.   

 

Istnieje 18 niezależnych zagrożeń w stanie początkowym. 16 czwórek w rogach i dwie trójki w zakresie i7-i12. W 15 czwórkach i 1 trójce zdobyte węzły nie biorą udziału w kolejnych zagrożeniach, zatem są to węzły końcowe. Pozostałe: czwórka i trójka są wykorzystywane w następujących po nich zagrożeniach.

W przypadku czwórki e15: 

    Tracimy d15, dwie nowe czwórki mogą być utworzone:

-        h12 (strata i11) nie ma następnych zagrożeń

-        i11 (strata h12) powoduje możliwość utworzenia czwórki w linii (wygranej) przez zajęcie i8

   Pozwoliło to znaleźć sekwencję wygrywającą.

W przypadku trójki i11:

    Tracimy i7,i8,i12. Dwie nowe czwórki mogą być utworzone:

-        h12 (strata e15) nie ma następnych zagrożeń 

-        e15 (strata h12) prowadzi do utworzenia piątki przez zajęcie d15. 

Druga sekwencja wygrywająca została znaleziona.

Przeszukaliśmy zaledwie 24 węzły a wszystkie potencjalne sekwencje zagrożeń zostały przejrzane.

 

Czasem zdarza się tak, że w sekwencji zwycięskiej są węzły zależne od więcej niż jednego węzła (w powyższym przykładzie tak nie było). Innymi słowy w niektórych sytuacjach zdobyte pola dwóch lub trzech zagrożeń są włączone do stworzenia nowego zagrożenia. W takim przypadku niezależne węzły powinny być połączone. Przydatne jest jedynie łączenie tych węzłów, których zdobyte pola potencjalnie tworzą nowe zagrożenie, np. muszą leżeć w jednej linii i blisko siebie by móc utworzyć piątkę.

 

Oto przykład kiedy czarny może wygrać przez kombinację niezależnych zagrożeń (węzłów):

 

Rysunek 9. Przykład gry wygranej dla czarnego przez kombinację.

 

Drzewo przeszukiwania składa się z czterech czwórek. Nie znaleziono zagrożeń prowadzących do wygranej. 

 

 

 

W czterema różnymi zdobytymi polami z drzewa (h9,h10,i9,j10) możemy utworzyć (42)=6 kombinacji dwóch pól zdobytych. W przypadku h9 i h10 oraz i9 i j10 drzewa są w konflikcie dlatego tych par nie bierzemy pod uwagę przy rozpatrywaniu drzewa threat-space search. Kombinacja h9 i j10 nie jest złożona z pól współliniowych więc również odpada. Zatem pozostają nam trzy sensowne  kombinacje:

1.   h10-i9

2.   h10-j10

3.   h9-i9

W każdym z tych przypadków rozwinęliśmy (jeśli to możliwe) nowe drzewo przeszukiwania zgodnie z zasadami tss.

 

 

Okazuje się, że kombinacja h10-i9 powoduje możliwość stworzenia czwórki w linii przez postawienie pionka na polu f12. Czyli tworzy potencjalną wygrywającą sekwencję.

 

Te dwa przykłady dobrze ilustrują zasadę działania algorytmu threat-space search:

1.   Dla danego stanu planszy tworzone jest drzewo zagrożeń.

2.   Każdorazowo kiedy gałąź kończy się piątką lub czwórką w linii sprawdza się czy sekwencja zwycięska może zostać obalona (przez ruchy przeciwnika).

3.   Jeśli żaden przypadek nie prowadzi do zwycięstwa atakującego wtedy rozpatruje się kombinacje niezależnych węzłów (przy założeniu, że zdobyte pola leżą blisko siebie i na tej samej linii). Powtarza się to aż do znalezienia sekwencji zwycięstwa albo do momentu kiedy nie można już utworzyć wartościowych kombinacji.

Można by podsumować, że ogólnie threat-space search linearyzuje część procesu przeszukiwania.

 

Porównania i ulepszenia

 

Program implementujący Threat-Space Search nazwano Victoria TSS. Porównano go z jednym z najlepszych istniejących programów Polygon(1992). Porównanie wyszło na korzyść Victorii jeśli chodzi o wydajność – okazała się lepsza:

-        przegląda średnio kilkukrotnie mniej węzłów

-        i każdy z nich przegląda średnio 10 razy szybciej

 od Polygona, który stosuje konwencjonalne metody przeszukiwania globalnego (TSS szuka lokalnie – potomek jest powiązany z ojcem przez swoje pole zdobyte). Polygon wykorzystuje tablice transpozycji i zasady wiedzy, które pozwalają obniżyć głębokość drzewa przeszukiwania. 

Jeśli porównamy skuteczność znajdowania sekwencji wygrywającej w trzech przypadkach z dwunastu badanych rozgrywek Victoria nie znalazła sekwencji zwycięstwa ze względu na narzucone ograniczenia (wykonywanie wszystkich ruchów odparowujących atak naraz). Aby to poprawić powstała wersja Victorii używająca kombinacji threat-space search i proof-number search. To pomogło w tych trzech przypadkach. 

 

Victoria najpierw uruchamia threat-space search i poszukuje wygrywającej sekwencji jak było to opisane wcześniej. Następnie jeśli nie znajdzie uruchamiany jest algorytm proof-number search.

 

Na procedure threat-space search można patrzeć jak na funkcję oceniającą.

 

Stąd, z użyciem tss i pns można skonstruować drzewo przeszukiwania, o takiej samej wartości(przydatności) dla wyboru kolejnego ruchu (czyli dla wyniku gry) jak pełne drzewo przeszukiwania.

 

Głównym problemem jest nadal duży stopień rozgałęzienia drzewa (nawet ponad 200, szczególnie jeśli nie ma zagrożeń do odparowania).

Węzłem wewnętrznym nazwiemy węzeł, z którego nie znaleziono sekwencji wygrywającej.  Aby zmniejszyć stopień rozgałęzienia zastosowano badanie tylko null-moves, czyli ruchów atakującego, po których jeśli następuje pusty ruch broniącego da się znaleźć sekwencję wygrywającą. To powoduje powstawanie tzw. ukrytych zagrożeń. Taka procedura zwykle zmniejsza liczbę możliwych ruchów obrony do kilku. Wybór takich ruchów (null-moves) jest raczej nieskomplikowany i może zostać wykonany przez heurystykę:

 Victoria daje punkty za stworzenie schematów dwóch i trzech pionków w rzędzie. Potem N ruchów z najwyższą sumą punktów jest poddawana dalszemu rozwijaniu, żeby przekonać się czy skutkują znalezieniem sekwencji wygrywającej po pustym ruchu białego gracza. W testach okazało się, że N=10 jest rozsądnym wyborem.

 

Przy takim wyborze węzłów możemy mieć pewność, że każdy ruch czarnego koloru powoduje powstanie zagrożenia, większość ruchów białego  może zostać pominięta w rozważaniach. Jednak musimy uważać, żeby nie utworzyć przez przypadek korzystnej sytuacji dla białego gracza zmuszając go do obrony. Dlatego został stworzony moduł, który po znalezieniu sekwencji wygrywającej dla czarnego gracza wybiera te ruchy białego gracza, które mają jakąś wartość obronną.

Są to ruchy zajmujące:

-        stracone pole w sekwencji wygrywającej

-        pole połączone z białymi pionkami na planszy

-        pole połączone ze straconymi polami z sekwencji wygrywającej

Dzięki temu moduł redukuje liczbę potencjalnych ruchów białym kolorem z ponad 200 do 10-50 ruchów. Każdy z tych ruchów jest sprawdzany czy rzeczywiście obala sekwencję wygrywającą (sprawdzenie przez  wykonanie tego ruchu i zapuszczenie threat-space search).  Gdy czarny kolor ma więcej niż jedną sekwencję zwycięstwa liczba ruchów obronnych spada. Stan, w którym  wszystkie ruchy białego gracza są  wyeliminowane jest wygraną czarnego. Jeśli nie wszystkie ruchy białego są wyeliminowane wtedy przeszukiwanie jest wykonywane dla każdego jego ruchu.      

 

W dużym stopniu udało się zniwelować problem znacznego rozgałęzienia drzewa. Zbadano, że tylko po pierwszych dwóch ruchach czarnego gracza i w niektórych przypadkach po trzecim i czwartym ruchu czarny gracz nie zagraża wygraną po pustym ruchu białego (tylko wtedy nie można stosować wyżej opisanego modułu). W tych przypadkach wszystkie (ponad 200) ruchów musi być rozpatrzone.

 

Przez zrobienie tego raz i zapamiętanie wyników w bazie danych rozwiązano grę Go-Moku!

 

Zastosowano praktyczne rozwiązania dla problemów:

-        podział drzewa na mniejsze poddrzewa

-        zapamiętywanie wyników w bazie danych

-        łączenie wyników obliczeń w główne drzewo

-        sprawdzenie spójności i pełności wykonanych obliczeń (wynikowego drzewa)

Szukano rozwiązania dla standardowego Go-Moku i dla wariantu odrzucającego linie dłuższe niż 5.

Oba zostały rozwiązane i znalezione drzewa zapamiętane w bazie danych.

Program przejrzał 5.3 (6.3 w drugim wariancie) miliona stanów planszy, wysokość drzewa rozwiązującego w obu przypadkach wyniosła 35.

 

Sposób gry (Victoria brała udział w turnieju programów grających w Go-Moku):

1.   Najpierw korzysta z bazy danych stanów gry

2.   Po przekroczeniu zasięgu bazy danych do akcji wkracza moduł threat-space search wspomagany w razie potrzeby przez proof-number search

 

Podsumowanie:

 

Victoria okazała się niepokonana gdy gra czarnym kolorem, threat-space search jest bardzo szybki w znajdowaniu sekwencji wygrywającej gdyż symuluje ludzką analizę problemu, ceną jaką się płaci za taką wydajność jest to, iż nie zawsze znajduje rozwiązanie ale wtedy może zostać wsparty przez proof-number search. Połączenie tych dwóch algorytmów może być także stosowane w innych grach jak i w dowodzeniu twierdzeń.