游戏核心算法编程内幕学习(四):基本人工智能技术介绍

“我不仅使用我自己拥有的智力,而且借用能借到的所有智力.”

         ——伍德罗 威罗逊

(书中开头的这句话很棒吧!和《劝学》中的“君子生非异也,善假与物也.”同样的道理!嘻嘻.)

1   情境
 “实际上,不好的人工智能设计往往是从错误的目标开始的。”
A*算法太聪明,太智能,但是很不真实,“因为太聪明而不人性化的人工智能
会使游戏不好玩。”人工智能设计要保持一定的缺陷!玩家才不会沮丧。
不能太聪明,也不能太笨。

2人工智能系统结构:1.主体(Agent),2.抽象控制器。
   对于1,要按照生物结构真实的建模其行为。因此这些人工智能的构造方式
与大脑类似,容易确定其4个元素和规则:感知或输入系统、工作记忆,推理/分析
内核、动作输出系统。
   对于2,以战略游戏为例子,AI有个主控制器-程序的集合,对总体系统提供必要的
小组动态机制。

1.有限状态机:
   (1)AI规则

     在指定AI的行为这个阶段,一定要做彻底,因为咋中途解决AI问题是很麻烦的,
因为本来就是后期跟蜘蛛网一样复杂的东西,如果前期不想彻底,后面又加入一个,
很麻烦的。先记下AI的基本行为,然后用图形表示,在变成实际执行的代码。     
     生成有限状态机时最大的错误之一是立即开始编写代码。随着状态机的增大,
很难记住所有状态与变换的全貌,通常会得到一个笨拙的AI,不能如期工作。设计时,
花点时间画出简单框图是非常必要的。可以把框图和其他项目文档一起保存起来,
供日后使用,以便AI再利用,而且可以直观的看到AI的行为。

2.并行自动机:
    如果要建模复杂行为时,经典有限状态机会增长很快,变得笨拙和不好管理。
更糟糕的是,有事要增加一些行为,发现每增加一步都使有限状态机的长度翻一番。
有限状态机是个很好的工具,但是伸缩起来不一定容易,因此这个模型需要一些扩展,
为了可以更好的控制复杂的AI系统。
    最常见方法利用并行自动机。其实就是把大问题分解成小问题的思想。
    比如一个士兵,一个行动管理AI,一个枪支的AI。把问题分解会更简单。两个
大脑并行工作。
    在设计时,独立是关键。应该尽量使自动机保持独立,这样更安全。避免之间的
互相影响造成死锁。
    状态机共享信息,总体行为 = A+B;   
3.同步有限状态机(群通信!!):
    比如在玩三角洲的时候,就是两三个人一起行动,我是玩家,还有两个小伙伴
在我周围掩护我,这便是状态机之间的通信。使几个AI可以配合工作。
    这被称为“小组AI”!被认为是动作AI的飞跃。 
    同步AI的核心是:共享内存区,所有的自动机可以读取和写入数据。
    实现AI间的通信方法:
    1.公告牌体系结构(简单)
       利用公告牌(共享内存区),其他AI定时浏览获得与自己相关的信息,做出改变。
    2.消息传递体系结构——互相发送信息(繁杂!)
4.非确定性自动机(NDFA)
   就是在经典的有限状态机上加入一些随机性,这样即使玩了很久仍然具有挑战性。
例如,在做士兵巡逻时,发现玩家的话,他可以选择追赶也可以选择射击。引入一定的
随机性。
   这种随机在许多AI使用同意状态机的游戏中非常有用。
   若没有这种随机则感觉整个太机械!太生硬。
   NDFA对小组AI非常重要,可以减少同质性,使完成同一任务时不会千篇一律。
6.3.2规则系统(RS):当行为转换变得模糊无序的时候,RS可以建模任何很难用
有限状态机建模的行为。其实就是多加了一些条件判断if(a&&b)action;
实现:
    1.决策树
     编制一个规则系统,最简单的方法就是用决策树编码系统。

     就是大量的if-else。

    

    2.符号规则系统
    脚本语句,用符号表示。
    规则系统顺序分析规则,直到找到一条成立的规则。
  如果需要判断的规则太多,则问题就出来了,会影响AI代码的执行时间,进而影响
