Projekt został zrealizowany w oparciu o artykuł "Go-Moku and Threat-Space Search" L.V. Allis, H. J. van den Herik, M. P. H. Huntjens. Autorzy tej publikacji rozwiązali grę Gomoku przy użyciu algorytmów TSS (thread-space search) i PNS (proof-number search). Algorytm TSS jest ich pomysłem.
Gra Gomoku jest rozgrywana na planszy 15x15 pól. Każde pole może mieć jeden ze stanów: X, O albo jest puste. X to znak pierwszego gracza, O - drugiego gracza. Gra polega na stawianiu naprzemian swoich znaków na planszy, tak aby utworzyć ich ciąg o długości pięciu w jednej linii. Gracz, który pierwszy to zrobi wygrywa.
Oczywiście gracz X ma pewną przewagę nad graczem O w przypadku gry osób. Są różne sposoby rozpoczynania gry Gomoku, aby wyrównać szansę. Do roku 1992 gra Gomoku była grą olimpijską. Organizowano zawody algorytmów sztucznej inteligencji, które brały udział w rozgrywkach Gomoku. W 1991 roku wygrał program Polygon. W 1992 pojawił się już program Victoria, który był oparty na algorytmach TSS i PNS. Jeśli grą gracza X steruje komputer w oparciu o algorytmy TSS (thread-space search) i PNS (proof-number search) to gracz O nie ma żadnych szans na wygraną. Oznacza to, że gra została rozwiązana. W rozgrywkach z 1992 roku Victoria wygrała z Polygon, gdy zaczynała grę, przegrała gdy była drugim graczem. Jednak wygrana dla pierwszego gracza jest pewna. Wraz z rozwiązaniem gry Gomoku zlikwidowano rozgrywki tej gry na olimpiadzie.
W artykule opisanym na początku jest zawarty opis algorytmu TSS. Tematem tego projektu jest próba implementacji tego algorytmu i opisanie wszystkich jego kroków. Implementacja programu jest będzie przy użyciu C++ i biblioteki QT.
Rysunek 1: Program GOMOKU napisany na potrzeby tego projektu.
Sam algorytm TSS nie wygra rozgrywki. Algorytm ten wyszukuje możliwości tworzenia zagrożeń, czyli sytuacji, w których przeciwnik będzie musiał odparować atak, aby nie przegrać. Algorytm TSS ma za zadanie wyszukać taki ciąg zagrożeń, który będzie sekwencją zwycięstwa. Sekwencja zwycięstwa to ciąg ruchów gracza, takich że drugi gracz cały czas się broni. W przypadku gry Gomoku nie ma szans na obronę.
Co wtedy gdy nie ma możliwości stworzenia zagrożenia? Są dwie takie sytuacje. Pierwsza to początek gry. Tutaj trzeba pierwsze 4 ruchy mieć zapamiętane w bazie danych. Biorąc ilość mozliwości ruchów przeciwnika powinniśmy mieć zapamiętane około 200 przypadków rozpoczęcia gry. Drugi przypadek jest wtedy, gdy gra już jest po fazie początkowej, ale zagrożenia nie można stworzyć. Wówczas można wspierać się standardowym algorytmem przeszukiwania, autorzy programu Victoria użyli PNS (proof-number search).
Program Gomoku, który zawiera implementację TSS jest napisany tak, aby można było pominąć momenty wymagające użycia PNS oraz bazy danych otwarć. Jest przygotowany do testowania i implementowania tylko algorytmu TSS.
Gdy kolej na nasz ruch:
Rysunek 2: Stan początkowy przykładu. Ruch należy do gracza X.
Rysunek 3: Rozgrywka. Przebieg gry przy pomocy TSS. Wyszukiwanie zagrożeń.
Wyświetlana liczba to ilość przeszukanych stanów w danych ruchu.
Niestety moja próba implementacji nie powiodła się do końca. Są przypadki, kiedy program wykonuje "głupie" ruchy. Jest to uzależnione od pewnych błędów samej implementacji, a nie samej idei działania algorytmu TSS. Dokładnie nie jestem wtanie określić w czym tkwi problem. Gdybym wiedział, to bym naprawił. Źródła programu to plik gomoku-1.0.tar.gz. Plik Makefile zawiera instrukcje kompilowania wsparte przez program qmake z QT 4.3. W tym pliku Makefile program qmake jest wywoływany poleceniem qt4-qmake, proszę o modyfikacje do qmake, jeśle jest to zgodne z docelowym systemem.
Oczywiście w implementacji TSS kryje się wiele szczegółów samej realizacji kodu w C++, których nie opisano w tym artykule. TSS linearyzuje część związaną z przeszukiwaniem stanów gry. Jest to metoda bardziej naturalna, bardziej podobna do metod używanych przez ludzi podczas gry. Algorytm TSS powstał właśnie w wyniku obserwacji metod działania ludzi.