五子棋AI设计——从门外到门内不得不说的事儿4

来源:互联网 发布:完美红颜魂器进阶数据 编辑:程序博客网 时间:2024/06/05 17:48

第四天——看得远胜算更大

经过三天的不断改进,我们的AI算是入门了,如何提高呢——高人指点说,“看得远,胜算才能更大。”道理确实如此,高人所说的“看得远”就是前瞻了,如何前瞻呢?前瞻之后如何决策?

先说说什么是前瞻吧。前瞻就是把所有可能的局面都推算出来,然后给每个局面打个分,从中选出一个最有利于自己的走法来作为当前的走法。但是如何选择呢?为了方便说明问题,我们先以3x3的棋盘为例。以图1来说说吧。为了说起来方便,我们约定如下,根节点表示当前棋局,假设AI先手,持黑,用圆圈表示,玩家后手持白,用叉表示。轮到AI出招。很显然,目前AI可以落子的位置共有7个,图1画了6种情况。我们称这一层的节点分别为q11,q12,...,q17。AI落子后,轮到玩家出招。我们从q12出发,玩家可能的落子对应的棋局分别为q21,q22,q23,...,q26。玩家落子后,轮到AI出招。我们从q22出发,AI可能的落子对应的棋局分别为q31,q32,...,q35。如此推下去,我们可以得到一颗庞大的博弈树,比如从q33出发,得到q41,q42,q43,q44。其中q44代表玩家胜利。为了在当前情况下做出最好的决策,生成完整的博弈树绝对是最好的。可是对于3x3的情况,从图1所示的根节点出发,推出的博弈树就有7!个叶节点,可想对于15x15的情况,这棵树的叶节点对多到我们无法承受的程度。所以,生成完整的博弈树不仅在空间上不可能,在时间上也是不现实的。所以,我们只能前瞻有限步,我们称玩家落子一次,AI再落子一次为一步。那么,图1对应的应该是前瞻两步。


图1 部分博弈树举例

假如,我们生成了完整的博弈树,对于叶节点的打分是很简单的。如果是AI胜利就给1分,如果玩家胜利就给-1分,如果平手就给0分。当前瞻步数有限时,如何评价叶节点就显得很重要,这是其一。其次,如何利用这些给分来决策也很重要。

下面说说如何决策。首先我们进一步简化我们所面临的情况,假设我们可以得到一颗完整的博弈树如图2。叶节点下面的数值表示使用评分函数给出的该叶节点的分数。假设A节点轮到AI决策,B、C、D为AI可能的落子。bi、cj、dk分别表示玩家落子后最终的棋局。那么,AI该如何决策呢?在博弈时,双方都想战胜对手,那么可以假设双方是完全理性的。那么,在AI落子后,假设对应棋局B,那么玩家可能的落子对应三个终局b1、b2和b3,那么玩家决策时使用的评分函数是分析对自己的好处或者是对AI的威胁,那么分数表示对自己有利或者对AI不利的程度,那么玩家会选择对自己最好的b2。依此类推,可以知道在B、C、D节点玩家的最优选择是b2、c3和d1。那么此时AI的选择是尽量降低玩家对自己造成的的不利而选择其中的最小值即c3。如果,我们将评分函数定义为对AI的有利程度,那么,玩家肯定会选择最小值,即b1、c1和d3,而AI会选择其中的最大值b1。极大极小的选择取决于评分函数的定义。按照第一种定义,AI会偏保守,按照第二种定义,AI会偏向进攻。


图2 简化的完整博弈树

但是无论如何,上面的分析过程给出了我们一个关于如何决策的提示。这个决策基于两个假设:1、博弈双方完全理性;2、信息完全可知。基于这两个假设,在知道轮到谁出招和评分函数的具体定义后,我们按照极小、极大交替选择,最终确定一个选择支撑棋手决策。假设,我们约定AI的设计偏保守,对于叶节点的评价函数定义为对玩家的有利程度或对AI的威胁程度。并且前瞻步数为k,当前轮到AI出招。定义玩家为极大棋手,AI为极小棋手。从根节点开始包括根节点,依次为Min层、Max层,依此类推交替到叶节点。但是,前面说到了,完全理性即有能力生成整个博弈树在实际对弈中是不能实现的,所以完全理性假设是不成立的。部分理性是可以实现的,即在有限步内按照极大极小交替决策。

现在的关键问题是,如何对叶节点进行打分,也就是我们看到的那些数值应该怎么给出将决定极小极大决策的结果的好坏。其次,仅仅是有限步的博弈树也是很大的,如何有效地在博弈树上进行搜索也是一个亟待解决的问题。

如何评价非终局的棋局按住暂且不表,先说说如何提高搜索,且听下回分解——alpha-beta剪枝。

原创粉丝点击