2013-11-15 34 views
5

Używam Minimax, aby gra komputerowa połączyć 6. Używam również przycinania Alpha-Beta, aby przyspieszyć algorytm.Tabele transpozycji?

Chcę dodać tabelę transpozycji, aby algorytm był jeszcze szybszy. Nie mam absolutnie żadnego doświadczenia z nimi.

Czy ktoś mógłby wyjaśnić podstawy tabel transpozycji i jak można je zastosować w grze takiej jak Connect 6? Łącze do użytecznego zasobu byłoby w porządku.

I "m zaznajomieni z tabelami hash

Co znalazłem:.!

) http://chessprogramming.wikispaces.com/Transposition+Table

Link daje dobre wyjaśnienie tabel transpozycji, ale całkowicie koncentruje się na szachy tak trudno jest figura sposób, w jaki tabele transpozycji działają niezależnie od szachów:

Odpowiedz

8

Najpierw algorytm minimaksowy zastosowany naiwnie musi obliczyć najlepszą grę (w sensie minimaks) dla każdej pozycji planszy, którą można zastosować. bly napotkasz w przyszłości. Alfa-przycinanie pomaga ograniczyć niepotrzebne obliczenia, ponieważ jeśli wiesz, że nigdy nie wykonasz określonego ruchu, nie musisz obliczać wartości tego ruchu.

W przypadku niektórych gier najlepsze rozgrywki na danej planszy mogą być w pełni określone przez stan deski w danym momencie. Szachy są takie, więc i inne gry. Kluczową realizacją jest to, że jak dotarłeś do danego stanu gry, nie ma to znaczenia (z punktu widzenia minimax).

W szczególności, transpozycja w znaczeniu szachowym tego słowa ma miejsce, gdy bierze się 2 różne ścieżki ruchów, aby przejść od pozycji początkowej do końcowej.

Tabele transpozycji pozwalają zoptymalizować obliczanie najlepszego ruchu, gdy występują sytuacje, w których różne gry powodują, że plansza znajduje się w tym samym położeniu końcowym. Zasadniczo, gdy dojdziesz do jednej konkretnej pozycji na planszy, przechowujesz wynik obliczenia minimax w tej pozycji w tabeli transpozycji. Oznacza to, że później, jeśli inna lista ruchów pojawi się na tej samej planszy, nagle nie musisz całkowicie przeliczać minimaksu na tej planszy, ponieważ już to zrobiłeś i możesz po prostu sprawdzić to od tabela transpozycji.

Tak więc, jeśli istnieje wiele sposobów, w jakie gracze mogą grać, którzy przybywają na tej samej pozycji planszy, nie trzeba powtarzać, patrząc w dół tej gałęzi drzewa gry więcej niż jeden raz, jeśli jesteś w stanie zapisać wyniki tego obliczenia jakoś. Aby to zrobić skutecznie, musisz być w stanie efektywnie reprezentować pozycję planszy, a następnie mieć pewną strukturę danych, która pozwala szybko znaleźć pozycję tablicy w tabeli transpozycji. Znalezienie odpowiedniej reprezentacji będzie w dużej mierze zależało od tego, którą grę analizujesz.

Jeśli connect6 is this game chyba przykładem może być dobre: ​​

Say płyta zaczyna się ten (pozycja A):

X 0 
0 X 

Jest więcej niż jeden zestaw ruchów, które Ci się (pozycja B):

X 0 0 0 
0 X X X 
0 X 

Say tam n sposobów począwszy od położenia A do położenia B, jeśli poszedł o to naiwnie może trzeba przetestować, aby znaleźć najlepszy ruch w positio n B do n razy (w zależności od tego, które gałęzie drzewa alfa-beta są przycinane). Ale naprawdę byłoby wspaniale, gdybyśmy nie musieli wykonywać tego samego obliczenia dokładnie dla tablicy B, raz, mam nadzieję, wystarczy!

To, co musisz zrobić, aby wykorzystać tę ideę, to znaleźć sposób reprezentowania pozycji na 6 połączeniach. Jednym ze sposobów, w jaki moglibyśmy reprezentować tablicę, jest tablica N by N, gdzie N jest wymiarem płytki i po prostu przechowuje wartość wyliczenia dla każdej komórki, która odpowiada, jeśli jest pusta, ma w sobie X lub ma 0. Jednak to naiwne podejście nie ma wielkich właściwości do szukania pozycji, ponieważ zawsze będziemy omijali te nieprzyjemne tablice N by N. Nie wspominając o tym, że przechowywanie wielu z tych tablic zajęłoby dużo pamięci.

