python alpha beta 剪枝_AlphaBeta剪枝算法

AlphaBeta剪枝算法是搜索方法的基础,用于提高Minimax算法的效率。文章详细介绍了节点、 ply、深度等概念,并对比了两种不同的深度记法。AlphaBeta剪枝假设双方最优走法,通过评估值来判断局面优劣,轮到搜索程序走棋时,高评估值表示有利。Negamax风格的AlphaBeta算法中,评估值会根据走棋方改变符号。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 Python 实现 Alpha-Beta 剪枝算法的代码: ```python # 定义估值函数 def eval(board): # 估值函数的具体实现 pass # 定义 Alpha-Beta 剪枝算法 def alpha_beta(board, depth, alpha, beta, maximizing_player): # 判断是否达到了搜索深度或游戏结束 if depth == 0 or game_over(board): return eval(board) # 如果当前玩家是最大化玩家 if maximizing_player: max_eval = float('-inf') for move in possible_moves(board): new_board = make_move(board, move) eval = alpha_beta(new_board, depth-1, alpha, beta, False) max_eval = max(max_eval, eval) alpha = max(alpha, eval) if beta <= alpha: break return max_eval # 如果当前玩家是最小化玩家 else: min_eval = float('inf') for move in possible_moves(board): new_board = make_move(board, move) eval = alpha_beta(new_board, depth-1, alpha, beta, True) min_eval = min(min_eval, eval) beta = min(beta, eval) if beta <= alpha: break return min_eval # 调用 Alpha-Beta 剪枝算法 alpha_beta(board, depth, float('-inf'), float('inf'), True) ``` 其中,`eval()` 函数是评估当前局面的函数;`alpha_beta()` 函数是 Alpha-Beta 剪枝算法的实现,其中 `board` 表示当前局面,`depth` 表示搜索深度,`alpha` 和 `beta` 分别表示当前最小值和最大值,`maximizing_player` 表示当前是否是最大化玩家;`possible_moves()` 函数返回当前局面下可行的落子位置;`make_move()` 函数返回在当前局面下下某个位置落子后的新局面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值