讲师中心 微信公众号
AI工具推荐 视频效率加速

C++实现基于优先队列的A*算法 _ 路径优化与代价计算【源码】

千晨吖_2082

千晨吖_2082

发布时间:2026-04-14 19:32:47

|

234人浏览过

|

来源于php中文网

原创

std::priority_queue不能直接用于A*,因其不支持decrease_key操作,无法动态更新节点优先级;正确做法是允许重复入队但首次出队即标记closed_set,配合自定义operator<(先比f再比g)和一致的hash实现。

c++实现基于优先队列的a*算法 _ 路径优化与代价计算【源码】

为什么 std::priority_queue 不能直接用于 A\*?

A\* 需要动态更新节点的优先级(比如发现更短路径时重设 f(n) = g(n) + h(n)),但 std::priority_queue 是只进不出的堆容器,不支持修改任意元素的优先级,也没有提供 decrease_key 接口。强行用它会导致重复入队、冗余计算,甚至漏掉最优解。

常见错误现象:std::priority_queue 中同一节点多次出现,visited 标记晚于出队判断,结果路径非最优或运行超时。

  • 正确做法:用 std::set 或 std::unordered_set 配合自定义比较,或改用支持减小键值的数据结构(如 boost::heap::fibonacci_heap)
  • 更轻量的实操方案:允许重复入队,但首次出队即标记为已访问(closed_set),后续遇到相同坐标直接跳过
  • 必须重载 operator<,按 f 值升序;若 f 相同,可按 g 降序避免过早探索绕远分支

如何设计节点结构并保证哈希/比较一致性?

节点必须能唯一标识位置(如网格坐标),同时携带当前 g 和预估 h。若用 std::set 管理开放列表,需定义严格弱序;若用 std::unordered_set 做闭合检查,需提供 hash 和 operator==。

容易踩的坑:operator< 比较逻辑和 hash 计算不一致,导致节点在 set 和 unordered_set 中被视为不同实体。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 推荐结构体字段:int x, y, g, f;f 可现场计算,不存也行,但缓存可省去重复调用 heuristic()
  • operator< 示例:return f != other.f ? f other.g;(先比 f,再比 g 防止震荡)
  • 哈希函数示例:return std::hash<int>{}(x) ^ (std::hash<int>{}(y) ,务必与 <code>operator== 的字段完全一致

启发式函数 heuristic() 怎么选才不破坏可采纳性?

A\* 最优性的前提是启发函数 h(n) 可采纳(admissible)且一致(consistent)。简单说:不能高估真实代价,且满足三角不等式。否则可能得不到最短路径。

典型错误:在 8 连通网格中用欧氏距离却不乘以最大移动代价;或在有障碍物的地图中用曼哈顿距离却忽略不可达性。

  • 4 连通网格(只能上下左右)→ 用 abs(x1-x2) + abs(y1-y2)(曼哈顿)
  • 8 连通网格(含对角线)→ 用 max(abs(x1-x2), abs(y1-y2))(切比雪夫),或更紧的 manhattan + (sqrt(2)-1)*min(dx,dy)
  • 禁止使用带权重的启发式(如乘以 1.1)除非明确接受次优解;调试时可临时放大 h 观察搜索范围收缩,但上线前必须归一

实际跑通的关键边界检查有哪些?

很多实现卡在起点不可达、终点被围死、越界访问或浮点精度上。A\* 本身不保证有解,必须显式处理无解情况。

最容易被忽略的是:开放列表为空时未返回失败,导致无限循环或崩溃。

  • 每次从开放列表取节点前,先判空:if (open_set.empty()) return {};
  • 邻居坐标生成后,立刻检查是否越界、是否是障碍、是否已在 closed_set 中
  • 更新邻居 g 值时,用 new_g 而非 <code><=,避免浮点误差引发反复更新
  • 路径回溯时,确保每个节点的 parent 指针非空且指向合法前驱;建议用 std::map<Node, Node> 存 parent,而非在节点内嵌指针

实际部署时,性能瓶颈往往不在算法逻辑,而在哈希计算、内存分配和容器查找。如果地图固定且不大,考虑预分配节点池;若频繁查询,把 closed_set 换成二维布尔数组比哈希表快得多。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4774

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4931

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6459

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3145

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4048

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2785

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2561

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

356

2025.12.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn