A*算法详解
预备知识
A-star是什么?下面是百度的解释 >A-star算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。
F[i]=G[i]+H[i];
以上式子中表示从起点到当前节点已经付出的代价,这个是准确的
算法最重要的是估价函数的设计,是估价函数,表示当前节点到终点的预计代价,当估价函数设为时,就和普通的最短路没有区别,设从当前节点到终点的真实值为,越接近,那么这个算法效率就越高,但需要注意一点。
我们要保证,一旦大于,那么算法不能保证其正确性。
想必大家都很熟悉了,在我的浅显的理解中,是对的优化。
寻路
假设有人想从点移动到一墙之隔的点,如下图,绿色的是起点,红色是终点,蓝色方块是中间的墙,假设走一格的代价为10,周围有八个方向可以移动,对角线的代价是,要求输出最优的路径。
第一个想法是用(但我们是在讲啊喂)
然后我们还是要用的方法解决,和很像,我们先开一个优先队列(按照F值从小到大排序),然后将起点周围的八个节点放入队列中,利用上面的公式,这里不要求输出最优解,所以对角线用近似即可,在格点图中,通常使用当前节点与终点的曼哈顿距离,这样也可以用的复杂度求出。
现在我们再开两个数组,标记了还在队列中的节点,表示不用再被访问的节点
然后我们用一个数组存储当前节点从哪个节点转移而来,方便输出路径。当第一波操作完成后的情况是这样的。(左上角表示F值,左下角G值,右下角H值)
下面我们开始一系列操作
找出当前队列中的队首(其实就是值最小的那个),将它取消标记在队列中,放入中(一定要区分这两个数组,因为每次取的是最优解,这个节点一定不会被更优地更新了,所以它就像障碍物不用再访问了),然后将它扩展,重新计算出,设置父节点,并且将这个节点标记已经访问(),放入队列。
如果遇到障碍物或在中的节点,则跳过
如果遇到在的节点,检查转移后值是否小于上次搜索到时的值,如果是,那么更新这个节点的所有信息,重新计算,然后很重要的一点是重新设置父节点
好的,接下来不停进行这种操作,直到找到最终节点。
最后要做的,就是从终点开始访问父节点,将路径逆推出来就大功告成了,算法到此为止。
什么你要不好意思暂时没有
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现