图:邻接表的深度遍历,广度遍历,最短路径,A*算法

这里写目录标题

    • 图的表示
        • 结论:
      • 图的导航-最短路径算法
        • A*算法

  1. 在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就 是这些圆圈之间的连线。顶点之间通过边连接。注意:顶点有时也称为节点或者交点,边有时也称为链接。
  2. 社交网络,每一个人就是一个顶点,互相认识的人之间通过边联系在一起, 边表示彼此的关系。这种关系可以 是单向的,也可以是双向的!
    图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第1张图片
    地图导航 - 起点、终点和分叉口(包括十字路口·、T 字路口等)都是顶点,导航经过的两顶点的路径就是边!

我们导航从一个点到另外一个点可以有条路径,路径不同,路况就不同,拥堵程度不同,所以导 致不同路径所花的时间也不一样,这种不同我们可以使用边的权重来表示,即根据每条边的实际情况给每一条 边分配一个正数或者负数值。

的树和链表都是图的特例!
图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第2张图片
图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第3张图片

图的表示

邻接列表:

在邻接列表实现中,每一个顶点会存储一个从它这里开始的相邻边的列表。比如,如果顶点 B 有一条边到 A、 C 和 E,那么 A 的列表中会有 3 条边
图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第4张图片
邻接矩阵:
图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第5张图片

由二维数组对应的行和列都表示顶点,由两个顶点所决定的矩阵对应元素数值表示这里两个顶点是否相连(如, 0 表示不相连,非 0 表示相连和权值)、如果相连这个值表示的是相连边的权重。

结论:

大多数时候,选择邻接列表是正确的。(在图比较稀疏的情况下,每一个顶点都只会和少数几个顶点相 连,这种情况下邻接列表是最佳选择。如果这个图比较密集,每一个顶点都和大多数其他顶点相连,那么邻接 矩阵更合适。)

图的导航-最短路径算法

从起点开始访问所有路径,则到达终点节点的路径有多条,其中路径权值最短的一条则为最短路径。最短路径算法有 深度优先遍历、广度优先遍历
图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第6张图片

A*算法

随着 3D 游戏的日趋流行,在复杂的 3D 游戏环境中如何能使非玩家控制角色准确实现自动寻路功能成为了 3D 游戏开发技术中一大研究热点。其中 A算法得到了大量的运用,A算法较之传统的路径规划算法,实时性更高、灵活性更强,寻路 结果更加接近人工选择的路径结果. A*寻路算法并不是找到最优路径,只是找到相对近的路径,因为找最优要把所有可行 路径都找出来进行对比,消耗性能太大,寻路效果只要相对近路径就行了。

A* 算法的原理
我们假设在推箱子游戏中人要从站里的地方移动到右侧的箱子目的地,但是这两点之间被一堵墙隔开。
图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第7张图片
我们下一步要做的便是查找最短路径。既然是 AI 算法, A* 算法和人寻找路径的做法十分类似当我们离目标较远时我们的目标方向是朝向目的点直线移动但是在近距离上因为各种障碍需要绕行(走弯路)!且已走过的地方就无须再次尝试。

图:邻接表的深度遍历,广度遍历,最短路径,A*算法_第8张图片
G 表示从起点移动到网格上指定方格的移动距离 (暂时不考虑沿斜向移动,只考虑上下左右移动)。

H 表示从指定的方格移动到终点的预计移动距离,只计算直线距离 (H 有很多计算方法, 这里我们设定只可以上 下左右移动,即该点与终点的直线距离)。

令 F = G + H ,F 即表示从起点经过此点预计到终点的总移动距离

寻路步骤:

  1. . 从起点开始, 把它作为待处理的方格存入一个预测可达的节点列表,简称 openList, 即把起点放入“预测可达节点列表”, 可达节点列表 openList 就是一个等待检查方格的列表。
  2. . 寻找 openList 中 F 值最小的点 min(一开始只有起点)周围可以到达的方格(可到达的意思是其不是障碍物,也不存 在关闭列表中的方格,即不是已走过的方格)。计算 min 周围可到达的方格的 F 值。将还没在 openList 中点放入其中, 并 设置它们的"父方格"为点 min,表示他们的上一步是经过 min 到达的。如果 min 下一步某个可到达的方格已经在 openList 列表那么并且经 min 点它的 F 值更优,则修改 F 值并把其"父方格"设为点 min。
  3. 把 2 中的点 min 从"开启列表"中删除并存入"关闭列表"closeList 中, closeList 中存放的都是不需要再次检查的方格。如 果 2 中点 min 不是终点并且开启列表的数量大于零,那么继续从第 2 步开始。如果是终点执行第 4 步,如果 openList 列 表数量为零,那么就是找不到有效路径
  4. 如果第 3 步中 min 是终点,则结束查找,直接追溯父节点到起点的路径即为所选路径。

你可能感兴趣的:(笔记,技术分享,数据结构,算法,图论,人工智能)