人工智能之博弈二、最大最小值方法

现在我们来看看博弈树节点标注的另一种方法:最小最大值方法。整个博弈树尽管大的出奇,然而在只有一部分有用的情况下,利用最小最大值方法是有其优点的,很容易推广使用。

比方说,竞赛的结果是以钱为赌注的。为方便起见,设赌金为一块钱。如果棋手赢的,他就获得一块钱;如果他输了,这输一块钱。在和局的情况下,他不输也不赢。 

我们把棋手赢的钱称之为收益。如果棋手赢了,其收益为1;如果输了,收益为-1;和局时为0。 

现在我们来定义一个节点的值。对于w节点其收益为1;l为-1;d为0。

我们用不着一定要先把节点标上w、d或l,然后再去注明它们的值,而是可以直接计算出它们的值。 

前面我们已经知道,对于每一个叶节点,比赛的结果或者是赢、或者是输、或者是和局。因此我们先把比赛能赢的那些叶节点标上1,把和局的节点标上0,把输的节点标上-1。

如同我们前面说过的那样。从叶节点开始,其余节点按照其子节点的值来计算出它的值,一直到把根结点的值算出来。

这种计算后面所包含的想法是:棋手总是选择能得到最大收益的棋步;而对手总是选择通往最小收益的棋步。更确切地说,我们按下面的规则来计算每个节点的值: 

  1. 轮到棋手走时,节点的值是其子节点之中的最大值。 
  2. 轮到对手走时,节点的值为其子节点中的最小值。


到现在为止,最大最小值方法已经给我们提供了一个简明而有效的手段来标注博弈树的节点。然而,这种方法不是采用任意的标号,如前面所说的w、l或d来标注节点,而是用数字来标注。这样做使得我们能够很容易的推广这个方法,不用把节点的值局限于1、0或-1。

终局评价

现在我们终于要面临这样一个不能回避的问题:即对于其国际象棋这样一类的比赛,我们不可能建造一个完整的博弈树。甚至也不可能建造该博弈树的基本部分。我们充其量所能做到的,就是围绕目前正在下的棋局,把博弈树中的很小一部分建造出来。

这样一来,我们所建造起来的博弈树的根就不再是棋赛的起始棋局,而是轮到棋手走的那个棋局。在博弈树中,我们对那些已经下过的棋局并不感兴趣,而只关心那些将要下的棋局。 

同样的,这时博弈树的叶也不再代表这场棋赛赢、输或者和棋的终局,而是表示在合理的时间和允许的存储空间内,比赛路径所能达到的博弈树的最远的节点。
 

我们还是沿用以前采用的方法,把对应于叶节点的棋局叫做终局。那么,什么是终局的判断标准呢?或者更确切的说,在探索一条特定的比赛路径时,什么时候终止这种探索对竞赛才是有意义的呢?

一般我们倾向于首先对终局标上它们各自的值,用以反映每个终局对棋手的价值。然后我们用最小最大值方法来处理这些值。因此在考虑到双方所拥有的棋子的数量、类型以及它们在棋局中的作用等因素以后终局的值就可以很可靠的评价出来。 

如果有一个棋局不能用这种方法来进行可靠的评价,那么该棋局就不是一个合适的终局。

深度优先的最小最大值评价方法 

现在我们回头来看看棋手对当前的棋局是如何考虑的,以及应如何决定下一步的走法。假设有了一种方法,它对任何棋局都可以给出所有的合法棋步,同时还能给出采用这些合法棋步中任何一步以后所形成的新的棋局。另外我们假设已经有了上面所谈到判断终局的方法。我们希望能决定棋手应走的棋步。 

我们从当前的棋局开始,将其扩展,然后再扩展它的子棋局,如此类推。这样我们就得到了一个部分博弈树。但是,每一个结点在展开之前,我们都要先检测这个节点是否为终局。如果是终局那么就不展开这个节点;如果不是那么就展开它。

上述的扩展一直进行下去,直到所有的节点都不能再展开为止。最后我们得到了这样一个博弈树,它的根结点对应于当前的棋局而其叶节点对应于我们认为的终局。 

应用最小最大值方法,我们对该博弈树的每一个结点都标注上一个值。如前所述,棋手所要走的节点,它的值是其所有子节点中的最大值;而对手所走的节点,它的值是其所有子节点中的最小值。由于这些节点的计算方法本身的原故,那些非叶节点所标注的值通常称为回溯值。

对棋手来说,他所选择的最佳棋步就是能够得到具有最大回溯值棋局的棋步。 

在对手的下一步棋走完以后,那么就要从这时的当前棋局开始建造一个新的博弈树。这一过程会不断重复。因此,每一个部分博弈树实际上只是用来决定一步棋。真正用到的值仅仅是根的子节点的回溯值。这些子节点所对应的棋局就是棋手自由选择棋步所能走到的棋局。 

