站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题j2me人工智能入门

j2me人工智能入门

摘要: j2me人工智能入门
<tr><td>
http:///tech/article699.html
人工智能入门
今天我们来探讨一下人工智能和合成智能世界。人工智能和有关科学背后的数学概念太高级了,即使一位哲学博士也只能理解其中的大部分内容。因此,与其喋喋不休地讲述Baysian学习算法、神经网模型和许多其他抽象的废话,到不如从复杂的内容中选取简单的东西来讲。我们将学习如何使用简单的规则和简单的软件合成看似复杂的东西。
  人工智能描述的是一台计算机上用于模拟逻辑思维和决策的技术。然而,在过去传统的人工智能中所使用的技术全都基于确定性算法,也就是使用基于属性的规则系统。这些系统基于“if ... then ...”结构。一个数据库,或是知识库是以信息的形式(这些信息在本性上彼此相关)创建的。随后,基于逻辑、语句、语法等等的规则被用于解决系统产生的问题,如图1-1所示。

 传统的人工智能系统存在的问题是它们几乎全部都是确定性的。尽管一些系统可以使用随即变量,在几乎相同的解答间进行选择,但是总的来说人工智能系统不会以一个间接的方式提供没有被遗传过的东西。
  人工智能的“新”科学并不是以这种“干脆”的逻辑为基础的。细胞自动机、人造生命、模糊逻辑、神经网、稀疏分布的存储器等的新发现都告诉我们思维并不是确定性的。有许多缺乏科学根据的随意性和个人偏好。例如,如果你们正在行走并选择一条特定的路,在这种情况下,你们肯定不会考虑正在行走的每一步。你们只知道有一个目的地,并且选择最佳的到达那里的方法。“最佳”就是一个难以琢磨的部分。你们的大脑怎样才能计算出“最佳”的路来呢?它是继续计算轨迹向量还是得到最短的路程呢?或是它是不是指给你们一个总的方向,然后当它感觉走错方向时再转向呢?
[]  基于这些观察的问题和计算模型是人工智能新科学的基础。我们,作为计算机科学家和神经病学家了解到人脑(就此而言,所有动物的头脑)拥有一个“模糊”的本性(对它们的逻辑而言)和决策功能,这就是我们为什么如此复杂的一个原因。图1-2显示了一个模糊的逻辑系统。

我们今天学习的人工智能理论很简单。不管怎么说,它是一个起点,我们可在这一起点的基础上继续工作和建立更为复杂的系统。
-----------------------------------------------------------------------
模式
现在我们的脑中已经装有下列算法:
跟踪(追逐)和逃避
决策
以随机方向移动
  然而,许多时候一个人或一个会思考的动物所显示的行为是可预见的并按照一定的顺序或模式。例如,在早上启动汽车的时候,就是遵循一种可预见的顺序步骤 — 一个模式 — 每次完成任务的时候都是如此。这种模式是通过推论、逻辑或经验、也许是它们综合起来来实现的。不管怎么说,最终结果是我们遵循一种模式。
  我们对于电脑游戏中的游戏对手和游戏者的角色的模式都已很熟悉了。许多玩游戏的人总是通过敲计算机来找出模式。原因是计算机本身就要使用模式,你们作为游戏程序员可以找到计算机模式的反面(象征性的说法)并且使用它来敲计算机。
  在一个游戏中使用模式是我们想做的事情。就笔者而言,我认为一个游戏不应该总是基于模式的;那样做会很枯燥。然而,我们(游戏)应该有执行模式的能力,作为我们全部大脑结构的一部分。
  在刚才我提到的例子中,启动汽车是获得模式的最好的一个理由。姑且承认,如果我们使用逻辑并具备关于机械和电子方面的知识的话,就很可能找出启动汽车的方法,但是使用一个模式则更为容易。在电脑游戏的实例中,我们可使用模式提供我们所希望的一切,如:
选择一个方向
选择规则
选择一种行为
[]  当然,这个列表还可继续下去,想象力则是唯一的限制因素。下面我们就来谈谈如何使用模式在屏幕上移动一个游戏者对手。我们甚至可从一组模式中选择拥有一个随机数的模式。
  我们所举的例子是大家熟悉的“小蜜蜂”,将游戏者角色置于屏幕的底部,将电脑控制的对手放在屏幕顶部并按照一定队形排列。我们也许想让游戏者对手执行一定的飞行模式 — 翻筋斗、旋转、分解和S形旋转等等 — 然后恢复原来的队形。要实现这些我们可以为游戏建立一个模式表,程序可从这个表中任意选择,然后程序将表用完。下面是我们使用到的表(数组):
  int patterns[NUM_PATTERNS][MAX_PATTERNS_ELEMENTS]
    = { 1, 1, 2, 2, 0, 3, 4, 4, -1,
      2, 2, 1, 1, 4, 4, 4, 1, -1,
[]      0, 0, 0, 4, 4, 4, 1, 1, -1,
      2, 2, 2, 2, 1, 3, 3, 4, -1};
  正如你所看到,共有四个模式。每个模式最多包含5条指令。这些指令被转换成方向,然后被转换成实际的速率向量控制外来的机器人,这种模式使用可如图4-1所示。

 在为“小蜜蜂”提供的模式装置中,笔者使用了在屏幕上移动机器人的模式。该程序读入表,然后基于当前表中的元素,向适当的方向移动机器人。模式装置可以理解6个值或指令。值1 — 4分别为方向,北(N),南(S),东(E),西(W)。0的意思是不动,-1的意思是模式结束。
  模式的使用不仅可以只连接移动。模式可用于选择动作、随机数等等。例如,可以使用一个模式作为随机数生成器的根源,以便于时间向前流动的时候,生成的随机数基于一个不同根值的模式。这会获得改变数的概率分布的效果,近而改变使用随机数的任何系统的行为。对于我们所制作的游戏大脑而言,我们使用模式仅作为移动顺序。然而,你们可使用它们提供任何你们希望的东西。
