A* 搜寻算法,俗称 A 星算法,作为启发式搜索算法中的一种,这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。
A*算法
在 A* 算法中,使用了两个状态表,分别称为 Open 表和 Closed 表。Open 表由待考察的节点组成,Closed 表由已经考察过的节点组成。
公式表示为: F(n) = G(n) + H(n)
F(n) 是从初始状态经由状态 n 到目标状态的代价估计
G(n) 是在状态空间中从初始状态到状态 n 的实际代价(通常相邻节点上下左右的 G 值为 10,斜线的 G 值为 14)
H(n) 是从状态 n 到目标状态的最佳路径的估计代价,估算代价通常采用哈曼顿距离
H(n) = D * (abs ( n.x – goal.x ) + abs ( n.y – goal.y ) ) D 是移动到相邻位置的最小代价值
开始时,Closed 表为空,Open 表仅包括起始节点,每次迭代中,A* 算法将 Open 表中具有最小代价的节点进行检查,如果这个节点不是目标节点,那么考虑该节点的所有 8 个相邻节点。对于每个相邻节点按下列规则处理;
- 如果相邻节点既不在 Open 表中,又不在 Closed 表中,则将它加入 Open 表中;
- 如果相邻节点已经在 Open 表中,并且新的路径具有更低的代价值,则更新它的代价值跟父节点;
- 如果相邻节点已经在 Closed 表中,那么需要检查新的路径是否具有更低的代价值,如果是,那么将它从 Closed 表中移出,加入到 Open 表中并且更新节点信息,否则忽略。
重复上述步骤,直到到达目标节点。如果在到达目标之前,Open 表就已经变空,则意味着在起始位置和目标位置之间没有可达的路径。
a*搜索算法动态演示分析
A*算法优化
- Open 表后期很大,可以选择有参照性的数据结构,如优先队列(大/小根堆)的方式。
- Close 表使用二维表(二维数组),由于障碍物列表和 Close 表仅用来检测是否能通过,所以我们可以使用 bool 二维表来存放。有某个点(Xa, Yb),可以通过 if(barrierList[Xa][Yb] && closeList[Xa][Yb]) 来判断。因为二维表用下标访问,效率很高,但是耗空间比较多。
- 深度限制,有时要搜的路径非常长,利用 A* 算法搜一次付出的代价很高,那么为了保证每次搜索不会超过一定代价,可以设置深度限制,每搜一次则深度 +1,搜到一定深度限制还没搜到终点,则返还失败值。
- 导航图辅助寻路,我们可以预先通过给每个房子的门口设置一个导航点,如果起点或终点在某个房子里,那么必定经过该房子对应的导航点,那么可以从起点搜到第一个导航点,然后往下搜索到每个导航点,最后一个导航点搜到终点。相比直接从起点搜索到终点,这种做法,减少了大量不必要开启搜索的点,效率明显的高。即长寻路变成短寻路。
目录
相关文章
锁
互斥锁 互斥锁(mutex lock : mutual exclusion lock):一条线程加锁锁住临界区,另一条线程尝试访问该临界区的时候
2013-11-2
排序算法
排序算法 稳定性指排序队列中有相同的值,如 r[i] == r[j],且 r[i] 在 r[j] 前面,排序后 r[i] 仍然在 r[j] 前面,则排序是稳
2013-4-12
数据结构
数组 队列 队列是一种受限的序列,它只能够操作队尾和队首,并且只能在队尾添加元素,在队首删除元素。队列 (queue)
2013-2-11
Core Dump
Core Dump 设置 生成 core 默认是不会产生 core 文件的 1 ulimit -c unlimited # -c 指定 core 文件的大小,unlimited 表示不限制 core 文件
2017-12-21
GDB
帮助信息 1 2 3 4 5 6 7 help # 列出命令分类 help running # 查看某个类别的帮助信息 help run # 查看命令 run 的帮助 help info # 列出查
2017-12-10
Batch
什么是批处理 批处理(Batch),也称为批处理脚本,批处理就是对某对象进行批量的处理 批处理文件的扩展
2017-11-5
Bash
常用快捷键 默认使用 Emacs 键位 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 CTRL+A # 移动到行
2017-4-21
Skynet
高性能服务器模型 Reactor 模型 向事件分发器注册事件回调 事件发生 事件分发器调用之前注册的函数 在回调函数中读取数
2017-2-1
赞赏
Wechat
Alipay