网站首页 > 技术教程 正文
假设地图中存在起点和终点,路径搜索算法可以用于搜索起点到终点的路径。在机器人路径规划,或者游戏中都需要用到路径搜索算法。本文介绍一种经典的 A* 算法,和 Dijkstra 算法相比,A* 采用启发式的搜索策略,能够更快地搜索出最短路径。
1.前言
给定一个包含起点 (白色圆点) 和终点 (黑色圆点) 的图,有很多条路径可以从起点到达终点,但是很多不是最短路径。如上图所示,黑色虚线为最短路径,红色虚线不是。
Dijkstra 算法是其中一种求解起点到终点最短路径的算法,在用于无权重图时,Dijkstra 算法就是宽度优先 (BFS) 的方法。A* 对 Dijkstra 进行了优化,引入启发式的搜索策略,可以更快地搜索出最短路径。
2.Dijkstra算法
假设起点是 s,终点是 e,Dijkstra 算法的主要包括下面的流程。
- 步骤一:用一个集合 F 保存已经访问过的节点,初始时 F 只包含起点 s。用一个数组 D 保存起点 s 到其余所有节点的最短路径。在开始时,D 的数值用下面的公式计算。
- 步骤二:找到一个不在 F 中,并且 D[u] 最小的节点 u。D[u] 就是起点 s 到节点 u 的最短距离,把 u 加入 F。
- 步骤三:用节点 u 更新数组 D 中的最短距离,如下面的公式。
- 步骤四:如果 F 中已经包含终点 e,则最短路径已找到,否则继续执行步骤二。
Dijkstra 算法可以用于有权重 (即节点之间的距离是不同的) 和无权重 (节点间距离一样) 的图,如果用于无权重的图,Dijkstra 算法就是 BFS 算法。
下图展示了用 Dijkstra 算法搜索无权重图最短路径的过程,橙色表示算法搜索过的区域,颜色由浅到深,表示搜索的深度 (先后顺序)。浅橙色表示最先搜索到的节点,而深橙色表示最后搜索到的节点。
3.A* 算法
A* 算法加入了启发式的搜索策略,在搜索时间上通常优于 Dijkstra 算法。A* 使用了一个估计值 F 代表某一个节点到终点的估计距离,计算公式如下:
另外 A* 包含两个列表,open list 和 close list,open list 保存了等待探索的节点,而 close list 表示已经探索过的节点。
A* 算法的流程如下:
- 步骤一:把起点 s 放入到 open list 里面。
- 步骤二:检查 open list,如果终点 e 在 open list 里面,则路径搜索完成。如果 open list 为空,则说明不存在路径。
- 步骤三:在 open list 里面选择估计值 F 最小的节点 u,作为当前节点,然后加入 close list 里面。
- 步骤四:取得所有节点 u 可以直接到达的节点 v,然后更新 open list。更新规则:如果 v 在 close list 里,则不处理;如果 v 不在 open list 里面,则把 v 加入 open list,其对应 F 值为 G(u)+distance(u,v)+H(v);如果 v 在 open list 里面,则检查 v 是否有更小的 F 值 (如果有更小 F 值,就更新 v 的 F 值);
- 重复步骤二到步骤四,直到终止。
下面是 A* 搜索最短路径的示例,每一个节点中左边的数字表示 G(n) 即真实距离,右边的数字表示 H(n) 即启发函数计算的距离。F 值就是 G(n)+H(n),在下面的例子中 H(n) 用曼哈顿距离计算 (在下面的例子中等于没有障碍物时,n 到终点 e 的最短距离)。
4.A* 启发函数的选择与区别
如果不设置启发函数,则 A* 就是 Dijkstra 算法,这时可以找到最短路径。
如果启发函数 H(n) 的值一定小于等于 n 到终点的实际距离,则 A* 可以保证找到最短路径。
如果 H(n) 的值等于 n 到终点的实际距离,则 A* 会直接找到最短路径,而不用扩展搜索额外的节点,此时运行是最快的。
如果 H(n) 的值有可能大于 n 到终点的实际距离,则 A* 算法不一定可以找到最短路径,但是运行速度会比较快。
5.参考文献
Amit’s A* Pages 地址: http://theory.stanford.edu/~amitp/GameProgramming/
猜你喜欢
- 2024-10-25 AMEYA360报道:智能扫地机器人 SLAM技术与A算法
- 2024-10-25 基于LFOA算法的相关向量机核参数优化
- 2024-10-25 定积分的换元法与分部积分法 定积分的换元和分部
- 2024-10-25 Apriori算法是什么?适用于什么情境?
- 2024-10-25 用Python写一个A*搜索算法含注释说明
- 2024-10-25 浅谈什么是分治算法 浅谈什么是分治算法是什么
- 2024-10-25 技术分享 | Prometheus避障—A_star算法代码阅读
- 2024-10-25 浅析机器人学位置与姿态之坐标系绕任意轴线旋转算法
- 2024-10-25 一文简介常见的机器学习算法 常见机器学习算法
- 2024-10-25 欧几里得算法 最大公约数欧几里得算法
你 发表评论:
欢迎- 最近发表
-
- 函数公式的7大潜规则,这次给你讲透了
- 数据逆向查找不止有vlookup,你该知道的三种逆向查询操作
- Vlookup函数怎么一次查找能返回多个结果?
- vlookup函数的嵌套你用过吗?一次可以引用3个表格的数据
- Vlookup函数的新用法,查询合并单元格,很多Excel高手都不知道
- 分明有数据,公式也没错,为什么vlookup还是会返回错误值
- 条件判断还在用if函数就out了,vlookup函数模糊查询一键完成
- EXCEL函数 VLOOKUP函数 HLOOKUP函数
- excel中vlookup函数的用法(excel中vlookup函数公式)
- 自动获取vlookup函数的第三参数,再也不用一列一列的数了
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)