博弈树(game tree)是一种特殊的根树,它是人工智能领域一个重要的研究课题。博弈树可以表示两名游戏参与者之间的一场博弈(游戏),他们交替行棋,试图获胜。

例如,考虑在 3×3 的九宫格棋盘上进行的“井字棋”游戏(tic-tac-toe)。

  • 最初,所有9个小方格都是空的(如下图(a)所示)
  • 两名游戏者A和B交替行棋——A选择一个空的小方格并写下符号×,而B则选择空的小方格写下符号〇
  • 首先使得己方符号中的3个在棋盘上形成直线(对角线、水平线或垂直线)者获胜(如下图(b)所示)。

博弈树生成算法java 博弈树包括_博弈树生成算法java

该游戏中所有策略的集合可以由一棵巨大的根树来表示,树中的每个顶点都对应于棋盘的一个布局(configuration)。所谓“棋盘的一个布局”,是在游戏过程中通过标记棋盘上的小方格得到的。

但要注意,棋盘上的某些标记方案不是布局:4个小方格标记为×,1个小方格标记为¡的这种情况——由于游戏参与者是交替行棋的,所以永远无法达到这样的标记方案。

在此树中,根对应于所有小方格都为空的布局。继而,游戏者A行棋——她有9个选择。因此,根有9个孩子顶点,每个孩子顶点对应于在9个小方格之一内写下符号×。考虑根的一个孩子顶点v(棋盘上恰有一个符号×)。在v处,轮到游戏者B行棋。B有8个选择,因此v将有8个孩子顶点(参看下图,为简洁起见,忽略掉了对称的情况)。

不断画下去可以看到这棵树至多有9层,其中偶数层(根所在的最高层记做0层)对应着轮到游戏者A行棋,而奇数层对应着轮到游戏者B行棋。有三个同类符号位于同一直线上的顶点对应于有一个游戏者获胜的情况,这样的顶点是该根树的叶子。类似的,所有九个小方格都被标记的节点也是叶子节点(它可能对应于无人获胜的情况,如上图9.1所示)。这就是该游戏的博弈树,也称作对策树游戏树

博弈树生成算法java 博弈树包括_博弈树_02

虽然按照原本的规则,存在着双方都不获胜的情况(例如上上图(c)),但是为了简单分析起见,增加一个条件:当九个小方格都被标记且没出现三个同类符号位于同一直线上的情况时,判定为先手游戏者A获胜。于是,当游戏结束时(即,在叶子顶点处)必定有一名胜利者。

叶子顶点对应于游戏的最终状态,将其标记为10,分别对应于游戏者A获胜失败;对于游戏者B而言,数值的含义是相反的。

  • 对于下图(a)的局面而言,A只有一个选择,且之后将获胜,因此可以将树中对应于下图(a)的顶点也标记为1——表示A将获胜。
  • 之后简单分析一下下图(b)就会发现无论B怎样选择,最终他都将失利,而由A获得胜利,因此可以将树中对应于下图(b)的顶点也标记为1——表示此时无论B如何行棋,A都一定获胜。
  • 对于下图(c)而言,B怎样选择,他都可以获胜,因此可以将树中对应于下图(c)的顶点也标记为0——表示B一定可以获胜。
  • 但是对于下图(d),如果游戏者B做出了正确选择(左下角),那么他将获胜,而如果他做出了错误选择(右上角),那么他将失利。为了分析博弈树,将假定任何一名游戏者都不会犯错误。在这种假定下,可以将树中对应于下图(d)的顶点也标记为0——表示存在着游戏者B的获胜策略。
  • 如果将分别以下图(b)~(d)为根的子树展开的话(见下图(e)),会发现对应于轮到B行棋的奇数层顶点根据其孩子顶点的标号对自己进行标号的行为和逻辑运算“与”一致,因此可以用∧表示。

博弈树生成算法java 博弈树包括_逻辑运算_03

同样地可以分析得到,对应于轮到A行棋的偶数层顶点根据其孩子顶点的标号对自己进行标号的行为和逻辑运算“或”一致,因此可以用∨表示。

于是,该博弈树中的每个分枝点可以按层数分为∨顶点和∧顶点。对于一个∨顶点而言,如果它有一个子顶点标记为1,则该顶点的标记为1;如果它所有的子顶点标记均为0,则它的标记为0。对于一个∧顶点而言,如果它有一个子节点标记为0,则该顶点的标记为0;如果它所有的子顶点标记均为1,则它的标记为1。这种树通常称作与或树(AND–OR tree)

下面给出该博弈树中分枝点的0-1标记的解释。如果无论游戏者B如何行棋,都存在着游戏者A的获胜策略,则该节点被标记为1;而该节点标记为0则表示无论游戏者A如何行棋,都始终存在着游戏者B的获胜策略。处于偶数层顶点处的游戏者A应该选择任一将使得她获胜的孩子顶点(进行一步行棋)。然而,在奇数层顶点处,她的命运是掌握在游戏者B手中的。

当已知博弈树时,由于分枝点的0-1标记是由其孩子顶点的标记决定的,因此可以使用树的后序遍历来计算它们。


下面再看另一个简单的二人博弈:一堆石子共有5颗,甲乙二人轮流从中取石子,每人每次可以取走一颗或两颗,取到最后一颗石子者为负。这个二人博弈的(未标号)博弈树如(a)所示,顶点中的数值表示当时剩余的石子数。面临的布局为0的游戏者获胜。而(b)中顶点中的数值表示该博弈树的0-1标记,根的标记为0,表示乙存在必胜策略。

博弈树生成算法java 博弈树包括_博弈树生成算法java_04


当然,先计算全部的博弈树再进行顶点标记的做法的开销比较大;而α-β剪枝(alpha-beta剪枝)方法可以将其大大降低。