通往游戏外挂的终极之路——超级游戏AI系列之一:minimax算法

先摆点龙门阵吧。前几天打了下王者荣耀的超强AI,发现腾讯居然把部分深度学习出来的AI上线到普通服务器了。之前都只有看游戏大触们在专门的舞台上大战游戏AI,居然这黑科技这么快就平民化了。然后细读了下王者荣耀的相关paper,里面又涉及到一些其台AI的知识,于是又引申出去看了很多其他资料。最后发现这里面水挺深的,已经是一派有历史有传统的学术研究领域:关于怎么让AI玩游戏的研究领域。

记得还是本科的时候,自己痴迷于研究网络游戏外挂。不过那个时候觉得外挂的关键是破解软件和截取网络封包,所以狂研究哪个方向。但是游戏本身的安全也道高一尺,魔高一丈,游戏也越来越能破解了。就算破解了游戏,也就实现一些简单的挂机,总觉得用处也不大。那时总觉得破解是王道,破解后的控制逻辑就是普通的软件工程体力活,所以动力也不大了。

知道最近,突然发现,不管游戏安全再牛逼,如果AI强大到和人一样,直接像人一样操作游戏界面,自己能够从游戏画面中获得需要的信息。那么根本不需要任何和破解工作。服务端也没有办法通过技术手段判断是真人还是机器人。加上我自己是做计算机视觉,3d场景重建的。自然AI的感知是很了解的。如果加上超级的AI。那么真的可以让机器人和无区别的玩游戏。

不过说道游戏AI,一开始我就开始看什么深度强化学习,各种概念一下就把人打蒙了。就算掌握了一些这些fancy的技术的皮毛,也不知道怎么举一反三。这次才发现,就选是搞游戏AI,也得从最简单的基本思路开始。通过实践简单的理论,明白简单理论的不足,才能理解更复杂理论的精髓。所以准备把我学AI的过程同时记录下来,做成一个系列文章。

所有就从最简单的第一次机器打败人类的深蓝象棋AI使用的minimax算法作为开始吧。

minimax和博弈论还有很多理论有关系,不过这里不扯远了,不然就什么都说不清楚。

minimax实用的游戏AI的类行为:

  • 两个人对战
  • 游戏一定能在有限步数后结束
  • 游戏所有的信息都是已知的

这样的游戏我们可以把游戏的所有可能性用一个树状结构表示出来。数的每个节点表示游戏的状态。比如象棋中就是不同的摆法就对应不同的节点。每个节点到子节点的连线代表当前节点可能的操作。比如移动马。移动了一个棋子后就变成另外一种摆法了。所以也就变成了另外一个节点了。注意,这个树状结构包括了对战双方的操作。

直观的看,我的目的就是找到一条到叶子节点属于我取胜的路径。但是整个游戏树中,我能决定路径的只有那些属于该我操作的节点。也就是我一个人不能完全控制树杈的选择。

那么这下怎么办呢?为了解决这个我们必须将问题更加具体化一些,考虑到因为计算能力有限,不可能搜索整个游戏树的情况。不然如果对战双方都能够展开整个游戏树,并且总是按照自己当前状态最好的选择去做,这个游戏就只会存在一种结局了,也就不叫游戏了。

考虑到计算能力,也就是游戏双方都没有能力完全展开整个游戏树。假设大家都只能以当前状态为根节点,向下展开三层。那么对于第三层的节点有三种可能:自己输了,自己赢了,自己也不知道输还是赢。

分别对这三种叶子节点打分(输了:1,赢了:-1,游戏没有结束:0)

通往游戏外挂的终极之路——超级游戏AI系列之一:minimax算法_第1张图片

根据上图,圆圈代表这时该圆圈放操作,方框代表方框方。现在该圆圈操作,圆圈能够看到下面三层的展开。那么圆圈方是选a还是b呢?选a有很大概率得到1分。但是如果选了a。接下来方框方如果不出错的化一定会选让圆圈输的那个操作。如果圆圈选了b,接下来最差的结果就是不分胜负,游戏继续。也许后面的操作还有机会让圆圈方赢。

总结来说就是本方选择的应该是不管对方选择什么自己都能得到的最大的分数对应的选项。这里需要读者多花时间理解下这句话。

minimax的原理大概就这些,在实际操作中需要根据具体问题来制定什么的结果给多少分。

总结下操作步骤:

  1. 确定展开层数K
  2. 以当前操作方为根节点,向下展开K层游戏树。(需要根据具体游戏给这个K层树的叶子节点打分。)
  3. 从叶子节点向上依层给各个节点打分。
    1. 如果是本方操作节点,分值取子节点中最高的分。
    2. 如果是对方操作节点,分值取子节点中最低的分。
  4. 选择根节点中分值最大的操作为当前操作。

结束语:

minimax的劣势大家都很容易看出来,后面会介绍弥补它缺陷的MCTS方法。但是游戏树的概念是贯穿整个游戏AI核心。后面的方法大都是加强了游戏树搜索的某一个过程。比如查找最大直的节点的方法,比如给节点打分的方法。后面讲解新的方法的时候,都会按照这个思路,把所有方法联系在一起。

你可能感兴趣的:(深度学习)