Tworzyłem prosty silnik szachowy w języku C# w ciągu ostatniego miesiąca i zrobiłem kilka fajnych postępów w tej sprawie. Używa prostego algorytmu Alpha-Beta.Search Quescence szachy jest zbyt obszerna
W celu skorygowania efektu horyzontu, próbowałem zaimplementować wyszukiwanie w trybie wyciszenia (i kilka razy zakończyło się niepowodzeniem, zanim zadziałało). Wydaje się, że siła silnika nieco się poprawiła, ale jest niesamowicie powolna!
Wcześniej, mogłem przeszukać 6-warstwową głębię w około 160 sekund (gdzieś w stanie pośrednim), z wyszukiwaniem spoczynkowym, komputer przenosi około 80sekund, aby uzyskać ruch na głębokości wyszukiwania 3!
Licznik węzłów o dużej sile ma około 20000 węzłów na głębokości 3, a licznik węzłów spoczynkowych nie przekracza 20 milionów!
Ponieważ jest to mój pierwszy silnik szachowy, tak naprawdę nie wiem, czy te liczby są normalne, czy też mogłem popełnić błąd w moim algorytmie wyciszenia. Byłbym wdzięczny, gdyby ktoś bardziej doświadczony mógł mi powiedzieć, jaki jest zwykle stosunek węzłów BF Nodes/Quiescent.
Btw, żeby rzucić okiem na: (ta metoda jest wywoływana przez drzewo BF gdy searchdepth jest 0)
public static int QuiescentValue(chessBoard Board, int Alpha, int Beta)
{
QuiescentNodes++;
int MinMax = Board.WhoseMove; // 1 = maximierend, -1 = minimierend
int Counter = 0;
int maxCount;
int tempValue = 0;
int currentAlpha = Alpha;
int currentBeta = Beta;
int QuietWorth = chEvaluation.Evaluate(Board);
if(MinMax == 1) //Max
{
if (QuietWorth >= currentBeta)
return currentBeta;
if (QuietWorth > currentAlpha)
currentAlpha = QuietWorth;
}
else //Min
{
if (QuietWorth <= currentAlpha)
return currentAlpha;
if (QuietWorth < currentBeta)
currentBeta = QuietWorth;
}
List<chMove> HitMoves = GetAllHitMoves(Board);
maxCount = HitMoves.Count;
if(maxCount == 0)
return chEvaluation.Evaluate(Board);
chessBoard tempBoard;
while (Counter < maxCount)
{
tempBoard = new chessBoard(Board);
tempBoard.Move(HitMoves[Counter]);
tempValue = QuiescentValue(tempBoard, currentAlpha, currentBeta);
if (MinMax == 1) //maximierend
{
if (tempValue >= currentBeta)
{
return currentBeta;
}
if (tempValue > currentAlpha)
{
currentAlpha = tempValue;
}
}
else //minimierend
{
if (tempValue <= currentAlpha)
{
return currentAlpha;
}
if (tempValue < currentBeta)
{
currentBeta = tempValue;
}
}
Counter++;
}
if (MinMax == 1)
return currentAlpha;
else
return currentBeta;
}
Czy obejrzysz [to pytanie SO] (http://stackoverflow.com/questions/17510606/quiscence-search-performance ? rq = 1)? – DeadZone
Jeden komentarz nie jest specyficzny dla wyszukiwania w stanie spoczynku: W przypadku gry w szachy zwykle jest _do _ szybsze modyfikowanie tej samej planszy, a następnie cofanie ruchu, a nie kopiowanie całej planszy dla każdej sondy. –
@DeadZone: Spojrzałem na powiązany post, ale problem polegał na tym, że facet generował wszystkie ruchy w poszukiwaniu spoczynku (czego nie robię). – xXliolauXx