【发布时间】:2015-06-30 18:24:02
【问题描述】:
上个月,我一直在用 c# 创建一个简单的国际象棋引擎,并取得了一些不错的进展。它使用的是简单的 Alpha-Beta 算法。
为了纠正地平线效应,我尝试实现静止搜索(并在它起作用之前失败了几次)。引擎的力量似乎从那以后安静了一点,但速度非常慢!
以前,我可以在大约 160 秒内搜索到 6 层深度(处于游戏中期的某个位置),而在静态搜索中,计算机需要大约 80 秒才能移动到搜索深度 3!
暴力节点计数器在深度 3 处约为 20000 个节点,而静态节点计数器高达 2000 万!
由于这是我的第一个国际象棋引擎,我真的不知道这些数字是否正常,或者我是否可能在我的静止算法中犯了错误。如果有经验的人能告诉我 BF 节点/静止节点的通常比率是多少,我将不胜感激。
顺便说一句,看看: (只要searchdepth为0,BF树就会调用这个方法)
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;
}
【问题讨论】:
-
你看this SO question了吗?
-
有一条评论不是针对静态搜索的:对于象棋这样的游戏,修改同一个棋盘然后撤消移动通常比复制棋盘快得多每个探针的整个电路板。
-
@DeadZone:我确实看过链接的帖子,但问题似乎是这个人在静止搜索中产生了所有动作(我没有)。
-
@Internal Server Error: 感谢您的建议,以后可能会有所帮助。现在,我认为是否复制 Board 并不重要,因为我认为我每秒可以复制 Board 大约 25 000 000 次(而我的整个引擎目前正在搜索 720 000 个节点/秒。
标签: c# algorithm chess alpha-beta-pruning