Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Alpha-beta修剪同一玩家的连续移动_Algorithm_Artificial Intelligence_Minimax_Alpha Beta Pruning - Fatal编程技术网

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

Algorithm Alpha-beta修剪同一玩家的连续移动,algorithm,artificial-intelligence,minimax,alpha-beta-pruning,Algorithm,Artificial Intelligence,Minimax,Alpha Beta Pruning,我已经为跳棋实现了alpha-beta剪枝,并认为它可以工作,但我发现计算机不会在一行中进行多次跳转(必要时)。例如: 大赦国际: O _ _ _ _ _ _ _ _ _ _ X _ X _ -> _ _ _ X _ (misses a jump because it only does a single move) _ _ _ _ _ _ _ O _ _ 人工智能应做到: 我试图通过检查MovePiece的返回值来修复它,该值返回玩家是否完成了他的回合,这

我已经为跳棋实现了alpha-beta剪枝,并认为它可以工作,但我发现计算机不会在一行中进行多次跳转(必要时)。例如:

大赦国际:

O _ _ _ _      _ _ _ _ _

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

_ _ _ _ _      _ _ O _ _
人工智能应做到:

我试图通过检查MovePiece的返回值来修复它,该值返回玩家是否完成了他的回合,这取决于移动是否是一次跳跃以及是否还有更多的跳跃要进行。根据返回值,它将再次运行MaxValue/MinValue(取决于它第一次看到有进一步移动时所处的位置),或者继续在树中切换玩家

相关代码(C#)如下所示(retVal是一种包含值、深度和移动目标的类型):

然而,这会产生一些……有趣的结果(第一步只做最小修剪),尽管我认为这是正确的改变


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

事实上,你的minimax算法需要“生成”新动作(当你需要吃第二块时)

我会尝试重新设计它-您可以扩展
移动
(iterable
移动
中的一个元素),使其包含移动的元组(或列表),并避免在minimax算法阶段出现
turnResult.NotDone

使用这种方法-列表
移动
将提前扩展,以便除了单个移动之外,还包含移动
(吃片,吃片)


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

O _ _ _ _      _ _ _ _ O
_ X _ X _  ->  _ _ _ _ _  (sees that it's current turn is not finished, continues)
_ _ _ _ _      _ _ _ _ _
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);
    }
}