beta修剪同一玩家的连续移动
我已经为跳棋实施了alpha-beta修剪,并认为我已经可以工作了,但是发现计算机并未连续进行多次跳跃(当它需要时)。 例如:
AI会:
O _ _ _ _ _ _ _ _ _
_ X _ X _ -> _ _ _ X _ (misses a jump because it only does a single move)
_ _ _ _ _ _ _ O _ _
AI应该这样做:
O _ _ _ _ _ _ _ _ O
_ X _ X _ -> _ _ _ _ _ (sees that it's current turn is not finished, continues)
_ _ _ _ _ _ _ _ _ _
我试图通过检查MovePiece的返回值来解决这个问题,该返回值返回是否玩家已经完成他的转身,由移动是否是跳转以及是否还有跳转来决定。 根据返回值,它将再次运行MaxValue / MinValue(取决于它在第一次看到还有哪些进一步移动时所处的位置),或者继续在树中并切换播放器。
相关代码(在C#中)如下所示(retVal是包含Value,Depth和Move的类型):
foreach(var m in moves)
{
var resultingBoard = board.Clone();
var moveResult = resultingBoard.MovePiece(m.TypeOfMove,
resultingBoard.GetPieceAtPosition(m.OriginalPieceLocation.X,
m.OriginalPieceLocation.Y),
m.FinalPieceLocation.X, m.FinalPieceLocation.Y);
var newDepth = currentDepth;
if(moveResult == TurnResult.NotDone)
{
retVal = MaxValue(resultingBoard, ref alphaValue, ref betaValue, color, ref newDepth, ref maxDepth);
}
else if(moveResult == TurnResult.Finished)
{
newDepth++;
retVal = MinValue(resultingBoard, ref alphaValue, ref betaValue, color == PieceColor.Black ? PieceColor.Red : PieceColor.Black, ref newDepth, ref maxDepth);
}
}
...
然而,这会导致一些...有趣的结果(第一步除了最小的李子之外什么也不做),尽管我认为这将是正确的改变。
让MaxValue / MinValue再次调用自己的新举措是正确的做法吗?
事实上,你的极小极大算法需要“产生”新的移动气味 (当你需要吃第二块)。
我会尝试重新设计它 - 您可以扩展move
(迭代moves
的元素),使其包含元组(或列表)移动 ,并避免Minimax算法阶段中的TurnResule.NotDone
。
采用这种方法 - 列表moves
将被预先扩展,除了一次移动之外(eat piece,eat piece)
还包含移动(eat piece,eat piece)
。
该解决方案将使算法更加稳健,并且可以让您轻松进行未来的修改。
链接地址: http://www.djcxy.com/p/56401.html上一篇: beta pruning consecutive moves for same player
下一篇: Using minimax search for card games with imperfect information