Jeśli więc możemy zdefiniować funkcję skrótu, która pobiera tablicę N by N i odwzorowuje ją na prawie unikatową liczbę całkowitą bez tony przetwarzania, wówczas możemy usprawnić ten proces. Hashing a board i sprawdzanie, czy jest on w tabeli powinien być w ten sposób szybszy.

Dlatego ludzie starają się tworzyć funkcję haszowania dla konkretnej gry, którą analizują. Dla połączenia 6 nie mam pojęcia, co to jest najlepsza funkcja mieszająca, to coś, co musiałbyś wypracować.

Uzyskanie najlepszej wydajności z czegoś takiego zajmuje całą masę majsterkowania, ale mam nadzieję, że ten post dał ci kilka pomysłów. Proszę o komentarz, jeśli chciałbyś, abym rozwinął cokolwiek.

+0

Niesamowite, wielkie dzięki! :) – dfg

2

This MediocreChess Artykuł objaśnia szczegółowo tabele transpozycji. Zobrist algorithm jest bardzo prosty do tworzenia tabel transpozycji.

System zobrist w dwóch słowach:

  1. wygenerować liczbę losową (powiedzmy, 32 bity) dla każdej pary [możliwym kawałku, możliwe ogniwo] (dla Kółko i krzyżyk to 2 * 9) i zapisz je w tablicy.
  2. Rozpocznij od hash = 0, a XOR do skrótu z zapisanym numerem dla każdej pary [odtwarzanego fragmentu, pozycji odtwarzanego fragmentu]
  3. Otrzymujesz swój Zobrist!

To bardzo dobry system, który umożliwia usunięcie kawałka! musisz tylko XOR ponownie ten sam numer. Jest to bardzo przydatne w przypadku algorytmów negamax/alpha-beta, ponieważ musimy wielokrotnie zmieniać/przywracać stan. Łatwo jest utrzymać aktualny klucz Zobrist.

System transpozycji tabeli jest:

  • Dla pewnej pozycji gry, można wygenerować wartość mieszania, która jest podpis pozycji gry, z algorytmem Zobrist i uzyskać liczbę całkowitą (Na przykład 32 bity lub 64 bity).
  • Ten "klucz zobrist" może być użyty bezpośrednio do przechowywania najlepszego ruchu i wyniku dla danej pozycji, w tabeli transpozycji.
  • Ale prawdopodobnie nie będziesz chciał zapisywać 2^32 lub 2^64 wpisów, więc bierzesz "hash" Zobarmowego klucza, by ograniczyć wpisy tablicy transpozycji, powiedzmy 16 bitów na 2^16 pozycji do gry (w rzeczywistości jest to prawdopodobnie> = 2^20). Aby uzyskać ten hash, prostą metodą jest "modulo" kluczem zobrist lub zrobić "binarny i":

    indeks tabeli transpozycja = zobrist_key & 0xFFFF

uzyskać liczbę całkowitą między 0 a 2^16-1, to jest twój indeks w tabeli transpozycji! Oczywiście możemy napotkać kolizje, więc możemy przechowywać cały klucz zobrist w tabeli transpozycji.

Podsumujmy:

  1. Dla danej pozycji, obliczyć klucz zobrist, a następnie mieszania klucza zobrist, który będzie Twój indeks w tabeli transpozycji. Przechowujmy ważne dane w tym wpisie w tablicy: score, best_move, zobrist_key, flag, depth.
  2. Gdy zajrzysz do tabeli transpozycji, obrysuj klucz zobrist dla danej pozycji gry, następnie jego skrót i uzyskaj odpowiedni wpis. Następnie sprawdź, czy klucz zobrist jest równy twojemu, aby uniknąć kolizji "fałszywego pozytywu".

Tak dla Połącz 6, masz 2 kamienne kolory, a powiedzmy 59x59 pozycje, więc trzeba stworzyć tablicę 59x59x2 = 6962 liczb losowych. Aby zakodować pozycję gry w kluczu Zobrist, weź każdy kamień, a jeśli chodzi o jego kolor i położenie, weź numer, który wygenerowałeś i zbierz je razem. Zredukuj swój Zobrist Key do indeksu (hash, binary "and", ...) i przechowuj dane w tym indeksie w tabeli transpozycji.