实际上,我们的确用不着一次就把整个博弈树储存起来。如果运用一个叫做深度优先的最小最大值方法,那么在只储存整个博弈树的很小一部分的情况下,我们也能计算出根的子节点的值。当节点需要计算其值时,我们就产生这个节点;当节点已经完成它的使命之后,我们便删除这个节点。

同所有的深度优先方法一样,深度优先的最小最大值方法是从根部开始处理,沿着从亲节点到子节点的方向进行,直到遇到终局为止。然后再返回,一直到找到另一条未曾探索的路径,再沿着这条路径到终局为止,如此类推。 

这一方法可以同时既建立博弈树,又对其节点进行估值计算。在沿着从亲节点到子节点的方向采用这一方法时,节点是展开的。当节点第一次展开时,只新建了一个子节点。其他子节点只有在过程返回并重新访问该节点时才建立。只有那些处于当前正在搜索路径上的子节点以及那些尚未标注回溯值的子节点才被储存起来。 


当采用这种方法达到终节点时,就使用评价函数来处理该终节点所对应的棋局,并对该节点标上评价值。然后,这种过程又回溯到终结点的新节点上去。 

如前所述,在回溯期间如果访问到某个节点,通常要对该节点继续进行扩展,产生一个新的子节点,进而在对该新的子节点进行处理。实际上,该节点的所有子节点最终都会产生出来(即相应的棋局的所有合法棋步都会被探测到)。在处理过程重新遇到该节点时,就根据其子节点的值来计算出该节点的回溯值。是取这些之节点中的最大值还是最小值作为回溯值,这取决于轮到哪一方下棋。这时所有的子节点就不再有用了,可以删除掉。程序过程又回到刚刚赋值的亲节点上,再继续上述过程。

除了那些正处于扩展路径上的子结点以外,我们不需要储存任何别的子节点。我们对每一节点只标出其部分回溯值。在该节点产生时,该值作为节点的初始值;在以后节点每次被重新访问时,该值都会被更新。在任何时候,一个节点的部分回溯值总是其计算出来的子节点中的最大值或最小值。当一个节点的所有子节点的值都计算出来以后,其部分回溯值就作为该节点的值,也就是所有子节点中的最大值或者最小值。

对于轮到棋手下棋的一个节点来说,其部分回溯值一开始就给定为一个很大的负数。当重新访问到这个节点时,就要把这个值同刚刚计算出来的子节点的值进行比较,取它们中间大的那个作为该节点的新的回溯值。

对于轮到对手下棋的一个节点来说,其部分回溯值一开始就给定为一个很大的正数。当重新访问到这个节点时,就要把这个值同刚刚计算出来的时间点的值进行比较,取它们中间小的那个作为该节点的新的回溯值。 

在我们需要储存的任何时刻,应该储存的节点仅仅是从根节点到该时刻当前节点之间的路径上的那些节点。把这些节点储存到堆栈中是非常方便的。在堆栈中,根节点在底部,当前节点在顶部。 

尽管我们能实现只储存博弈树中从根节点到当前节点中的那一部分,但是却不能保证说这是最佳的方法。有些程序就是把整个博弈树储存起来的,以便先前查看过的对弈路径能被重新访问,从而做进一步的的查询。然而,在储存空间受到限制时,这种节省空间的方法却是富有吸引力的。 

