主题之前:
我对于AI的认识不像很多科班出身的专家,各种理论一大套,我是本科毕业就离开了科班,很多知识还没有补充完备就离开了学校.
而且很遗憾,我也不是个成功的学生,离开的时候甚至我没有带出我必须带出来的学位证.....残念.戴思达......
我喜欢AI是因为它让人感觉神秘,好像真的有智能;我学习AI也是稍微看了点书,关键是练习;真正的练习我想才刚刚开始.
进入主题:我眼中的小游戏AI
小游戏的AI和大型游戏的AI可能是相似的,理论基础上也是一致的,可惜我只能从更通俗的角度去说明它.
我认为小游戏的AI分为3类:可完备解型、重深度计算型、重策略型。
可完备解型: 已经有了绝对的胜负判定方案,无论如何处理,都在控制之内的游戏;代表性的像拿硬币类型的,小型的棋类游戏(如酒吧的4子棋,3*3连线--计算机书上的例题),经典象棋残局、扑克残局(18罗汉对4大天王)等等。
重深度计算型: 对于游戏本身没有太深理解,但是能有绝对的执行深度判定可能性,通常以简单快捷的评价函数配合大量优化过的深度计算。我现在了解的也都是算法课程中交的算法,而且我也没有学好,只用过dp和贪婪,了解过αβ剪枝和策略树。
重策略型:已经有了很好的评价策略,能形成较浅层次的策略树。评价函数本身庞大,递归层数有限,甚至不递归。下面对比说明会有具体解释
注意:绝对的执行深度判定可能性 指程序有可能真实的预料到网下的n步,这不是什么标准概念,是我个人的一种理解。比如象棋游戏就可以实现这点,而扑克游戏就很难,扑克游戏是不明牌的,每一次出牌都是假设对方有什么牌,这个假设递归两次基本就不是误差的概念了。
基于上面的三类,毫无悬念,俄罗斯方块应该属于‘重策略型’。它无法有完备解、它无法预计两步以上,但是它可以针对这两步做出很多好的策略。
绝大多数人的AI程序编写都是从‘重策略型’游戏开始编写的。我第一个AI游戏是上大一的时候,用tc2写的黑白棋,当时根本不知道什么叫AI,所有的策略都是无序的,根本没有专门一套评价体系,想到哪里算到哪里,代码也没有什么可重用型,完全不像现在写的样子。
更加遗憾的是,我当时可以想到利用递归会更加增强它的职能,但是根本当时只学过不到1年C语言,更不用说算法、数据结构、编译原理等专业课,根本写不好这样的递归。
最终,我完成了一个版本,利用超多的策略,让它不仅可以走棋,而且可以让一般人不容易赢。
现在想想还是比较弱的,黑白棋是个完全可以高递归深度,少策略实现更好算法的程序,我下载过一个黑白棋程序,有个菜单项就是选择递归的层次,我记得最高是17或者19,一共60步最多,递归接近20步已经远超过一般人脑的水平了,所以我虽然从来没有赢过那个递归17步的电脑,我也一点没有什么意外。
我今天看来,黑白棋递归到最终60步,用现在的计算机配合一定的剪枝,应该也不会太卡。当然只是大概估算,别为此较真。
现在比较流行的重深度的另一个游戏是‘象棋巫师’,我玩过这个游戏以后,才准备学αβ剪枝,它在游戏中把剪枝利用的非常好,我能看到的在可选步骤10步左右的情况下,可能会递归20多层,实际象棋每一步可能有几十步,如果不管好坏均去递归的话,可能效率会极其低,αβ剪枝的优势就是能够把无意义的选择剪掉,保证有效的有限求值范围。
有机会我希望在后续的文章中会进一步阐述上面说的的内容,而且也会给出相应的实现。
期待下一节 通过俄罗斯方块浅谈游戏中的AI(二)我的俄罗斯方块AI策略