-----------------------------------------------------------------------
[]跟综及逃避

  为了便于分析,我们可以使用一个游戏者和一个游戏对象或是游戏者对象的模型。问题是我们想使游戏者对手跟踪和追逐游戏者的角色。游戏者对手和游戏者的角色都有一个对坐标,指出它们各处于游戏中的什么位置,如图2.1所示。

 跟踪算法2.1
  取得 (Px, Py) - 玩家角色的位置
     (Cx, Cy) - 对手的位置
  begin
   // Do x tracking
   if (Px > Cx) then Cx++;
   else if (Px < Cx) then Cx--;
   // Do y tracking
   if (Py > Cy) then Cy++;
   else if (Py < Cy) Cy--;
  end
  由于我们获得游戏者角色和游戏者对手的位置,就可以使用这一信息为游戏者计算一个方向,就是它怎样移动才能接近游戏者的角色。因此,游戏者对手看起来就好象正在追逐游戏者的角色。算法2.1使游戏者对手跟踪或攻击游戏者的角色。不管游戏者向那个方向移动它。
  就这里多:我们基于每一个坐标,向游戏者角色方向移动游戏者对手,如图2.2所示。

算法2.1有些残忍;它直到游戏者对手处于游戏者角色的正上方时才停下来。当然,这可能正是你们想要的东西。然而,这也许太具有侵略性了。它就像是一个颗跟踪导弹:它直到击中你才会停下来。要做出进一步改进,我们可以增加如下的逻辑前提:当什么东西追赶你们时,它肯定是先看到你们。换句话说,它肯定在一定范围之内。考虑这种情况时,我们可以使用一个能见半径。
[]  我们可以进行测试,看看游戏者对手是否处于游戏者角色的一定距离之内(其视觉范围还是感觉范围)。如果条件为真,我们则打开这个算法。否则,我们可使游戏者对手做其他的事情,而不是追逐游戏者的角色,因为它根本就是无法看见游戏者的角色。
2.2、逃避
  追逐的反意词为逃避。逃避的做法与追逐相同,只不过一切都被颠倒过来进行。如果游戏者对手在游戏者角色的右边,游戏者对手则继续向右移动,而不是向左移动(接近游戏者角色),如图2.3所示。
[]
[]逃避算法2.2
[]  取得 (Px, Py) - 玩家角色的位置
     (Cx, Cy) - 对手的位置
  begin
   // Do x tracking
   if (Px > Cx) then Cx--;
   else if (Px < Cx) then Cx++;
   // Do y tracking
   if (Py > Cy) then Cy--;
   else if (Py < Cy) Cy++;
  end
-----------------------------------------------------------------------
有限状态机
我们必须把一个类似存储器形式的东西有限状态机(Finite-State Machine)加入到我们的“大脑”中,以便系统可以从一种行为迁移至另一种行为,并且能够了解它正在执行的行为。图5-1显示了一个有限状态机。

有限状态机一般用于执行复杂逻辑的硬件设计中,有限状态机的概念在软件工程中也很有用。一个电脑游戏可有许多种操作模式 — 例如:初始化模式、正常模式及终止模式 — 有限状态机除了可以跟踪游戏的全部状态外,还可以跟踪这些模式。有限状态机还可以控制游戏中玩家的对手和游戏对象。例如,我们可以做一部跟踪玩家角色状态的有限状态机。角色可能有如下状态:
状态0:活着
状态1:奄奄一息
状态2:死亡
  基于这些状态,游戏中的控制逻辑可执行不同的事情。如果玩家角色处于状态0,逻辑将允许角色移动、开火等等。然而,如果角色处于1,游戏逻辑将显示死亡顺序,角色就不能再移动或开火了。最后,当状态切换到状态2时,游戏逻辑将仔细检查它使用什么样的顺序才能使玩家角色活过来。
  当然,还存在将玩家角色从一种状态向另一种状态迁移的逻辑。如果玩家角色处于状态0,进入状态1的唯一办法就是以某种方式被击中或其它。一旦玩家角色处于状态1,一段时间后,角色会自动进入状态2,因此,我们明白了状态变化就是游戏环境 — 输入和有限状态机自身的结果,意思是说下一状态在某种方式上基于当前的状态。请参考图5-2所示。

