基于规则系统的人工智能在游戏中的应用

原创 2004年09月21日 12:17:00

首先介绍一下RBSRule Based System)。从字面上很容易看出,这是指基于规则的系统,和神经元网络不同,这是人工智能的另一个分支。该系统用来解决问题的方法是基于如下形式的一个过程:

其中当前状态作为输入,兰色区域为人工智能处理的过程,输出为事件,同时事件本身又会影响着状态的变化。这篇文章讲着重讲解关于匹配和结果过滤的算法理论和具体的C/C++实现。 

要做匹配,首先就应该确定匹配的格式,那么该如何确定呢,我们下来看一下下面这条逻辑语句:

如果 A 并且 B,或者 C D,那么这样一条语句在计算机里是如何体现呢。是:

if (A and B) or C then D,看到这样的结构,是否让我们想起了来描述算术表达式的Expression Tree呢。恩,那么我们来试着用树型结构来保存这样的逻辑:

其中橘黄色的表示匹配的元素,紫红色的表示任意两个元素之间的逻辑关系,最后绿色的表示这条逻辑的结果。似乎看起来没什么问题,而且是很规则的二叉树,当逻辑越来越多的时候,也就是数棵相互之间没有任何关系的森林了。那么实际上呢,实际上很多逻辑的元素子并没有改变,也就是说,同样是ABC三条关系,只是其中的逻辑关系发生变化了,或者有些情况连逻辑关系也没变,只是结果D不同,那么对于这样的情况,我们用什么样的方法将这个森林连成一片呢? 

这里将介绍到Rete算法,90%的大型商业RBS系统都是使用的基于Rete算法的模型。那么我们来看看Rete算法究竟是如何定义的。 

Rete算法的初衷是在第一次对森林进行搜索之后,将搜索到的结果组织成一棵树,之后每次搜索森林之前先搜索这棵树,看能否找到感兴趣的资料,其宗旨是起到一个缓存的作用。但是呢,实际上我们可以在我们游戏开始的时候,就将整个森林编译成一棵树放在内存中,之后的所有匹配都可以从编译好的树中去搜索。 

下面来通过一张图来讲一下Rete算法的原理:

左边的图是之前提到过的一条逻辑:

if (A and B) or C then D

而右边的图是稍微修改过的另一条逻辑:

if (A and B) and E then F

那么我们如何对这两棵树进行编译来形成一棵树呢:

这个时候假如输入是A and B的话,那么精确匹配的结果是D一个结果,而模糊匹配的结果则是所有和带黑色粗边框的那个AND逻辑运算子所有相关联的结果,包括DF 

接下来看看具体的结构如何在实际的编程语言中实现。之所以我用很分明的颜色将匹配元素,匹配运算符号和匹配结果分开,就是明确的区分这三者之间的关系。从图中不难看出,以上三者的一些特点:

1.  匹配元素没有连入节点

2.  一个匹配元素可能连接到多个匹配运算子或者运算结果上

3.  一个运算子做多只有两个节点连入,接入的节点可能是匹配元素也可能是运算子

4.  一个运算子可以连接到多个运算节点或者运算结果上

5.  一个运算结果可以有多个来自运算子或者运算元素的节点的接入

6.  运算结果没有接出节点 

并且由于运算子的接入节点是有限的,所以要求在运算子上保存接入节点的信息。那么在实际搜索匹配的时候,输入是一条逻辑信息,然后在Rete生成树中找到逻辑中的第一个逻辑元素,然后搜索该元素的接出节点中是否有匹配的运算子,如果没有的话,继续搜索到所有跟这个匹配元素相关的所有结果,算为模糊匹配,并将模糊指数设为1(之后的结果过滤阶段会讨论到相关的用处) 

那么在进行一次相关的搜索之后,一般会得到多余一个结果,但是最终的决策只能从中选一个,那么如何对结果进行过滤呢。虽然从理论上讲,要根据不同的情况来设置不同的过滤机制,这里就先讲一些比较General一些的过滤算法。 

1.  优先级设置法,这里对于开始的模糊指数的设置就有效果了,但是只能过滤掉模糊匹配的,对于精确匹配的仍然需要继续采取其他的过滤措施进行过滤。

2.  最近时间访问法,搜索最近一次访问过的结果,这种方法是针对原始的Rete算法搜索出的结果的,不适合在我们所说的在程序一开始就生成好树的做法。

3.  最小匹配法,某个输入的输出结果最少,表示结果越specific,就在那些结果中继续搜索。

