首页 文章

Alpha-beta修剪同一玩家的连续动作

提问于
浏览
0

我已经为Checkers实现了alpha-beta修剪,并认为我有它工作,但发现计算机不会连续多次跳转(必须时) . 例如:

AI确实:

O _ _ _ _      _ _ _ _ _

_ X _ X _  ->  _ _ _ X _  (misses a jump because it only does a single move)

_ _ _ _ _      _ _ O _ _

我应该这样做:

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);
    }
}

...

然而,这导致了一些......有趣的结果(第一步除了min prunes之外什么也没做),尽管我认为这是正确的改变 .

让MaxValue / MinValue再次调用自己的新动作是正确的事吗?

1 回答

  • 2

    The fact that your minimax algorithm needs to "generate" new moves smells (当你需要吃第二块时) .

    I would try to redesign it - 你可以这样做 extending the move (可迭代 moves 中的一个元素),使其成为 contain tuples (or a list) of moves ,并避免在minimax算法阶段使用 TurnResule.NotDone .

    使用这种方法 - 列表 moves 将被预先扩展,除了单一移动之外还包含移动 (eat piece,eat piece) .


    此解决方案将使算法更加健壮,并允许您轻松进行未来的修改 .

相关问题