A* 寻路
来源:互联网 发布:图像复原的数据集 编辑:程序博客网 时间:2024/06/01 08:02
定义
寻路步骤
- 从起点A开始,把它作为待处理的方格存入到一个开启列表(开启列表就是一个等待检查方格的列表)
- 寻找起点A周围可以到达的方格,将它们存入到开启列表,并设置它们的父方格为A
- 从开启列表中删除起点A,并把A加入到关闭列表(关闭列表中存放的是不需要再次检查的方格)
- 从开启列表中选择 F 值最低的方格,进行移动,把最低的方格设置为当前点,设置当前点的父方格为 A,假设为P
- 把点 P 从开启列表中删除,并放到关闭列表中
- 检查点 P 所有相邻并且可以到达(障碍物和关闭列表的方格都不考虑)的方格,如果这些方格还不在开启列表中,则将它们加入到开启列表中,再分别计算这些方格的G H F 值,并设置它们的父方格为 P
- 如果某个相邻方格 D 已经在开启列表中,检查如果用新的路径(经过P点的路径)到达D的话,G的值是否会更低一些,如果新的 G 值更低,那就把它的父方格改为目前选中的方格 P,然后重新计算它的 F G值;但是如果新的 G 值比较高,就说明经过 P 再到达 D 不是一个正确的选择,此时我们什么也不做;
从开启列表中查找最靠谱的方块,需要通过公式 F=G+H 去计算; G 表示从起点 A 移动到网格上指定方格的移动耗费 (可沿斜方向移动).
H 表示从指定的方格移动到终点 B 的预计耗费 (H 有很多计算方法, 这里我们设定只可以上下左右移动).
伪代码
把起始格添加到 "开启列表"do{ 寻找开启列表中F值最低的格子, 我们称它为当前格. 把它切换到关闭列表. 对当前格相邻的8格中的每一个 if (它不可通过 || 已经在 "关闭列表" 中) { 什么也不做. } if (它不在开启列表中) { 把它添加进 "开启列表", 把当前格作为这一格的父节点, 计算这一格的 FGH if (它已经在开启列表中) { if (用G值为参考检查新的路径是否更好, 更低的G值意味着更好的路径) { 把这一格的父节点改成当前格, 并且重新计算这一格的 GF 值. } }} while( 目标格已经在 "开启列表", 这时候路径被找到)如果开启列表已经空了, 说明路径不存在.最后从目标格开始, 沿着每一格的父节点移动直到回到起始格, 这就是路径.
代码分析
启发值设计
具体实现
地图表示
github上有是实现代码,可以下载
0 0
- a*寻路
- A*寻路
- A*寻路
- A* 寻路
- A*寻路
- A*寻路
- 寻路(AStar/A星/A*)算法
- 寻路(AStar/A星/A*)算法
- 游戏中的A*寻路
- A*寻路 -- 算法优化
- Unity3d 中的 A*寻路
- Unity3d 中的 A*寻路
- Unity3d 中的 A*寻路
- Unity3d 中的 A*寻路
- Cocos2dx------A*寻路
- Unity3d 中的 A*寻路
- Unity3d 中的 A*寻路
- 寻路 A星
- hibernate笔记
- 线程同步(计时器)
- SecureCRT 连接虚拟机Linux
- SpringMvc Eclipse搭建web项目
- C语言代码计算神器for Mac
- A* 寻路
- 软件开发生命周期的管理
- android五中方式调用服务service中的方法
- [Contest] THUSC 2016 解题报告
- tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListen
- C语言代码搜索神器for Mac
- JS交互的方法(下)WKWebView
- 大型网站架构架构及性能优化方案
- struts 笔记(王勇)