Я создал простой шахматный движок в C# в течение последнего месяца и добился неплохих успехов на нем. Он использует простой алгоритм Alpha-Beta.Chess Quiescence Search ist too large
Чтобы исправить эффект Horizon, я попытался реализовать Quiescence Search (и не удалось выполнить несколько раз, прежде чем он сработал). Сила двигателя, похоже, немного улучшилась, но это ужасно медленно!
Раньше я мог искать глубину в 6 слоев примерно за 160 секунд (где-то в midgame state), при спокойном поиске требуется около 80 секунд для перехода на глубину поиска 3!
Счетчик узлов грубой силы составляет около 20000 узлов на глубине 3, а счетчик покоя - до 20 миллионов!
Поскольку это мой первый шахматный движок, я действительно не знаю, являются ли эти цифры нормальными или если я допустил ошибку в моем алгоритме покоя. Я был бы признателен, если бы кто-то более опытный мог рассказать мне, каково обычно отношение узлов BF Nodes/Quiescent.
Btw, просто чтобы посмотреть на: (этот метод называется деревом BF когда searchdepth является 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;
}
ли вы посмотрите на [этот вопрос SO] (http://stackoverflow.com/questions/17510606/quiscence-search-performance ? RQ = 1)? – DeadZone
Один комментарий, не относящийся к поиску покоя: для игры, такой как шахматы, как правило, быстрее, чем один раз, чтобы изменить одну и ту же доску, а затем отменить ход позже, а не копировать всю доску для каждого зонда. –
@DeadZone: Я смотрел на связанную Почту, но проблема там, казалось, заключалась в том, что парень генерировал все движения в поиске покоя (чего у меня нет). – xXliolauXx