Próbuję stworzyć prosty silnik szachowy, ale zmagam się z jego wydajnością. Zaimplementowałam Negamax z przycinaniem alfa-beta i iteracyjnym pogłębianiem (bez żadnych dodatkowych heurystyk), ale nie jestem w stanie uzyskać rozsądnego czasu wyszukiwania poza 3-4-tą warstwą. Oto fragment z dziennika mój program od samego początku gry:Szachy: wysoki współczynnik rozgałęzienia
2013-05-11 18:22:06,835 [9] INFO CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Searching at depth 1
2013-05-11 18:22:06,835 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Leaves searched: 28
2013-05-11 18:22:06,835 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Nodes searched: 28
2013-05-11 18:22:06,835 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Found PV: A4->A6
2013-05-11 18:22:06,835 [9] INFO CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Searching at depth 2
2013-05-11 18:22:06,897 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Leaves searched: 90
2013-05-11 18:22:06,897 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Nodes searched: 118
2013-05-11 18:22:06,897 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Found PV: A2->A3 B7->B6
2013-05-11 18:22:06,897 [9] INFO CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Searching at depth 3
2013-05-11 18:22:08,005 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Leaves searched: 6027
2013-05-11 18:22:08,005 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Nodes searched: 6414
2013-05-11 18:22:08,005 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Found PV: A2->A3 A6->B8 A4->A7
2013-05-11 18:22:08,005 [9] INFO CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Searching at depth 4
2013-05-11 18:22:10,485 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Leaves searched: 5629
2013-05-11 18:22:10,485 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Nodes searched: 6880
2013-05-11 18:22:10,485 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Found PV: D2->D4 A6->B8 C4->C5 A7->A6
2013-05-11 18:22:10,485 [9] INFO CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Searching at depth 5
2013-05-11 18:22:34,353 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Leaves searched: 120758
2013-05-11 18:22:34,353 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Nodes searched: 129538
2013-05-11 18:22:34,353 [9] DEBUG CoevolutionaryChess.Engine.MoveSearchers.NegamaxMoveSearcher [(null)] - Found PV: D2->D4 A6->B8 C4->C5 A7->A6 A4->A6
To pokazuje, że rozgałęzienia współczynnik wynosi około 10. Czytałem, że z właściwego uporządkowania ruchu powinien być coraz coś około 6, więc podejrzewam że moje zamówienie jest złe. Obecnie działa w ten sposób:
- Węzeł drzewa gry ma powiązaną listę swoich dzieci; początkowo, przechwytuje i promocje są umieszczone przed spokojnych ruchów
- Podczas poszukiwań, dziecko, które zwiększa alfa lub powoduje odcięcia jest umieszczone na początku listy
- Na następnej iteracji pogłębienie PV należy szukać najpierw
Czy jest to właściwy sposób zamawiania ruchów i oddziałuję na czynnik, którego się spodziewam? Obecnie używam prostej statycznej funkcji oceny, która bierze pod uwagę tylko istotną różnicę pozycji - czy może być powodem niskiej szybkości odcięcia (jeśli uwzględni się także ruchliwość figur, otrzymam podobne wyniki)? Czy techniki takie jak redukcja ruchów zerowych lub heurystyczna pomoc zabójcy znacząco (nie o 10-15%, ale o rząd wielkości)? Nie oczekuję, że mój silnik będzie mocny, ale chciałbym, aby współczynnik rozgałęzienia wynosił około 6.
Czy to twój log od pierwszego ruchu? Jeśli tak, to te teledyski nie wyglądają dla mnie legalnie. – TonyK
Claude Shannon był matematykiem, który w latach pięćdziesiątych opracował pierwszy algorytm komputerowej skrzyni. Jego teza była podstawą liczby Shannona, która jest podobno liczbą możliwych gier w szachy (około 10^120). W swojej pracy doszedł do wniosku, że jeśli komputer mógłby ocenić 10^6 możliwych ruchów na sekundę, to zajmie komputerowi więcej niż 10^90 lat, aby dojść do pierwszego ruchu (liczba atomów we Wszechświecie jest szacuje się na około 10^80). – scottb
To jest trzeci ruch. Poprzednie były C2-> C4 i D1-> A4. – Matis