AlphaBeta
剪枝算法
关于
AlphaBeta
剪枝的文章太多,
这个方法是所有其它搜索方法的基础,
得多花些时间认
真地理解。
先把基本概念再回顾一遍:
节点
:在中国象棋中就是一个棋盘的当前局面
Board
,当然该轮到谁走棋也是确定的。这
里的圆形节点表示终止节点,在中国象棋里就是一方被将死的情况(或者到达了搜索的最大深
度),后续不会再有着法产生,游戏如果走到这里就会结束。在引擎里通常给红方一个很大的评
估值,如
+30000
,给黑方一个很小的评估值,如
-30000
,来方便地判断这种结束局面。(胜
利局面有稍微不同的表示法,用
-30000+
层数
ply
来表示)
连线
:表示一步着法
Move
,通过这步着法后,局面发生变化,先后手也要交换。
层
:通常的术语是
ply
,复数形式是
plies
,也有称为
levels
,当然与
depth
也是对应的。
这个术语是为了与比赛里常说的回合相区分,一个回合通常包含
2
步,这个
ply
就表示某一方
走了一步。根节点记为
0
层,以下的层数递增。
深度
depth
:要注意是从下到上的,还是从上到下的。(
1
)通常的算法书中都是从下到
上递增的,
即根节点为最大搜索深度,
走到最底部的叶子结点为
0
,
这种算法只要记住一个
depth
值就可以了。
(
2
)而另一种记法是根部结点为
0
,越向下
depth
增加,这时在搜索时就要传递
2
个参数值,
depth
和
maxDepth
,稍微有点啰嗦,应该也会影响一点效率。另外在探查置换
表中的结点时,用第(
1
)种记法也方便一些,因为要知道从当前节点迭代的深度值,否则还要
在置换表中保存
depth
和
maxDepth
两个值。
AlphaBeta
剪枝方法是对
Minimax
方法的优化,它们产生的结果是完全相同的,只不过
运行效率不一样。
这种方法的前提假设与
Minimax
也是一样的:
1
)双方都按自己认为的最佳着法行棋。
2
)对给定的盘面用一个分值来评估,这个评估值永远是从一方(搜索程序)来评价的,
红方有利时给一个正数,黑方有利时给一个负数。
(如果红方有利时返回正数,
当轮到黑方走棋
时,评估值又转换到黑方的观点,如果认为黑方有利,也返回正数,这种评估方法都不适合于常
规的算法描述)
3
)从我们的搜索程序(通常把它称为
Max
)看来,分值大的数表示对己方有利,而对于
对方
Min
来说,它会选择分值小的着法。
但要注意:用
Negamax
风格来描述的
AlphaBeta
中的评估函数,对轮到谁走棋是敏
感的。
也就是说:
在
Minimax
风格的
AlphaBeta
算法中,轮红方走棋时,评估值为
100
,轮黑方走棋评估
值仍是
100
。
但在
Negamax
风格的
AlphaBeta
算法中,轮红方走棋时,评估值为
100
,轮黑方走棋
时评估值要为
-100
。