为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

博弈树

2019-01-22 10页 doc 30KB 31阅读

用户头像

is_005190

暂无简介

举报
博弈树博弈树 实现计算机与人对弈,诸如象棋、围棋等双方对垒的游戏,是一件饶有趣味的事情。在这里,我们将讨论实现这种人机完备信息博弈时常用的树型结构及其基本算法。所谓人机完备信息博弈,是指人机对垒,依次轮流走步,而且双方的走步信息完全公开。 为了引起对弈者的兴趣,计算机一方必须尽可能多地知道对方己经走过的棋步和将可能走的棋步。对于编程者来说,要使得计算机能懂得比赛规则并记住当前格局,就得建立恰当的数据结构;要使得计算机能在对弈中选择最可能致胜的走步,就得为之设计一个“聪明”的算法。 博弈树适应了这两个需要,它将对垒的初始格局作...
博弈树
博弈树 实现计算机与人对弈,诸如象棋、围棋等双方对垒的游戏,是一件饶有趣味的事情。在这里,我们将讨论实现这种人机完备信息博弈时常用的树型结构及其基本算法。所谓人机完备信息博弈,是指人机对垒,依次轮流走步,而且双方的走步信息完全公开。 为了引起对弈者的兴趣,计算机一方必须尽可能多地知道对方己经走过的棋步和将可能走的棋步。对于编程者来说,要使得计算机能懂得比赛规则并记住当前格局,就得建立恰当的数据结构;要使得计算机能在对弈中选择最可能致胜的走步,就得为之一个“聪明”的算法。 博弈树适应了这两个需要,它将对垒的初始格局作为根结点,把所有由初始格局经过合法一步得到的新格局作为其子结点,然后以新格局为根,由此新格局产生的格局为其子结点,依次类推,得到一棵包罗对垒中各种可能格局变化的树,并通过对这棵树的遍历,分析确定计算机的走步。这棵树就是这里所说的博弈树。 [例1]井字棋游戏 问描述: 从一个空的3*3的棋盘开始,甲乙二人轮流放置棋子到棋盘上未被占据的方格中。如果甲第一个放,他把棋子放在中央方格里;然后轮到乙放,他把棋子放在第一行中间的方格里;于是又轮到甲放,……,如此进行下去,判定胜负的方法是:若某一游戏者若有3枚棋子占据了一横线或一竖线,或一对角线,则该游戏者获胜;若至整个棋盘被占满还没有一方获胜,则为平局。 算法分析: 我们让计算机模拟甲方,称为max选手,与计算机对手的乙方称min选手,上述博弈由这两位选手对垒,双方依次轮流走步。 博弈树以棋盘状态作为结点。开始时空棋盘作为树根,max先放。max选择某个空格放置棋子后的棋盘所有可能状态,都作为根的子结点出现在树的第一层。第二层的结点是min 方走完后的可能棋盘状态,min方从第一层的某个结点出发,选择某个空格放置棋子后的所有可能棋盘状态都作为该结点的子结点出现在第二层。下图的树称作博弈树,树根并不是空棋盘,这棵树的第二层并不是游戏终止时的棋盘状态,我们还可以画出第三层、第四层、……的结点,但在一般情况下,由于计算机存储器大小和运算速度的限制,不能把博弈树构造到游戏终止时的棋盘状态,而只能构造到某一特定的深度。 从图中可以看出,博弈树具有以下特点: 1、奇数层(min 层)结点,是max 方的走后状态,下一步轮到min 方走步。 偶数层 (包括0层在内,max 层)结点是min 方的走后状态 (除初始状态外),下一步轮到max 走步。 2、博弈树的叶子示对垒的终结状态,即某方取胜或者和局。在奇层到达终结状态时,max 方能取胜或和局;在偶层到达终结状态时,min 方或者胜或者和局。 在构造一棵博弈树时,计算机的目的是寻找一步好棋,然后走完这一步,等待对方回手,并从这个新的位置上再次寻求一步好棋。由于时空限制,终局条件除获胜和和局外,还需要指出希望产生的深度为多少。一般说来,博弈树的实际深度不可能达到游戏的最长的有效序列的长度。例如井字棋要放9次棋则要产生9+9*8+9*8*7+…+9!个结点,计算机无论如何都满足不了这种储存量。在对垒过程中,max(计算机)方要战胜对方,它必须有一个使它获胜机会最大的优先走步的估计,这个估计可以通过对博弈树的叶结点使用静态估价函数的办法来实现。 但是利用深度为1的博弈树来确定下一步棋的走法,也就是说只向前看一步就决定怎样走是难于保证取胜的,应尽可能加大博弈树的深度,多考虑几步。 再来定义一个极大极小过程search(q),通过加大博弈树深度的办法来重新估算当前棋盘状态q 对计算机有利的程度。设cl ……cd 为非终局棋盘状态q 在博弈树中的后继棋盘状态 (有d 种可能的下法产生): search(q)=min q )}(min{max q (ci)}max{search 0min maxint -max int max 层 非终局状态,属于,层 非终局状态,属于,和局 ,方胜 ,方胜 ,ci search 定义这个极大极小过程的道理是显而易见的。我们设想,如果max 方在叶结点之间进行选择,那么它就会选择具有最大估价值的结点,即对于计算机最有利的状态。所以min 层结点的父结点(max 层结点)所赋的倒推值等于叶结点估价值中的最大值;另一方面,如果min 方在叶结点之间进行选择,那么他大概总是选择具有最小估价值的结点,即对于计算机最不利的状态。所以max 层叶结点的父结点(min 层结点)所赋的倒推值等于叶结点估价值中的最小值。在所有叶结点的各个父结点都已经赋好倒推值之后,我们再向上倒推一层的值,还是假设max 总是选择具有最大倒推值的结点而min 总是选择具有最小倒推值的结点。我 门继续一层一层地向上计算倒推值,最后直至根结点被赋值为止。根结点则在第一层结点中选择具有相同倒推值的那一个结点作为它的下一步。这种从叶结点开始,逐层倒推赋值至根结点的过程,就是后序遍历博弈树的过程。 例如上图中各结点中标的值就是用极大极小过程确定的。方形结点所在的层称为max 层,对于max层的所有结点来说,轮到计算机走下一步。圆形结点所在的层称为min层,对于min层的所有结点来说,轮到对方走下一步。树根代表的棋盘状态P01的值为3,就是说从该棋盘状态出发,计算机所能保证的最好结果是达到一个值为3的棋盘状态,也是为了避免立即败北而被迫走的一步。如果计算机从P01状态出发选择下一个状态P11,企图达到P21而获胜,但下一步轮对方走,min方会选择P22,结果计算机只好拱手认输。在状态P01处,计算机的最好选择是状态P12。 在按照后序遍历的次序估算各结点值,构造博弈树的过程中,一旦求出了根的值和确定了下一步的走法,当前构造的博弈树就没用了,到确定以后的走法时,需要构造的是博弈树的另一部分,而效率取决于每次构造的博弈树的规模。是否每次都一定要构造整棵博弈树才能确定树根的search值呢? 我们可以分析一下,在求search(P01)的过程中,当求出search(31)=3以后,因为P23处于max层,所以就已经知道search(P23)的值至少等于3;接着,当求出search(P45)=2以后,因为P32处于min层,所以就已经知道search(P32)的值至多等于2。(P32)的值不可能影响search(P23),而不管P32的其余子女的search值为多大。由此可见,不生成结点P46绝对不会影响max的最好的优先走步。 为了减少每次计算树根的search值而进行的遍历的结点个数,我们使用一种称为α-β剪枝的优化措施。 α剪枝——一个max层结点的α值定义为该结点的最小可能值。如果已经确定一个min层结点的值小于或等于它的父结点的α值,则可以停止产生这个min层结点的其它子结点。 例如上图中,一旦P31的值确定为3,则P23的α值成为3,search(P45)小于P23的α值,就意味着P46可以不必产生了。 β剪枝——一个min层结点的β值定义为该结点的最大可能值。如果己经确定一个max层结点的值大于或等于它的父结点的β值,则可以停止产生这个max层结点的其它子结点。 -,确定了例如上图中,一旦search(P25)的值确定为∞,则P13的β值成为∞ search(P33)的值为0,大于P13的β值,从而确定了P26的α值大于P13的β值,于是P26的其余子结点就不必产生了。 α-β剪枝就是α剪枝与β剪枝的规则结合。 事实上,使用α-β剪枝,上图P26为根的子树都不必产生。这是因为当search(P12)的值确定为3时,P01的α值成为了3,search(P25)小于P01的α值,那就可以确定P13的β值小于P01的α,于是就可以进行α剪枝。 一般地讲,若当前结点的倒推值为value,它的父结点的倒推值为oldvalue,走步对象用mode表征(mode值为max或min),则α-β剪枝过程可以描述如下: if ((mode=max) and (valueoldvalue)) then 生成子结点,继续极大极小过程 else 裁剪以当前结点为根的子树; 当根结点及其子结点的最终倒推值全都求出时,上述过程便宣告结束,而最好的优先走步就是走向具有相同倒推值的那个子结点。在搜索深度相同的条件下,采用这个过程所获得的走步总是和一般的极大极小过程一样的好。区别在于由于增加了α-β剪枝,通常不必构造整个博弈树便可以正确地求出根结点的倒推值和确定下一个最好的优先走步。在同样的存储需求的条件下,博弈树的深度比较一般的极大极小过程可以增加一倍。 例2(URAL1195) 给你一个棋盘状态,X和O方都走了3步还未分出胜负,X先走。如果接下来,两人都走最佳策略,要你判断谁会获胜或者平手。#号表示棋盘上空的位置。如果X方获胜,输出"Crosses win",若O方获胜,输出"Ouths win";如果平手,输出"Draw"。 输入 XXO #X# #OO 输出 Ouths win 这道题比较简单,博弈树的层数很小,且不需要指出下一步的走法。主要是让大家体会一下极大极小过程。 例3 古时候有一高人发明了一种二人对弈的游戏――控制棋。游戏规则如下:在一个棋盘上有N个点,两点之间如画有一条线则表示两点相连,两点之间只有一条边,且一个点不能与自己相连。两人轮流把起棋子放在点上,如果一点被放上棋子,则这一点和与之相连的点就都被控制了。不能把棋子放在被控制的点上。初始时,棋盘上的点都没有被控制。当轮到某一方下而无法落子时,另一方得胜。 由于控制棋变化多端,从发明到现在没有一个人可以根据棋盘的初始状态来判定先手是否必胜。请你编程来解决这个千古难题。 【输入】 输入第一行为一个整数K(1<=K<=25),表示文件包含K个版块。每个版块由若干行组成,版块间有一空行隔开,每个版块描述一个棋盘,棋盘用一个邻接矩阵A表示。A[i,j]=1表示点i和点j间有边相连,如果A[i,j]=0则示不相连。每个版块的第一行包括整数(1<=N<=30),N是棋盘的顶点数。以下N行为一个棋盘。 【输出】 包含K行,每行为一个数。若对于第i个棋盘,先手必胜,则输出'1',否则输出'0'。 样例 输入 1 12 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 0 输出 例4 把六个顶点的完全图作棋盘,开始时每条边都是无色的。红和蓝轮流,每步选一条无色的边涂上自己的颜色。红先。第一个在棋盘上画出一个同色三角形为输。谁有必胜的策略? 感觉是先走的会输,后走的似乎总能挨到最后。显然的是,6点完全图必定有同色三角形。你能验证吗?
/
本文档为【博弈树】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索