游戏开发中的人工智能——A*路径寻找算法

转载 2013年08月15日 16:09:49

转载至 阅读笔记-游戏开发中的人工智能-第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*节点成本的方法,根据游戏里发生的情节而定。

 

A*启发式搜索算法详解 人工智能

A*启发式搜索算法详解 人工智能 转自:http://dev.gameres.com/Program/Abstract/Arithmetic/AmitAStar.mht 我们尝试解决的问题是把一个游戏...
  • sxy_cnyali
  • sxy_cnyali
  • 2016年02月01日 01:46
  • 2864

人工智能: 自动寻路算法实现(三、A*算法)

本篇文章是机器人自动寻路算法实现的第三章。我们要讨论的是一个在一个M×N的格子的房间中,有若干格子里有灰尘,有若干格子里有障碍物,而我们的扫地机器人则是要在不经过障碍物格子的前提下清理掉房间内的灰尘。...
  • kwame211
  • kwame211
  • 2017年09月30日 09:52
  • 524

人工智能_滑动积木块—A*算法

  • 2013年06月03日 10:56
  • 15KB
  • 下载

滑动积木块游戏设计 ——A*算法的应用

滑动积木块游戏设计:A*算法的应用
  • wp1603710463
  • wp1603710463
  • 2015年12月23日 19:40
  • 2595

智能算法---蚁群算法介绍

蚁群算法是一种群智能算法,也是启发式算法。基本原理来源于自然界蚂蚁觅食的最短路径原理。...
  • wang_Number_1
  • wang_Number_1
  • 2016年09月08日 08:34
  • 7726

【C++研发面试笔记】20. 常用算法-路径搜索算法(图算法)

【C++研发面试笔记】20. 常用算法-路径搜索算法(图算法)20.1 BFS与DFS 最大流最小割定理,最大流问题,最小生成树问题,Prim算法,Dijkstra算法是典型的单源最短路径算法。Flo...
  • tostq
  • tostq
  • 2016年10月04日 11:19
  • 3172

一种基于回溯的路径寻找算法

网格上的机器人:想象一个机器人坐在有r行c列的网格的左上角。这个机器人只能在两个方向移动,向右和向下。有些格子是关闭的,机器人不能移动到这些格子上。设计一个找到一条让机器人从左上角移动到右下角路径的算...
  • huhao_bupt
  • huhao_bupt
  • 2017年02月17日 11:39
  • 285

人工智能之搜索策略-A*算法入门

中文原文:http://blog.csdn.net/pojianbing/article/details/5649142 英文原文:http://www.gamedev.net/page/resou...
  • dahuacai
  • dahuacai
  • 2016年01月11日 17:23
  • 2983

游戏中的AI算法总结与改进

参考文章: http://games.sina.com.cn/zl/duanpian/2014-03-11/105973.shtml http://www.oschina.net/translate...
  • cordova
  • cordova
  • 2016年06月08日 00:15
  • 12692

游戏编程中的人工智能技术-遗传算法入门(三)

先请教大家一个问题,为什么我的遗传算法入门(一)一直处于“待审核”状态? 好,言归正传,继续研究代码。先看看CBobsMap类的定义。 #include "defines.h" using nam...
  • angelguard
  • angelguard
  • 2016年06月01日 07:17
  • 1955
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:游戏开发中的人工智能——A*路径寻找算法
举报原因:
原因补充:

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