A* 寻路

定义


寻路步骤

  1. 从起点A开始,把它作为待处理的方格存入到一个开启列表(开启列表就是一个等待检查方格的列表)
  2. 寻找起点A周围可以到达的方格,将它们存入到开启列表,并设置它们的父方格为A
  3. 从开启列表中删除起点A,并把A加入到关闭列表(关闭列表中存放的是不需要再次检查的方格)
  4. 从开启列表中选择 F 值最低的方格,进行移动,把最低的方格设置为当前点,设置当前点的父方格为 A,假设为P
  5. 把点 P 从开启列表中删除,并放到关闭列表中
  6. 检查点 P 所有相邻并且可以到达(障碍物和关闭列表的方格都不考虑)的方格,如果这些方格还不在开启列表中,则将它们加入到开启列表中,再分别计算这些方格的G H F 值,并设置它们的父方格为 P
  7. 如果某个相邻方格 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的A*寻路算法是一种常用的路径规划算法。在游戏开发、机器人导航等领域中被广泛应用。 A*寻路算法的核心思想是在搜索过程中综合考虑每个节点的实际代价和启发式估计值,选择一个代价最低的路径。它基于图的搜索,首先将起始节点放入Open表中。然后,从Open表中选择具有最小总代价的节点进行扩展,将其加入到Closed表中,并根据启发式估计值更新该节点周围的可行节点的代价估计和路径。这个过程重复进行,直到找到终点节点或Open表为空。 在Python中实现A*寻路算法的关键是定义启发式函和代价函。启发式函用于估计节点到目标节点的启发式代价,为了提高搜索效率,启发式函一般要满足启发式函值小于等于实际代价的性质。代价函用于计算节点的实际代价,通常是节点的路径长度。 在实现过程中,我们可以使用优先队列来维护Open表,选择启发式估计值最小的节点进行扩展。同时,使用一个字典来记录每个节点的实际代价和路径信息。 最后,在找到终点节点后,可以通过逆向追踪记录的路径信息,从终点节点一直追踪到起始节点,得到最终的路径。 总之,Python的A*寻路算法是一种基于图搜索的路径规划算法,通过综合考虑节点的实际代价和启发式估计值,选择代价最低的路径。在实际应用中,合理定义启发式函和代价函是实现算法的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值