基本搜索技术--博弈树

 

前言:

       假定你的房间里铺有100块地板,其中一块底下有一块金砖,而另一块底下有一颗地雷。如果你翻开有金砖的那块地板,你就可以成为百万富翁;如果你翻开有地雷的那块地板,你就可以到地狱旅行。在经历了长期煎熬之后,你决定将这些地板逐一翻开,以找寻百万富翁的生活。这个寻找命运答案的过程,就是搜索( Search)。

       而将地板逐一翻开的搜索方法,叫作盲目搜索( Blind search)。在这个盲目搜索的过程中,随着未翻开地板数目的减少,终将会找到一个答案。

        又假定你还有一位朝夕相伴的室友,同你一样起了这个念头。于是,你们商定每人每天可以交替翻开一块地板。这样当一个人碰到地雷时,他最亲密的朋友就可以得到剩下的金砖。
所以你们各自在心中祝愿对方黄泉路上一帆风顺。最多50天,命运的答案就会完全揭晓。你们翻开了98块地板后仍一无所获,在最后的时刻,你犹豫了,到底要不要翻开这一块决定命运的地板?你感到同你竞争的并非你的室友,而是魔鬼的化身。这个同魔鬼的化身交战的过程就叫作博弈。而敌对双方交替动作的搜索叫作对抗性搜索( Adversarial Search)。

博弈树:

  •            设想下象棋的情形,两人对弈,我们将其中一位叫做甲,另一位叫做乙。假定现在该甲走棋,甲可以有40种走法(不论好坏):而对甲的任一走法,乙也可以有与之相对的若干种走法。然后又轮到甲走棋,对乙的走法甲又有若干种方法应对……如此往复。
  •         显然,我们可以依此构建一棵博弈树,将所有的走法罗列出来。在这棵树的根部是棋局的初始局面。根的若干子节点则是由甲的每一种可能走法所生成的局面,而这些节点的子节点则是由与之相对的乙的每一种可能走法所生成的局面……在这棵树的末梢,是结束的棋局,甲胜或者乙胜或者是双方都无法取胜的平局。
  •         图中极为简化地示意了博弈树的概要。图中省略号的地方指未能列出的大量分枝。
  • 如果我们令甲胜的局面值为WIN,乙胜的局面值为LOST,而和局的值为DRAW。当轮到甲走时,甲定会选择子节点值为WN或DRAW(如果没有值为WIN的子节点的话)的走法:而轮到乙时,乙则会选择子节点值为LOST或DRAW(如果没有值为LOST的子节点的话)的走法。对于中间节点的值可以有如下计算方法:如果该节点所对应的局面轮到甲走棋,则该节点的值是其所有子节点中值最佳(对甲而言)的一个的值:如果该节点所对应的局面轮到乙走棋,则该节点的值是其所有子节点中值最差(对甲而言)的一个的值。这样看来从这棵树的叶子节点倒推向根部,就可以得出所有节点的值。双方就可以从其所面临的棋局中选择一步好棋。然后一步步走向胜利。
  •         博弈树是从根部向下递归产生的一棵包含所有可能的对弈过程的搜索树,这里称为完全搜索树。

                   基本搜索技术--博弈树_第1张图片

                                                                                       象棋博弈树示意

让我们面对一下不幸的实际。那就是,除了极少数非常简单的棋类游戏,大多数棋类游戏,如象棋,我们都没有建立完全搜索树的可能。一方面是因为很多情形根本就到达不了叶子节点,如将一个棋子反复来回走动就可永远循环下去。另一方面,即使我们将循环的情形排这棵树上的节点数量也已多到了无法处理的程度。以中国象棋为例,其每一局面可有约20~60种走法。以平均40种走法计,建立一棵(双方各走50步)搜索树就需生成约10个节点。这远远超出了当今计算机的处理能力。即使生成一个节点仅需10-8秒,生成这棵树也要10年以上。显然这是不切实际的;也就是说,必须得有其他切合实际的方法。

 

基本搜索技术--人机博弈算法(极大极小,深度优先,负极大值)

  传送门:https://blog.csdn.net/alzzw/article/details/99233792

内容来源于:陈其的《PC游戏编程》(人机博弈)

 

你可能感兴趣的:(算法,博弈树,人机对抗)