帧速率变化,这是很不好的现象。
    显然,要用结构化方式排列规则系统,使执行时间相对独立于可采取的路径,最好的
方法:1982年C.L.Forgy提出的Rete算法。
    Rete算法部分思想:消除第一次迭代后重新求值规则系统的工作。
    Rete算法利用了两个事实:
    1.激活一条规则通常只改变几个事实。
    2.同一事实与模式通常会在多条规则的左边出现。
    Rete用一个有向无限图在内存中表示事实,把规则激活的事实加入新图中。也可以
删除事实或者修改事实。图中每个节点表示一个模式,然后,通过追踪从根到叶的路径
,就可以取出规则的左边部分。
    重复事实通常是两个规则共享的事实。在算法中,通常合并这些事实,从而消除
事实冗杂度。还要消除重复操作,因此要缓存多条规则中的重复部分!
    
6.3.3规划与解题
   状态机和规则集是建模简单行为的重要机制。如果问题可以用序列和短话表达,则显然
可以使用状态机。
   在解决一些更难的问题的时候,状态机和规则集就不行了,比如说下棋、解谜。
棋的性质是预测算法,分析一些列操作的可能结果,然后想办法超越对手的能力。
   这时需要增加一些强有力的工具来帮助分析问题:
   1.状态空间搜索:这是一个非常强大的机制,可以生成战略和规划,将动作传递到未来
,评估其后果。他把游戏表示成树,将各种可能的配置表示成树的节点,动作表示成节点
间的分支。给定初始状态和目标状态后,就可以用各种方法找到从一个点到另一个点的
最佳路径(和运动序列)。
   2.目标状态:盲目搜索:强力搜索所有的动作。A*算法:获得更多的问题的信息,
使可以不完全搜索也能找到最优解。A*是大多数问题的最优算法。
     

6.3.4  生物灵感人工智能(Very Nice!!!!)
     1.基因编程。
       基因编码也可以用于游戏AI:生成相似但有变化的个体。
       基因编程不限于生物,也可以用DNA编码表示城市风光,使每个房子使用核心
房子标准基因编码的变形。甚至可以得到不同样子与素质的邻居。(甚至可以得到与什么样
的素质的邻居的概率百分比!cool!根据这些概率,周围放什么商店容易赚钱....)
       每个人的特点代码化,然后组合....很简单!
     2.进化计算:
       现在要实现达尔文的自然选择理论,这比简单的基因计算复杂一些,要用生态系统
测试每个个体和测量其性能和适应性。这样,适者生存,不适者亡(成为null指针)。
       通过对选择过程的迭代,就可以使更适合的生物最终居领导地位。
       这部分好棒感觉!!!!哈哈!!
       下面是达尔文系统的一般布局:
       1.用随机DNA编码生成前N个个体。
       2.对其进行适应性测试。
       3.选择最好的一些。
       4.生成N个后代,条件如下:
          1.父代DNA编程线性组合。
          2.变异。
       5.再回到2,直到达到所要的代码数。
       设定一个“筛子系统”,标准自己定,然后对物种进行筛选。
       建立一个进化测试器并运行几代,培育出良好的驾驶员,随着代数的增加,驾驶
方式之间的差异越来越小,汇聚成稳定的基本完美的驾驶风格。因此,很难选择最佳物质。
       变异非常重要,保证通过产生不同的个体,有可能找到不同的进化方式,到达
当前带无法到达的=更加适应性值。  

模糊逻辑、贝叶氏神经、神经网络都属于生物灵感人工智能。

以上是我对这章的知识的一些基本整理。

(进化不错啊,一定要亲自实现一下,改天做完贴出代码,嘻嘻)

你可能感兴趣的:(游戏算法编程)