阅读笔记-游戏开发中的人工智能-第7章-A*路径寻找算法

1. 简述

    A*是当今游戏软件开发中十分常用的一种路径寻找算法。A*算法之所以会如此吸引人,是因为它可以保证在任何起点及任何终点间找到最佳的路径。我们可以尽量使用A*算法,除了某些特殊情况的场景。例如,如果起点和终点之间没有障碍物,有明确的视线,那么视线移动算法即快速又有效,就没有必要使用A*算法了。如果CPU的功能不强,A*算法会耗用不少CPU运算能力,尤其是,需要同时为许多游戏角色寻找路径的时候,A*算法可能不是最佳的选择。下面几个部分,逐步的讨论使用A*算法的步骤。

2. 定义搜索域

    无论是连续环境还是砖块环境,如果其中点数量太大,那么A*算法不切实际。但是通过简化搜索区域,A*算法会变得可行。
    ·连续环境的搜索域简化
       在游戏环境中放置节点,来简化搜索域。节点数量越少,路径寻找速度越快。
       我们需要节点间连接关系的数据清单。
     
    ·砖块环境的搜索域简化
       可以使用一个节点代替若干个砖块。搜索路径时,只搜索环境中的几个或一个大砖块,而不是搜索整个环境,如果在一部分范围内都找不到合理的路径,就认为没有合理的路径。
       砖块环境中,每个砖块都是彼此相邻的,因此不需要连接数据清单。
       
 3. A*算法大致思路
    A*算法有点类似于从其实点开始一圈一圈向外炸开的感觉。如下图:
    
      但是注意到,虽然小虫子到周围8八个位置的移动成本都是1,但是这八个位置到人类角色的移动成本是不同的,因此,我们将这两个成本加和,作为总的移动成本。在计算位置到目的地的移动成本时,不考虑障碍物的因素。这样我们每次优先考虑从总的移动成本最小的位置开始炸开,对于炸开过的位置和障碍物都不会考虑。这样即使某些位置的总的移动成本小但是有障碍物的破坏,导致其可能会先被炸开,但是由于障碍物的存在,我们也不会继续炸开了,会选择更优的路径。
      下图就是一个最终的炸开的形式:
      
      最后一步是根据炸开的记录找到最短路径,炸开的位置很多,我们记录所有被炸位置的母位置,等到炸到目标位置时,从目标位置开始依次寻找其母位置,逐步找到起始位置,这些母位置构成的路径就是移动成本最小的路径。
        
4. A*算法伪代码   

把起始节点加进open list
while (open list 不空) {
  当前节点 
= open list中成本最低的节点
  
if (当前节点 == 目标节点) {
       路径完成
       从目标节点开始寻找其母节点,直到母节点是起始节点位置,得到路径
  }
  else {
      把当前节点移入到close list
      检视当前节点的每个相邻节点
       
for (每个相邻节点)
         
if (该节点不在open list中 and 该节点不在closed list中 and 该节点不是障碍物) {
              把该节点移进open list
              计算其成本
              记录该节点的母节点为当前节点
          }
   }
}
if (还没有找到路径) {
  无法从起始点到达目的地
}

 

5. 地形成本

    有时候还需要考虑其他因素,最短的路径不一定是最快的,比如不同地形的移动成本是不同的,只有在计算总的移动成本时,考虑到地形因素就可以了。当然对于金钱,燃料或其他类型的资源时,问题就会变得更加复杂一些。

6. 影响力对应

    地形成本往往是可以事先知道的,但是有些因素是无法事先知道的。例如:通过任何敌人的视线的节点,有较高的成本。这种成本无法在设计游戏软件阶段时建立,因为游戏角色的位置是会改变的。影响力对应(influence mapping)是一种改变A*节点成本的方法,根据游戏里发生的情节而定。

posted @ 2011-05-24 11:02  xiaodongrush  阅读(1364)  评论(0编辑  收藏  举报