Zakładam, że już wiesz o koncepcji Min-Max, drzewach i przycinaniu, heurystyce i innych podstawach, a to, co tu piszę, to tylko niektóre szczegóły, które mogły zostać niedocenione.
Ja wraz z przyjacielem czasami pisałem własny silnik szachowy. Dzielę się niektórymi problemami i pomysłami i mam nadzieję, że okażą się one przydatne.
Ponieważ oboje byliśmy programistami Java, nasz język stał się java i zaczęliśmy od podejścia obiektowego. Kawałki były przedmiotami, tablica była przedmiotem, teczki i szeregi (rzędy i kolumny w literaturze szachowej) były przedmiotami. I to było złe. Narzut był ogromny, a program miał trudności z przejściem dalej niż 2 ruchy (4 warstwy) w drzewie wyszukiwania.
Tak więc po kilku poszukiwaniach uzyskaliśmy genialny pomysł (choć nie nasz!): Reprezentowanie elementów i planszy jako Długich liczb całkowitych (64-bitowych). Ma to sens, ponieważ szachownica ma 64 pola. Reszta była nieco mądrzejsza (działała bardzo blisko procesora = bardzo szybko). Rozważmy na przykład binarną 64-bitową liczbę całkowitą, w której te przedstawiają kwadraty na planszy, które twój atak może zaatakować. Teraz, jeśli wykonasz logiczne „I” między dwiema liczbami w ten sposób, niezerowy wynik oznacza, że masz kwadrat z atakującymi. Jest kilka sposobów przedstawienia szachownicy i pionków, więc:
1 - Zdecyduj o swojej prezentacji na forum
Następnie potrzebujesz i otwierasz bazę danych. Otwarcie szachów zostało w jakiś sposób rozwiązane, dlatego zaleca się, aby mieć i otwierać książkę. W tym przypadku masz dużo dodatkowego czasu w grach błyskawicznych.
2 - Znajdź sobie książkę otwierającą.
Zrobiliśmy to, ale wciąż nie byliśmy dobrzy:
3 - Dobry silnik szachowy powinien widzieć przed sobą 6 ruchów (12 warstw).
Więc to, co wtedy zrobiliśmy, polegało na wykorzystaniu czasu martwego (jeśli jest to silnik ludzki kontra komputerowy).
4 - Wykorzystaj czas, kiedy przeciwnik myśli o utworzeniu niektórych poziomów twojego drzewa.
I wciąż byliśmy daleko od 12 warstw. W wyniku dalszych badań odkryjemy kilka sztuczek! Na przykład zasugerowano pominięcie jednej warstwy drzewa i rozpoczęcie od następnej warstwy (jakby nie było przeciwnika). Chodzi o to, że jeśli ruch jest wyjątkowo idiotyczny, to po co marnować czas i zobaczyć, jakie są reakcje przeciwników na ten ruch. Jednak jeden dobry silnik powinien być w stanie rozróżnić ruch idiotyczny i poświęcenie genialnej królowej.
5 - Naucz się programowania sztuczek dla tego konkretnego problemu (szachy).
Ja i mój przyjaciel, w tym stanie, nadal byliśmy źli: / Co mogliśmy zrobić - i częściowo zrobiliśmy - to uratować obliczone pozycje. Jeśli obliczysz pozycję, zachowaj ją na przyszłość! To samo dotyczy pętli w drzewie wyszukiwania. Chodziło o to, aby efektywnie zapisać / odzyskać:
6 - Zapisz wygenerowane dane ... Skutecznie!
i w końcu:
7 - Kod z maksymalną optymalizacją.
Ten problem jest niezwykle drogi zarówno pod względem czasu procesora, jak i pamięci. Bardzo ważne jest bardzo efektywne pisanie kodu. Pamiętaj, że mówimy o współczynniku rozgałęzienia wynoszącym 35. Oznacza to, że bezużyteczne „jeśli” gdzieś w twojej heurystyce, może stać się 3.3792205e+18
bezużyteczne „jeśli” jest gdzieś głęboko w twoim drzewie wyszukiwania.
Programowanie w szachy jest bardzo interesującym wyzwaniem i nadszedł czas, abyś mógł przetestować swoje możliwości programowania. Jest jeszcze kilka punktów, które mogę zasugerować, ale jestem pewien, że odkryjesz je sam. Jest wiele innych punktów, których nie znam, ale można je znaleźć w Internecie!
Powodzenia i miłej zabawy!
ps Nie znam zbyt dobrze javascript, ale coś mówi mi na podstawie trudności problemu, być może biorąc pod uwagę wszystko, co może zaoferować C ++, lepiej byłoby porzucić javascript i zrobić to w C ++.