`
包子_feiFEI
  • 浏览: 73102 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

Alpha_Beta 剪枝

 
阅读更多

收藏

Tic-Tac-Toe算法笔记

这几天在用Python写Tic-Tac-Toe小游戏,顺便接触了一些简单的人机博弈算法,其实在算法方面我完全算是个新手,所以这也算是一个反复折腾学习的过程。而Tic-Tac-Toe应该算是人机博弈里最简单的应用了,最经典的算法是miniMax算法,也叫极大极小值算法,主要方法就是通过考虑双方博弈N步后,从所有可能的走法中选一步最佳的走法来走。

先简单说说算法的基本思想:
1. 设博弈双方中一方为MAX,另一方为MIN。然后为其中的一方(计算机)找一个最佳走法。

2. 为了找到当前棋局的最优走法,需要对各个可能的走法所产生的后续棋局进行比较,同时也要考虑对方可能的走法,并对后续棋局赋予一定的权值(或者称之为分数)。也就是说,以当前棋局为根节点生成一棵博弈树,N步后的棋局作为树的叶子节点。同时从树根开始轮流给每层结点赋予Max和Min的称号

3. 用一个评估函数来分析计算各个后续棋局(即叶子节点)的权值,估算出来的分数为静态估值

4. 当端节点的估值计算出来后,再推算出父节点的得分。推算的方法是:对于处于MAX层的节点,选其子节点中一个最大的得分作为父节点的得分,这是为了使自己在可供选择的方案中选一个对自己最有利的方案;对处于MIN层的节点,选其子节点中一个最小的得分作为父节点的得分,这是为了立足于最坏的情况,这样计算出的父节点的得分为倒推值。

5.如此反推至根节点下的第一层孩子,如果其中某个孩子能获得较大的倒推值,则它就是当前棋局最好的走法。
miniMax

上次的MiniMax算法虽然在效果上已经达到了预期的目的,即不可战胜的棋力,但在效率上仍然不够理想。电脑每次走步都得估计往下N层棋局的所有情况并估值,层数虽然可以控制,但在大棋局(如五子棋,象棋等)游戏中如此生成的博弈树分支叶子仍然相当庞大,由此有了在此基础上进行“剪枝”的改进算法–Alpha-beta剪枝算法(Alpha-Beta algorithms)。此算法主要优点在于其在边生成博弈树时候边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。

还是简单说说算法的基本思想(再次声明此算法是建立在MiniMax算法基础上):
1. 对于一个MIN节点,若能估计出其倒推值的上确界Beta,并且这个Beta值不大于MIN的父节点(MAX节点)的估计倒推值的下确界Alpha,即Alpha≥Beta,则就不必再扩展该MIN节点的其余子节点了,因为这些节点的估值对MIN父节点的倒推值已无任何影响了,这一过程称为Alpha剪枝。
2. 对于一个MAX节点,若能估计出其倒推值的下确界Alpha,并且这个Alpha值不小于MAX的父节点(MIN节点)的估计倒推值的上确界Beta,即Alpha≥Beta,则就不必再扩展该MAX节点的其余子节点了,因为这些节点的估值对MAX父节点的倒推值已无任何影响了。这一过程称为Beta剪枝。
3. 一个MAX节点的Alpha值等于其后继节点当前最大的最终倒推值,一个MIN节点的Beta值等于其后继节点当前最小的最终倒推值

如果觉得还是有点难以理解(比如我第一次接触就觉得不知所云),看看下面的伪代码:

alpha-beta(player,board,alpha,beta)
    if(game over in current board position)
        return winner

    children = all legal moves for player from this board
    if(max's turn)
        for each child
            score = alpha-beta(other player,child,alpha,beta)
            (we have found a better best move....)
            if score > alpha then alpha = score
            (cut off...)
            if alpha >= beta then return alpha
        return alpha (this is our best move)
    else (min's turn)
        for each child
            score = alpha-beta(other player,child,alpha,beta)
            (opponent has found a better worse move.....)
            if score < beta then beta = score
            (cut off....)
            if alpha >= beta then return beta
        return beta (this is the opponent's best move)

简单的说,在MiniMax函数中我们已经知道,对于MIN节点,我们是要找其子节点的最小估值,如上面的代码,当min’s turn时候,我们先估值,如果 score < beta then beta = score,即是把MIN节点的孩子中的估值最小值给赋给Beta,这时候在判断Alpha是否大于等于Beta,Alpha是这个MIN节点的父亲节点的下界,即MAX节点,想一想,MAX应该是要找其子节点的最大估值,而它目前的下界Alpha都大于Beta了,那么可以遇见在将来这个MIN节点肯定不会被它的父亲MAX节点选取了,那么此时这个MIN节点可以停止继续展开孩子估值了,因为注定不会被选取,继续进行只是在浪费时间和资源。

上面讲的这个过程就好像两个人,其中一个人有几个口袋(即是几个MIN节点),每个口袋有几种东西,你(MAX)可以选取其中一个口袋,而无疑他会把你选取口袋里价值最低的物品给你(即MIN取最小值),而你为了获得最大收益只能判断这几个口袋所有的“最低价值物品”中那件还算是最有价值(即是MAX取最大值),MiniMax算法是你把对方所有口袋翻个遍再判断要哪个口袋,无疑这样效率不高。那么Alpha-Beta算法所做的就是:首先你先把第一个口袋里所以物品依次翻出来,假如第一个口袋里是车钥匙和手表,那么假如选这个口袋你只能得到手表,这个就是Beta了,因为此时还没有Alpha值,那么你把这个第一次获得的Beta再向上赋给Alpha,再翻第二个口袋,假如第一次翻出的是咸鱼(ew~~~),先赋给Beta,那么这个咸鱼Beta怎么说都比第一个口袋的表垃圾吧?!即此时手表Alpha >= 咸鱼Beta,因为对方只会把口袋价值最低的物品给你,这个口袋要么最低是咸鱼,要么还有比咸鱼给无语的东西,意味着这个口袋已经不值得在往下翻了,就算里面还有很多东西。

如果你把上面伪代码中的加粗部分去掉,那便是miniMax的算法,所以说这个算法其实是一个通过减少不必要的分支来节约时间资源的“砍枝”算法

分享到:
评论

相关推荐

    Alpha_Beta.rar_ alpha_beta_beta_neural pruning_原理图_很好

    本文将围绕“Alpha_Beta.rar”中的神经网络剪枝算法,即Alpha_Beta剪枝策略,进行深入探讨。 Alpha_Beta剪枝源于经典的棋盘游戏搜索算法,最初用于优化决策树搜索,以减少不必要的计算。然而,这一概念已被巧妙地...

    基于Alpha_Beta的五子棋(源码资源),界面简单,主要以实现AI算法为主

    本资源提供了一个基于Alpha_Beta剪枝算法的五子棋AI程序,通过C++语言实现,其目标在于展示如何运用这种经典的搜索算法来构建一个能与人类玩家对弈的智能系统。 Alpha_Beta剪枝算法是Minimax算法的一种优化版本,...

    Alpha_Beta算法实现人工智能作业

    4. **Alpha_Beta剪枝**:在Minimax的基础上,加入Alpha和Beta值的更新,当某一分支的评分已经无法影响最后的决策时,就提前终止该分支的搜索。 5. **输入和输出处理**:文件输入输出用于读取初始的游戏状态和记录...

    人工智能小项目,2048棋盘游戏,Alpha-beta剪枝算法, Expectimax搜索

    在这个名为"AI-2048"的人工智能小项目中,我们主要关注的是2048棋盘游戏的实现,以及两种优化搜索策略:Alpha-beta剪枝算法和Expectimax搜索。2048是一款非常受欢迎的数字拼图游戏,玩家通过合并相同数字的方块来...

    alpha-beta剪枝五子棋

    本文将深入探讨“alpha-beta剪枝五子棋”的实现及其与贪心算法的结合。 五子棋是一种策略性游戏,两个玩家轮流在棋盘上下棋,目标是形成连续的五个棋子线(横向、纵向或对角线)。由于五子棋的所有可能状态数量巨大...

    人工智能alpha-beta剪枝

    在人工智能领域,搜索算法是解决问题的关键技术之一,而Alpha-Beta剪枝是其中最著名、最高效的优化策略,尤其在棋类游戏的决策过程中。它结合了Alpha(α)和Beta(β)两个值,用于在多层深度优先搜索中避免无效的...

    wuziqi.rar_beta_五子棋 剪枝_五子棋beta_五子棋剪枝_剪枝五子棋

    同学些的五子棋,采用了alpha-beta剪枝算法,棋力很强

    alpha-beta剪枝算法实现中国象棋人机对战

    使用alpha-beta剪枝算法实现中国象棋人机对战,AI具有中级的智能,可以应对一般的象棋爱好者。

    tic_tac_toe.zip_beta_mfc 游戏界面_tic tac toe alpha_剪枝算法

    《基于MFC的井字游戏实现与Alpha-Beta剪枝算法详解》 井字游戏(Tic Tac Toe),又称圈圈叉叉游戏,是许多人童年回忆中的经典对战游戏。在计算机科学领域,将这种简单游戏与算法结合,能够帮助我们深入理解人工智能...

    Python使用Min-max算法和Alpha-Beta剪枝的黑白棋游戏AI代码 Pygame可视化

    # Python使用Min-max算法和Alpha-Beta剪枝的黑白棋游戏AI代码 Pygame可视化 本项目是基于pygame实现的黑白棋(翻转棋)游戏,通过Min-max算法和Alpha-Beta剪枝实现人工智能对手。 使用方法: 1. 安装 pygame: $ pip...

    简单的alpha-beta剪枝算法

    Alpha-beta剪枝是一种在棋盘游戏中优化搜索策略的算法,它是Minimax算法的改进版本,用于减少不必要的计算,提高搜索效率。在这个简单的alpha-beta剪枝算法中,我们将深入理解其原理、实现步骤以及如何构建搜索树。 ...

    一篇讲alpha-beta 剪枝及其算法分析的论文

    Alpha-Beta剪枝首先由Donald E. Knuth 和 Ronald L. Moore 提出,并在他们1975年的论文《An Analysis of Alpha-Beta Pruning》中进行了详细分析。这篇论文主要目的是分析Alpha-Beta剪枝算法,提供对其性能特征的定量...

    alpha-beta剪枝讲解

    这个是我们老师在上课时对alpha-beta剪枝的解释,个人觉得比较容易理解,因为在博客中无法上传视频,所以只能上传为资源了.对于这个视频我有相应的博客解释.

    JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络).zip

    JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络) JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络) JS五子棋AI,源码+教程,基于Alpha-Beta剪枝算法(不是神经网络) JS五子棋AI,...

    人工智能alpha-beta剪枝五子棋程序

    Alpha-beta剪枝是一种优化的搜索算法,常用于棋类游戏的人工智能程序中,以提高决策效率。本项目聚焦于五子棋,这是一种简单但策略丰富的两人对弈游戏。下面我们将详细探讨“人工智能alpha-beta剪枝五子棋程序”的...

    人工智能小游戏-基于alpha-beta剪枝算法实现的五子棋源码

    ======================================================================== MICROSOFT FOUNDATION CLASS LIBRARY : fir ======================================================================== ...

    中国象棋python实现 Alpha-beta剪枝+GUI+历史启发式+有普通人棋力

    不用神经网络强化学习,只用alpha-beta剪枝和搜索实现的下象棋!我们的中国象棋使用python实现,总共2000+行代码,分为走法计算、评估函数与搜索和UI三部分,并采用历史启发算法进行优化,有着不错的效果。可以实现...

    精选_基于alpha-beta剪枝博弈树算法实现的一字棋游戏_源码打包

    在这个基于alpha-beta剪枝的博弈树算法实现中,我们深入探讨如何利用计算机科学中的智能算法来创建一个能与玩家对战的智能系统。本文将详细介绍alpha-beta剪枝算法及其在一字棋游戏中的应用。 首先,我们要理解博弈...

    基于alpha—beta剪枝算法的五子棋游戏(java)

    可以关注公众号“拾遗自陈”,回复“五子棋”三个字... 自己开发的基于alpha-beta剪枝算法的五子棋游戏,具有悔棋,可选择禁手,支持人机对战,人人对战,先手选择等功能。整个系统基于Java语言开发,界面美观大方。

Global site tag (gtag.js) - Google Analytics