4.  最初匹配法,在搜索树的时候,在精确匹配之后,按照广度优先搜索,返回最先搜索到的结果。

5.  分组法,根据不同的类型将RBS分成不止一个组,从而可以编译成多棵树形成一个森林,然后搜索的时候只在固定的组内进行搜索。

6.  不重复法,将最近访问过的结果排除,然后在剩下的结果中继续搜索。

7.  历史数据排序法,将所有的历史访问信息排序,返回访问数最多的结果。

8.  随机法,听名字就该知道了吧。= 

然后安排上自己在设计规则数据库的时候加入的一些判断优先的元素,可以构造出符合自己要求的结果过滤机制。 

下面来看看RBS在某些FPS游戏中的应用:(摘自某些FPS游戏)

Action Selection

  Movement 

  Movement 

  Weapon Selection 

  Weapon Selection 

  View Control

  View Control

游戏开发中的人工智能(十一):规则式 AI

接上文 游戏开发中的人工智能(十):模糊逻辑本文内容:技术上而言,有限状态机和模糊逻辑都落在基于规则的方法这个大伞之下。本章将谈这些方法,以及其他变化的方法。规则式 AI本章我们要研讨基于规则的 AI...
  • Jurbo
  • Jurbo
  • 2017年07月25日 14:40
  • 698

设计模式在游戏开发中的应用之观察者模式

观察者模式 1.通俗的定义         触发事件的一方不关心谁来处理,处理事件的一方不关心事件是从哪里来的。观察者模式就是让观察者与被观察者彻底解耦。 2.2.结构图如下(图片来源与网络): ...
  • yue19870813
  • yue19870813
  • 2016年11月12日 16:44
  • 647

3D游戏中的数学运用

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:【119706192】本文链接地址: 3D游戏中的数学运用 【01】3D游戏数学简介 总导:...
  • asd237241291
  • asd237241291
  • 2013年01月18日 01:26
  • 3681

游戏中几种概率设计

游戏中常见的4种概率设计 1、常规做法,直接配置概率,程序直接判定 2、在1的基础上,加个保底次数,当连续不发生的次数高于保底时,强制发生 3、设置基础概率,事件不发生概率翻倍 4、设置数组,将事件发...
  • poxiao8
  • poxiao8
  • 2016年12月08日 18:01
  • 1075

脚本在游戏中的应用

有幸在当前的公司接触了这种完全由脚本驱动的游戏开发。项目组的全部是做脚本开发的,两个不同的游戏,换一下脚本和资源,就成了同一个游戏。游戏的不同其实就是脚本和资源的不同。这和大多数游戏开发公司都不一样。...
  • zhangshuliai
  • zhangshuliai
  • 2016年04月24日 22:46
  • 152

游戏中的设计模式与编码原则

设计模式 设计模式(DesignMode)是前人开发经验积累总结的精华的设计方法,是被反复利用取得较好的效果的设计思路,设计模式有利于工程的清晰有序的组织,有利于开发者之间的交流,容易被其他开发者所理...
  • cordova
  • cordova
  • 2016年06月07日 23:07
  • 1415

游戏中的ai设计

我们游戏开发中,很多时候会用到Ai,什么是Ai,就是智能。比如boss,他作为我们要击杀的对象,当我们去攻击它,他会攻击我们,并会释放技能,当他血量很弱少,有些怪物会发动狂暴,暴击等技能,来维护保持它...
  • a1026438521
  • a1026438521
  • 2017年05月22日 14:42
  • 256

设计模式在游戏中的应用--工厂方法(五)

概述:工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类...
  • guxuxin
  • guxuxin
  • 2015年07月27日 22:30
  • 600

游戏中的数学与物理(一)

游戏,玩起来很简单很随意,但是在真正的制作过程中,为了画面越逼真就需要越多的基础知识在里面,有物理、数学、算法等等。有一个好的基本功,对于做好游戏是非常重要的。...
  • wfenglinxu
  • wfenglinxu
  • 2015年07月02日 22:23
  • 615

游戏中Buff机制及其实际运用

首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种从逻辑思想到代码实现的小窍门的组合,只有当你把它运用到一个实际项目中去了,它才能帮助你建立一个系统。我不敢说它是最好的,但这套东西帮...
  • cyteven
  • cyteven
  • 2013年12月17日 16:52
  • 2369
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于规则系统的人工智能在游戏中的应用
举报原因:
原因补充:

(最多只允许输入30个字)