A 算法中单队列实现原理与“关闭列表”的隐式处理


A 算法中单队列实现原理与“关闭列表”的隐式处理

本教程深入探讨a*寻路算法的一种常见实现变体,该变体仅使用一个优先队列(open列表)而非显式地维护一个“关闭列表”(closed集合)。我们将通过分析python代码,解释如何利用节点分数(g_score和f_score)的初始化和动态更新来隐式管理已访问节点的状态,从而实现与传统双列表a*算法相同的寻路效果。

A* 算法概述与标准结构

A 算法是一种高效的图搜索算法,广泛应用于路径规划和寻路问题。它通过结合启发式信息来优化Dijkstra算法,以更快的速度找到从起点到目标点的最短路径。A 算法的核心在于其评估函数 f(n) = g(n) + h(n):

  • g(n):从起点到当前节点 n 的实际代价。
  • h(n):从当前节点 n 到目标点的估计启发式代价。

在经典的A*算法实现中,通常会维护两个关键的数据结构:

  1. OPEN 列表 (优先队列):存储所有待探索的节点。这些节点根据其 f(n) 值进行排序,f(n) 值最小的节点具有更高的优先级,优先被取出进行扩展。
  2. CLOSED 集合 (哈希集合/字典):存储所有已经完全探索过的节点。一旦一个节点被移入 CLOSED 集合,就意味着我们已经找到了从起点到该节点的最佳路径。其主要目的是避免重复处理已经以最优路径访问过的节点,从而提高算法效率并防止搜索陷入循环。

标准A*算法的伪代码通常会明确地包含对这两个列表的操作,例如:

  • 从 OPEN 列表中取出 f(n) 最小的节点。
  • 将该节点添加到 CLOSED 集合。
  • 检查其所有邻居节点,并根据路径代价决定是更新其信息、将其添加到 OPEN 列表,还是将其从 CLOSED 集合移回 OPEN 列表(如果找到了更优路径)。

单队列 A* 算法实现分析

下面我们将分析一个Python实现的A*算法,它仅使用一个优先队列,但依然能正确地找到最优路径。

from pyamaze import maze,agent,textLabel
from queue import PriorityQueue

# 启发式函数:曼哈顿距离
def h(cell1,cell2):
    x1,y1=cell1
    x2,y2=cell2
    return abs(x1-x2) + abs(y1-y2)

def aStar(m):
    start=(m.rows,m.cols)
    # g_score: 从起点到当前节点的实际代价,初始全部为无穷大
    g_score={cell:float('inf') for cell in m.grid}
    g_score[start]=0
    # f_score: g_score + h_score,用于优先队列排序,初始全部为无穷大
    f_score={cell:float('inf') for cell in m.grid}
    f_score[start]=h(start,(1,1)) # 目标点假定为(1,1)

    open=PriorityQueue()
    # 优先队列存储 (f_score, h_score, cell),h_score作为 tie-breaker
    open.put((h(start,(1,1)),h(start,(1,1)),start))
    aPath={} # 用于重建路径的父节点映射

    while not open.empty():
        currCell=open.get()[2] # 获取当前f_score最低的节点
        if currCell==(1,1): # 到达目标
            break

        # 探索邻居
        for d in 'ESNW': # 东、南、西、北方向
            if m.maze_map[currCell][d]==True: # 如果存在通路
                if d=='E':
                    childCell=(currCell[0],currCell[1]+1)
                if d=='W':
                    childCell=(currCell[0],currCell[1]-1)
                if d=='N':
                    childCell=(currCell[0]-1,currCell[1])
                if d=='S':
                    childCell=(currCell[0]+1,currCell[1])

                # 计算通过当前节点到达邻居的临时g_score和f_score
                temp_g_score=g_score[currCell]+1 # 假设每一步代价为1
                temp_f_score=temp_g_score+h(childCell,(1,1))

                # 如果通过当前节点到达邻居的路径更优
                if temp_f_score < f_score[childCell]:
                    g_score[childCell]= temp_g_score
                    f_score[childCell]= temp_f_score
                    open.put((temp_f_score,h(childCell,(1,1)),childCell)) # 将更新后的节点加入队列
                    aPath[childCell]=currCell # 记录父节点

    # 路径重建
    fwdPath={}
    cell=(1,1)
    while cell!=start:
        fwdPath[aPath[cell]]=cell
        cell=aPath[cell]
    return fwdPath

if __name__=='__main__':
    m=maze(5,5)
    m.CreateMaze()
    path=aStar(m)

    a=agent(m,footprints=True)
    m.tracePath({a:path})
    l=textLabel(m,'A Star Path Length',len(path)+1)
    m.run()

“关闭列表”的隐式处理机制

