详解alpha-beta算法

来源:互联网 发布:bp神经网络算法matlab 编辑:程序博客网 时间:2024/05/16 10:41

<span style="font-size:18px;">最近在做中国象棋对弈程序,用到了alpha-beta算法。在网上搜索了很多但是智商的因素让我无法清除的弄明白。今天我的人机对弈终于完成了,我把我对alpha-beta算法的理解写出来。希望大神们有什么不同的意见能够指出来,帮助我改正加深我对算法的理解,小弟先行谢过。</span>

    首先贴出如下这幅图,我会细致的跟大家分析,alpha-beta剪枝过程。


    如图中标注和字的为电脑,标注漢的为玩家。递归深度为4.
    首先玩家选择某个着法产生棋局即图中起点。

    该着法对应有电脑的44种应对方式。即图中第二行和A~和Z。(44仅为一个代表数字,棋局的不同会导致产生的合理走法的数量不同).

    若电脑选择了和A着法,对应于该着法存在有44种玩家可选着法,即图中第三行。

    若电脑替玩家选择着法漢A,对应又存在44种电脑可选择的走法。此时可选择的走法有图中的第四行左侧的和A,和B,和Z等未完全列举出来的走法。

    每一种走法经过评估后产生椭圆中的粉红色结果。其中评估函数如下:

public int Evaluate(){    return UserOrder ? yamatoEvaluate - hanEvaluate : hanEvaluate - yamatoEvaluate;           }
    该函数中UserOrder代表是否该用户着子,并且在评估过程中,如果该用户落子则评估函数返回值为对手棋子价值总和减去我方棋子价值总和。

public int AlphaBeta(int depth, int alpha, int beta){    int value;    if (depth == 0)    {        return Evaluate();    }    Point[] legalSteps = GenerateMoves();    for (int i = 0; i < legalSteps.Length; i++)    {        if (MakeMove(legalSteps[i], depth))        {            value = -AlphaBeta(depth - 1, -beta, -alpha);            UndoMove(legalSteps[i], depth);            if (value >= beta)            {                return value;            }            if (value > alpha)            {                alpha = value;                if (MaxDepth == depth)                {                    MaxMove = legalSteps[i];                }            }        }    }    return alpha;}

   由于在递归调用AlphaBeta(depth,alpha,beta)时结果取了负值,并且评估函数返回值为对战方棋子价值减去我方棋子价值,所以当我方处于优势地位时,评估函数返回值为负值,而value 取AlphaBeta函数返回值的相反数。 由于第一次调用时alpha,beta分别取负无穷大和正无穷大。所以在对上图中漢A子节点的分析将产生(和)所能走的最好的走法(即和族在汉族已经选择了漢A落子方式后,所能选择的最佳走法的得分)。接下来对漢A的调用返回将并返回最大值8.此时将函数的主动权转交到对第二行和A的分析。此时和A得到了返回值-8,接下来分析和A下的合理走法漢B。并将漢A得到的值-8传递给对漢B AlphaBeta函数的调用。此时漢B的子节点的beta值变为8.漢B子节点的评估值将与8比较。如果某个子走法如和Q得到的返回值为9则停止比较并返回此刻的评估值。因为对于(和)每次都想找到最佳的走法,而(漢)将比较所有的返回值,并选择最小值。从而使得自己不至于让对手获得最大利益。

   上面的分析可能比较拗口。简单来讲就是甲乙两人对弈。轮到甲落子。甲分析棋盘找到所有可以落子的合理方法,分析每一个落子乙对应走法的最大获利。然后为了使得乙不获得最大利益。甲将比较自己的每种落子选择乙获得利益的高低。为了使得自己不至于损失太大。当然是选择使乙获利最小的走法。

    那么AlphaBeta函数中的参数的含义就不难理解了,alpha 为搜索中所能找到的最大利益走法(即在我方搜索时我方获得最大利益的走法)。beta为对战方所能容忍的最大损失(即每步对方走法下我方走法最大获利值中的最小值),至于depth毫无疑问是搜索深度了。depth越大则电脑越聪明。

    就这些了,以后如果有时间我会把历史表等提高AlphaBeta算法处理速率的方法写出来。还希望大家多多提点啊


0 0
原创粉丝点击