⼈⼯智能技术导论——博弈树搜索 我在之前整理过⼀篇博客关于博弈论和纳什均衡的⼏个例⼦ 这⾥来介绍博弈树搜索。 ⼀、博弈树的概念 ⼀、博弈树的概念 在博弈过程中, 任何⼀⽅都希望⾃⼰取得胜利。因此,当某⼀⽅当前有多个⾏动⽅案可供选择时, 他总是挑选对⾃⼰最为有利⽽对对⽅最 为不利的那个⾏动⽅案。 此时,如果我们站在A⽅的⽴场上,则可供A⽅选择的若⼲⾏动⽅案之间是"或"关系, 因为主动权操在A⽅⼿⾥,他或 者选择这个⾏动⽅案, 或者选择另⼀个⾏动⽅案, 完全由A⽅⾃⼰决定。当A⽅选取任⼀⽅案⾛了⼀步后,B⽅也有若⼲个可供选择的⾏动⽅案, 此时这些⾏动⽅案对A⽅来说它们之间则是"与"关系,因为这时主动权操在B⽅⼿⾥,这些可供选择的⾏动⽅案中的任何⼀个都可能被B⽅选 中, A⽅必须应付每⼀种情况的发⽣。 这样,如果站在某⼀⽅(如A⽅,即在A要取胜的意义下), 把上述博弈过程⽤图表⽰出来, 则得到的是⼀棵"与或树"。 描述博弈过程的与 或树称为博弈树,它有如下特点:   (1) 博弈的初始格局是初始节点。   (2) 在博弈树中, "或"节点和"与"节点是逐层交替出现的。⾃⼰⼀⽅扩展的节点之间是"或"关系, 对⽅扩展的节点之间是"与"关 系。双⽅轮流地扩展节点。   (3) 所有⾃⼰⼀⽅获胜的终局都是本原问题, 相应的节点是可解节点;所有使对⽅获胜的终局都是不可解节点。 ⼆、极⼩极⼤值分析法 ⼆、极⼩极⼤值分析法 在⼆⼈博弈问题中,为了从众多可供选择的⾏动⽅案中选出⼀个对⾃⼰最为有利的⾏动⽅案, 就需要对当前的情况以及将要发⽣的情况进 ⾏分析,从中选出最优的⾛步。最常使⽤的分析⽅法是极⼩极⼤分析法。 其基本思想是: (1) 设博弈的双⽅中⼀⽅为A,另⼀⽅为B。然后为其中的⼀⽅(例如A)寻找⼀个最优⾏动⽅案。   (2) 为了找到当前的最优⾏动⽅案, 需要对各个可能的⽅案所产⽣的后果进⾏⽐较。具体地说, 就是要考虑每⼀⽅案实施后对⽅可能采取 的所有⾏动, 并计算可能的得分。 (3) 为计算得分,需要根据问题的特性信息定义⼀个估价函数, ⽤来估算当前博弈树端节点的得分。此时估算出来的得分称为静态估值。 (4) 当端节点的估值计算出来后, 再推算出⽗节点的得分, 推算的⽅法是:对"或"节点, 选其⼦节点中⼀个最⼤的得分作为⽗节点的得 分,这是为了使⾃⼰在可供选择的⽅案中选⼀个对⾃⼰最有利的⽅案;对"与"节点, 选其⼦节点中⼀个最⼩的得分作为⽗节点的得分,这是为 了⽴⾜于最坏的情况。这样计算出的⽗节点的得分称为倒推值。 (5) 如果⼀个⾏动⽅案能获得较⼤的倒推值, 则它就是当前最好的⾏动⽅案。 倒推值的计算 在博弈问题中,每⼀个格局可供选择的⾏动⽅案都有很多, 因此会⽣成⼗分庞⼤的博弈树。据统计,西洋跳棋完整的博弈树约有1040个节 点。试图利⽤完整的博弈树来进⾏极⼩极⼤分析是困难的。可⾏的办法是只⽣成⼀定深度的博弈树, 然后进⾏极⼩极⼤分析,找出当前最好的 ⾏动⽅案。在此之后, 再在已选定的分⽀上扩展⼀定深度, 再选最好的⾏动⽅案。如此进⾏下去, 直到取得胜败的结果为⽌。⾄于每次⽣成博 弈树的深度, 当然是越⼤越好, 但由于受到计算机存储空间的限制, 只好根据实际情况⽽定。 例 ⼀字棋游戏。设有如图(a)所⽰的九个空格, 由A, B⼆⼈对弈, 轮到谁⾛棋谁就往空格上放⼀只⾃⼰的棋⼦, 谁先使⾃⼰的棋⼦构成"三⼦ 成⼀线"谁就取得了胜利。 ⼀字棋 设A的棋⼦⽤"a"表⽰, B的棋⼦⽤"b"表⽰。为了不致于⽣成太⼤的博弈树,假设每次仅扩展两层。估价函数定义如下:  设棋局为P,估价函数为e(P)。    (1) 若P是A必胜的棋局, 则e(P)=+ 。   (2) 若P是B必胜的棋局, 则e(P)=- 。  (3) 若P是胜负未定的棋局, 则 e(P)=e(+P)-e(-P) 其中e(+P)表⽰棋局P上有可能使a成为三⼦成⼀线的数⽬; e(-P)表⽰棋局P上有可能使b成为三⼦成⼀线的数⽬。 例如, 对于图(b)所⽰的棋局, 则 按照棋盘上红⾊连线安放棋⼦a使得三⼦成⼀线,共6条连线。 按照棋盘上蓝⾊连线安放棋⼦b使得三⼦成⼀线,共4条连线。 e(P)=6-4=2 另外,我们假定具有对称性的两个棋局算作⼀个棋局。还假定A先⾛棋, 我们站在A的⽴场上。 下图给出了A的第⼀着⾛棋⽣成的博弈树。图中节点旁的数字分别表⽰相应节点的静态估值或倒推值。由图可以看出, 对于A来说最好的⼀着 棋是S3,因为S3⽐S1和S2有较⼤的倒推值。 ⼀字棋极⼩极⼤搜索 在A⾛S3这⼀着棋后,B的最优选择是S4, 因为这⼀着棋的静态估值较⼩,对A不利。不管B选择S4或S5,A都要再次运⽤极⼩极⼤分析法产⽣ 深度为2的博弈树,以决定下⼀步应该如何⾛棋, 其过程与上⾯类似, 不再
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值