上述Python代码并没有显式地使用一个 CLOSED 集合。那么,它是如何避免重复处理节点和确保找到最优路径的呢?其秘密在于 g_score 和 f_score 字典的巧妙运用:

6pen Art 6pen Art

AI绘画生成

6pen Art 213 查看详情 6pen Art
  1. 初始化为无穷大

    • 在算法开始时,所有迷宫单元格的 g_score 和 f_score 都被初始化为 float('inf')。这是一种非常有效的“未访问”或“未处理”标记。任何实际的路径代价都将是一个有限值,因此任何被探索到的节点都会更新其分数。
    • 这与传统A*中检查节点是否在 OPEN 或 CLOSED 集合中的效果类似:如果一个节点的 f_score 仍为无穷大,它就相当于“未被发现”或“未被考虑”。
  2. 条件更新与优先队列的特性

    • 代码中的核心逻辑是 if temp_f_score
    • 只有当这个新路径的 f_score 小于 childCell 当前已知的 f_score 时,childCell 的 g_score 和 f_score 才会被更新,并且 childCell 会被重新放入优先队列。
    • 等效于“重新打开”节点:如果一个节点已经被访问过(其 f_score 是一个有限值),但现在发现了一条通过 currCell 到达它的更优路径,那么它的 f_score 会被更新,并再次进入优先队列。这实际上起到了“重新打开”(re-open)节点的效果,即允许算法重新考虑这个节点,因为它可能通过一条更好的路径被访问。
    • 优先队列的自适应性:由于 PriorityQueue 总是取出 f_score 最小的节点,即使同一个 childCell 因为不同的路径被多次放入队列,也只会优先处理具有最优 f_score 的那个条目。当一个节点被从队列中取出时,如果其 f_score 已经不是 f_score 字典中记录的当前最优值(这意味着在此期间有其他路径更新了该节点),那么这个旧的、劣质的队列条目实际上会被忽略,因为后续的路径更新条件 temp_f_score

通过这种方式,g_score 和 f_score 字典不仅存储了节点的路径代价信息,还隐式地扮演了 CLOSED 集合的角色,标记了哪些节点已经被处理过,以及它们当前已知的最优路径代价。

与传统 A* 的对比与权衡

| 特性 | 传统 A (带 CLOSED 集合) | 单队列 A (隐式 CLOSED) |

以上就是A 算法中单队列实现原理与“关闭列表”的隐式处理的详细内容,更多请关注其它相关文章!


# ai  # 荆州抖音seo矩阵价格  # 大连关键词排名优化费用  # 广东学院网站建设  # 网站十周年推广活动  # 通常会  # 曼哈顿  # 未被  # 将其  # 浮点  # 点到  # 是一个  # 数据结构  # 隐式  # 最优  # python  # 网站性能优化怎么入手  # 大连网站优化谁家靠谱  # seo优化员重要吗  # 网站如何推广力推隐迅推  # 东莞网站建设单位招聘  # 陶瓷推广营销方案 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: rabbitmq 持久化有什么缺点?  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  B站怎么快速升级 B站用户等级提升攻略【详解】  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  教资成绩怎么查询  惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  J*aScript大数运算_BigInt使用指南  Teambition网盘如何共享文件  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐  《盗墓笔记手游》技能介绍  PHP多语言网站的实现:会话管理与翻译函数优化教程  汽水音乐官网网页版入口 汽水音乐官网网页版在线入口  如何在Python中安全地将环境变量转换为整数并满足Mypy类型检查  Symfony路由参数转换器:实体存在性验证与错误处理策略  在VS Code中利用AI辅助进行代码迁移  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  263企业邮箱如何设置邮件转发功能  QQ邮箱注册地址 免费获取QQ邮箱账号  虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口  网易云音乐闹钟铃声设置教程  yy漫画官方网站登录入口_yy漫画在线阅读页面地址  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  铁路12306官网入口 铁路12306中国铁路官网登录首页  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  优化Leaflet弹出层图片显示:条件渲染策略  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  如何外贸网站设计-能留住客户提升用户体验!  composer licenses 命令:如何检查项目依赖的许可证?  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  解决异步Python机器人中同步操作的阻塞问题  PHP utf8_encode 字符编码转换陷阱与解决方案  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  外卖小程序对接第三方配送  c++如何使用std::thread::join和detach_c++线程生命周期管理  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  windows10怎么更改下载路径_windows10默认存储位置修改教程  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  《百果园》充值余额方法  Python模块化编程:避免循环导入与共享函数的最佳实践  Golang如何使用log记录日志信息_Golang log日志记录方法总结  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  支付宝网页版在线入口 支付宝官网电脑登录入口 

 2025-11-22

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.