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算法虽然在效果上已经达到了预期的目的,即不可战胜的棋力,但在效率上仍然不够理想。电脑每次走步都得估计往下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的算法,所以说这个算法其实是一个通过减少不必要的分支来节约时间资源的“砍枝”算法

http://hi.baidu.com/highsam/blog/item/5a70011381b70f8a6438db52.html

Alpha_Beta 剪枝相关推荐

  1. 知识点-极大极小搜索+alpha_beta剪枝

    知识点-极大极小搜索+alpha_beta剪枝 解决问题 ​ 博弈类游戏 概要 ​ 其实就是用深度搜索搜索博弈的策略,博弈中两个人轮流进行游戏,在算法里转化为在搜索的不同深度下选取不同的搜索策略,一般 ...

  2. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  3. 博弈论探讨及题目总结

    转载自爱神博客:http://blog.csdn.net/acm_cxlove/article/details/7854526 首先当然要献上一些非常好的学习资料: 基础博弈的小结:http://bl ...

  4. 步步为营-墙棋AI人机对战(Android)

    放纵了三天了,之前写了一半懒得去动的墙棋,反而在这几天间隙断断续续完成了,也是挺可笑的. 简介-关于墙棋 路墙棋(Quoridor),或译墙棋.步步为营,是由Mirko Marchesi(米尔科·迈凯 ...

  5. 五子棋AI图形界面人机对战(JAVA实现)

    前言 改了又改,查了又查,想了又想,我真的不知道怎样让它再聪明了,大多时候走的都是正确的,但偶尔会蹦出那么一步臭棋,全盘皆输.希望有相关经验的道友看到后可以指出原因和不足. 效果图 按钮什么的还未完成 ...

  6. [笔记]极大极小过程的alpha-beta剪枝不可与记忆化搜索一起使用

    今天做SGU 423,WA得我眼泪汪汪.后来发现原来这个问题很早就被何牛提到过: 极大极小过程的alpha-beta剪枝不可与记忆化搜索一起使用. 原因是这样的: 在一个博弈图中,可能存在这样的情况: ...

  7. min_max算法和alpha-beta剪枝 python实现

    根据bilibili上一个up主的视频写的代码 以此文记录备忘 先定义Node类,用于构造需要剪枝的二叉树 class Node:""":param value 该节点的 ...

  8. 剪枝计算机,α-β剪枝 - 电脑黑白棋 - 黑白棋天地

    α-β剪枝算法 前面介绍的基本搜索算法,在实际应用是是十分费时的,因为它需要考虑所有可能的棋步.有研究表明,在黑白棋的中盘阶段,平均每个局面大约有10步棋可供选择[1].如果程序前瞻10步(搜索深度为 ...

  9. JAVAFX基于α-β剪枝树的五子棋人机博弈

    Main主类: 背景图片和音乐就不传了 package application;import java.util.Optional; import javafx.application.Applica ...

最新文章

  1. Android之利用回调函数onCreateDialog实现加载对话框
  2. 日语输入法电脑版_日语输入法下载及使用教程【建议收藏】
  3. qt creator 构建(build) 执行cmake 部署的区别?(未解决)
  4. swagger报错 java.lang.NumberFormatException: For input string: ““
  5. Hyperledger Fabric 交易流程
  6. leetcode--数组(Medium1)
  7. 字符串乘一个数_【思维拓展】三位数乘两位数,构造最大积和最小积
  8. 在web3上搭建ecshop网上商城
  9. 大数据_Flink_数据处理_流处理API_Transform(2)_滚动聚合算子_keyBy_sum_min_max_minBy_maxBy---Flink工作笔记0030
  10. js 中的switch
  11. 达观数据个性化推荐系统实践
  12. 同比和环比的计算方式
  13. HTML网页设计制作大作业-制作漫画网页设计6个页面(HTML+CSS+JavaScript)
  14. Compose for Desktop (Kolin跨平台编写Mac微信应用)
  15. 大数据思维,到底是什么?
  16. 基于Android studio 的学生课堂管理app
  17. Oracle 计算两个时间的差值
  18. 让VBOX支持USB
  19. 0基础小学生做的网站
  20. HashMap 在 JDK1.7 和 JDK1.8 中有哪些区别?

热门文章

  1. 二次同余方程模合数的一般解法
  2. CVE-2022-38817
  3. 【动手学习pytorch笔记】24.门控循环单元GRU
  4. 什么是Ubuntu PPA以及为什么要用它[技术说明]
  5. jQuery实现电影海报特效
  6. 440 亿美元成交!Twitter “卖身”马斯克
  7. F5负载均衡、Juniper防火墙等设备取消CLI分页的命令
  8. ETO的公开赛T3《寻星》 题解(BY 超級·考場WA怪 )
  9. 安妮股份联合九次方大数据构建中国知识产权大数据生态圈
  10. 操作系统——分页分段算法c++实现