上面我们讲的例子是为了游戏对象所提供的一个有限状态机比较典型的例子。总之,一个游戏对象可能有很多的状态,复杂的规则控制状态变化,这些状态变化我们称为状态迁移。另外,一个状态可以有输出。例如:在我们的状态模型的实例中,死亡状态可能有一个输出,用信号通知声音系统播放一次惨叫声。
  通过上面的阐述,我们已经知道什么是有限状态机了,但是我们如何在计算机中制作它呢?下面我们就以一个精灵活动状态为例写出伪代码:
我们可以定义一些变量跟踪状态
[]基于每种状态和可能的输入制定规则
  // 定义状态
  #define STATE_CHASE  1  // 追逐
  #define STATE_RANDOM  2  // 随机
  #define STATE_EVADE  3  // 逃避
  #define STATE_PATTERN 4  // 模式
  // 赋予精灵STATE_CHASE状态
  int sprite_state = STATE_CHASE;
  // 进入游戏主循环
  while(!done)
  {
    ...
    switch(sprite_state)
    {
      case STATE_CHASE:
      {
[]        // 追逐状态的控制逻辑
      }break;
      case STATE_RANDOM:
      {
        // 随机状态的控制逻辑
      }break;
      case STATE_EVADE:
      {
        // 逃避状态的控制逻辑
      }break;
      case STATE_PATTERN:
      {
        // 模式状态的控制逻辑
      }break;
    default:break;
    } // end switch sprite_state
  请记住上面这个简单的AI模型吧,以后也许你会用到。还有一点可以加到有限状态机中:占先状态控制。这就是在基于某些变量或函数在状态完全没有“成熟”之前便改变状态。在上面的伪代码中,每个状态都要执行完成为止。我们可以把条件增加为:如果在状态的执行中足够的因素得到了满足,有限状态机就会“跳出”这个状态。
  小结:设计有限状态机时,一定要仔细考虑出全部状态和状态迁移规则,避免在两个间出现周而复始的“无限循环”。
-----------------------------------------------------------------------
模糊逻辑和概率
 怎如我们第一章中所述,人类和动物的行为不是全都可以预言的 — 即使对通过小家畜而言,它们也有自己的行为。这就出现了模糊逻辑和概率。模糊逻辑是60年代出台的,但直到90年代才成为一个主流概念。模糊逻辑基于选择一组输入和条件,然后我们使用我们称之为defuzzifier的东西得出一个基于数据和概率的干脆的解答。例如,当你面临做出决策越过挡在路中间的障碍物时,你是向左绕还是向右绕呢?二者机会是均等的,决策是随机的,或者说是“模糊”的。这样就出现了模糊逻辑。
  使用模糊逻辑的程序使用一组规则,然后使用统计数据和概率,得出介于规则和解答之间的结果。这就好象是通过通过掷骰子来得出答案一样,但我们在大多数时间里就是这样做的,那么为什么不可以使计算机这样做呢?
  本章中我们使用模糊逻辑的形式来控制我们的游戏者对手。之后,我们会看到模糊逻辑和概率的一个更为复杂的应用,但现在让我们从简单开始。我们可以使用一组规则,还有概率来建立一个简单的系统,基于一个随机变量来做事情。例如,如果我们想使一组规则,还有概率来建立一个简单的系统,基于一个随机变量来做事情,例如,我们想使一组外来的宇宙飞船进攻游戏者的角色。可使用进攻算法,算法2.1(追逐)。然而,这不会给游戏者更多的机会。相反我们可使用一个随机数,选择向哪个方向移动外来的宇宙飞船,而不是总使用它驶向游戏者角色,像一枚寻航导弹一样。我们可再进一步,使用一个随机数,从三个规则中选择一个规则。
  这些规则为:
追逐游戏者角色
回避游戏者角色
随即的移动
  我们可以使用这些规则如下:
  1)我们可以选择一个随机数,从1-3。
  2)基于所选择的数,我们可选择其中的一个规则,或状态。图3-1显示了使用随机数来选择新状态。


[]在第三个规则的实例中,我们可选择一对随机数,然后用它们来提供游戏者对手的轨迹。
  3)我们将此规则执行一段时间(许多幀)。
  4)我们可选择一个新的规则,并重新开始。
[]  这一系统看起来简单也很通俗,但是结果却给人以深刻大印象。我制作出简单的,概率驱动的,基于规则的游戏者对手,然后却被它们所表现出的复杂行为所迷惑。
  随机移动。在前面我们看到了如何执行追逐和逃避算法,但如何选择一个随机方向呢?这跟选择两个变量并给予它们小动物赋予速率的组件一样简单。下面的式子说明了这一问题。
velocity_x = rand() % MAX_VELOCITY;
velocity_y = rand() % MAX_VELOCITY;


http:///tech/article699.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: 如何做一个“完美”的业余游戏策划
后一篇: [原创]关于手机游戏开发的讨论