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.
Niesamowite, wielkie dzięki! :) – dfg