Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
贪婪最佳优先搜索算法(Greedy Best-First Search Algorithm)在C++中的实现_创想鸟

贪婪最佳优先搜索算法(Greedy Best-First Search Algorithm)在C++中的实现

贪婪最佳优先搜索算法(greedy best-first search algorithm)在c++中的实现

计算机科学中良好的问题解决很大程度上依赖于高效的算法,例如贪婪最佳优先搜索(GBFS)。 GBFS 已经确立了作为寻路或优化问题的最佳解决方法的可信度。因此,我们在本文中深入讨论 GBFS,同时探索其使用 C++ 的实现方法。

语法

void greedyBestFirstSearch(Graph graph, Node startNode, Node goalNode);

算法

贪心最佳优先搜索算法旨在找到图中从给定起始节点到目标节点的路径。以下是该算法的一般步骤 –

初始化一个空的优先级队列。

将起始节点放入优先级队列。

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

创建一个空集来跟踪访问过的节点。

当优先级队列不为空时 –

将优先级最高的节点从队列中出列。

如果出队的节点是目标节点,则算法终止,并找到路径。

否则,将出队节点标记为已访问。

将出队节点的所有未访问的邻居节点放入优先级队列中。

如果优先级队列在到达目标节点之前变空,则不存在路径。

方法一:基于欧氏距离的启发式函数

示例

#include #include #include #include #include using namespace std;// Structure to represent a node in the graphstruct Node {   int x, y; // Coordinates of the node   int cost; // Cost to reach this node};// Euclidean distance heuristic functiondouble euclideanDistance(int x1, int y1, int x2, int y2) {   return sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));}// Custom comparison function for nodes in the priority queuestruct NodeCompare {   bool operator()(const Node& node1, const Node& node2) const {      return node1.cost > node2.cost;   }};// Greedy Best-First Search functionvoid greedyBestFirstSearch(vector<vector>& graph, Node start, Node goal) {   int rows = graph.size();   int cols = graph[0].size();   // Priority queue for nodes to be explored   priority_queue<Node, vector, NodeCompare> pq;   // Visited nodes set   unordered_set visited;   // Add the start node to the priority queue   pq.push(start);   while (!pq.empty()) {      // Get the node with the lowest cost      Node current = pq.top();      pq.pop();      // Check if the current node is the goal node      if (current.x == goal.x && current.y == goal.y) {         cout << "Goal node reached!" << endl;         return;      }      // Mark the current node as visited      int nodeId = current.x * cols + current.y;      visited.insert(nodeId);      // Explore the neighboring nodes      int dx[] = {-1, 1, 0, 0}; // Possible x-direction movements      int dy[] = {0, 0, -1, 1}; // Possible y-direction movements      for (int i = 0; i = 0 && newX = 0 && newY < cols) {            // Calculate the heuristic value for the neighboring node            double heuristicValue = euclideanDistance(newX, newY, goal.x, goal.y);            // Check if the neighboring node has not been visited            if (visited.find(newX * cols + newY) == visited.end()) {               // Create a new node for the neighboring position               Node neighbor;               neighbor.x = newX;               neighbor.y = newY;               neighbor.cost = current.cost + graph[newX][newY];               // Add the neighboring node to the priority queue               pq.push(neighbor);            }         }      }   }   cout << "Goal node not reachable!" << endl;}int main() {   // Example graph represented as a 2D vector   vector<vector> graph = {      {3, 5, 1, 2},      {1, 3, 2, 4},      {5, 2, 6, 7},      {4, 3, 1, 2}   };   Node start;   start.x = 0; // Starting x-coordinate   start.y = 0; // Starting y-coordinate   start.cost = 0; // Cost to reach the starting node   Node goal;   goal.x = 3; // Goal x-coordinate   goal.y = 3; // Goal y-coordinate   // Run Greedy Best-First Search algorithm   greedyBestFirstSearch(graph, start, goal);   return 0;}

输出

Goal node reached!

说明

这段代码包含两个关键元素。首先,它包含 Graph 类的定义,该类表示使用邻接表的图结构。

其次,它引入了 CompareEuclideanDistance – 一个自定义比较器,用于通过使用欧几里德距离公式估计节点与目标节点的距离来评估节点。

greedyBestFirstSearch 函数实现贪婪最佳优先搜索算法。它使用优先级队列根据节点的启发值来存储节点。

该算法首先将起始节点放入优先级队列中。

在每次迭代中,它将最高优先级的节点出队并检查它是否是目标节点。

如果找到目标节点,则会显示“路径已找到!”消息被打印。否则,算法将出队的节点标记为已访问,并将其未访问的相邻节点放入队列。

如果优先级队列变空而没有找到目标节点,则会显示“不存在路径!”消息已打印。

main函数通过创建图、定义起始节点和目标节点以及调用greedyBestFirstSearch函数演示了算法的用法。

方法2:基于曼哈顿距离的启发式函数

我们解决此问题的策略需要使用依赖于曼哈顿距离概念的启发式函数。这种距离度量有时称为出租车距离,涉及将节点之间的水平和垂直距离相加。

示例

#include #include #include #include #include using namespace std;// Structure to represent a node in the graphstruct Node {   int x, y; // Coordinates of the node   int cost; // Cost to reach this node};// Manhattan distance heuristic functionint manhattanDistance(int x1, int y1, int x2, int y2) {   return abs(x1 - x2) + abs(y1 - y2);}// Custom comparison function for nodes in the priority queuestruct NodeCompare {   bool operator()(const Node& node1, const Node& node2) const {      return node1.cost > node2.cost;   }};// Greedy Best-First Search functionvoid greedyBestFirstSearch(vector<vector>& graph, Node start, Node goal) {   int rows = graph.size();   int cols = graph[0].size();   // Priority queue for nodes to be explored   priority_queue<Node, vector, NodeCompare> pq;   // Visited nodes set   unordered_set visited;   // Add the start node to the priority queue   pq.push(start);   while (!pq.empty()) {      // Get the node with the lowest cost      Node current = pq.top();      pq.pop();      // Check if the current node is the goal node      if (current.x == goal.x && current.y == goal.y) {         cout << "Goal node reached!" << endl;         return;      }      // Mark the current node as visited      int nodeId = current.x * cols + current.y;      visited.insert(nodeId);      // Explore the neighboring nodes      int dx[] = {-1, 1, 0, 0}; // Possible x-direction movements      int dy[] = {0, 0, -1, 1}; // Possible y-direction movements      for (int i = 0; i = 0 && newX = 0 && newY < cols) {            // Calculate the heuristic value for the neighboring node            int heuristicValue = manhattanDistance(newX, newY, goal.x, goal.y);            // Check if the neighboring node has not been visited            if (visited.find(newX * cols + newY) == visited.end()) {               // Create a new node for the neighboring position               Node neighbor;               neighbor.x = newX;               neighbor.y = newY;               neighbor.cost = current.cost + graph[newX][newY];               // Add the neighboring node to the priority queue               pq.push(neighbor);            }         }      }   }   cout << "Goal node not reachable!" << endl;}int main() {   // Example graph represented as a 2D vector   vector<vector> graph = {      {3, 5, 1, 2},      {1, 3, 2, 4},      {5, 2, 6, 7},      {4, 3, 1, 2}   };   Node start;   start.x = 0; // Starting x-coordinate   start.y = 0; // Starting y-coordinate   start.cost = 0; // Cost to reach the starting node   Node goal;   goal.x = 3; // Goal x-coordinate   goal.y = 3; // Goal y-coordinate   // Run Greedy Best-First Search algorithm   greedyBestFirstSearch(graph, start, goal);   return 0;}

输出

Goal node reached!

说明

该代码遵循与方法 1 类似的结构,但使用自定义比较器 CompareManhattanDistance,该比较器使用曼哈顿距离公式根据到目标节点的估计距离来比较节点。

greedyBestFirstSearch 函数使用曼哈顿距离启发式实现贪婪最佳优先搜索算法。

main函数演示了算法的使用,创建一个图,定义起始节点和目标节点,并调用greedyBestFirstSearch函数。

结论

在本文中,我们探讨了贪婪最佳优先搜索算法及其在 C++ 中的实现。通过采用这些方法,程序员可以有效地找到图中的路径并解决优化问题。启发式函数的选择,例如欧氏距离或曼哈顿距离,可以显着影响算法在不同场景下的性能。

以上就是贪婪最佳优先搜索算法(Greedy Best-First Search Algorithm)在C++中的实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445111.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
获取和设置C语言中线程属性的堆栈大小
上一篇 2025年12月17日 22:11:56
为什么在C++代码中使用extern “C”?
下一篇 2025年12月17日 22:12:04

相关推荐

  • Java字符串高级解析:使用正则表达式处理复杂指令模式

    Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式

    本教程演示如何使用Java的java.util.regex包,通过正则表达式高效解析包含多条调音指令的复杂字符串。我们将学习构建匹配特定模式的正则表达式,并利用Pattern和Matcher类从输入字符串中准确提取乐器名称、调音方向和数值,从而将原始指令转换为清晰可读的输出格式。 1. 问题背景与挑…

    2026年9月25日 • 用户投稿
    000
  • Debian Nginx日志路径在哪里

    Debian Nginx日志路径在哪里Debian Nginx日志路径在哪里Debian Nginx日志路径在哪里Debian Nginx日志路径在哪里

    Debian系统中,Nginx的访问日志和错误日志默认存储位置如下: 访问日志 (access log): /var/log/nginx/access.log错误日志 (error log): /var/log/nginx/error.log 以上路径是标准Debian Nginx安装的默认配置。如…

    2026年9月25日 • 用户投稿
    100
  • 3D漫画在线阅读漫画入口 3D漫画免费漫画正版漫画在线浏览

    3D漫画在线阅读漫画入口 3D漫画免费漫画正版漫画在线浏览3D漫画在线阅读漫画入口 3D漫画免费漫画正版漫画在线浏览3D漫画在线阅读漫画入口 3D漫画免费漫画正版漫画在线浏览3D漫画在线阅读漫画入口 3D漫画免费漫画正版漫画在线浏览

    3D漫画在线阅读入口是https://www.3dmanhua.com/,该平台资源丰富、更新及时,提供高清流畅的阅读体验和简洁易用的操作界面,并支持个性化推荐、书架管理及夜间模式等贴心功能。 3D漫画在线阅读入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来3D漫画在线阅读浏览地址,喜…

    2026年9月25日 • 用户投稿
    100
  • sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法

    sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法sublime如何同步多台电脑的配置和插件 _sublime多设备配置同步方法

    通过管理Sublime Text配置目录并结合云盘或Git实现多设备同步。将Packages目录移至云盘并创建符号链接,或用Git版本化关键配置文件,配合Package Control自动恢复插件,确保各设备设置一致。 Sublime Text 是许多开发者喜爱的轻量级编辑器,跨设备使用时保持配置和…

    2026年9月25日 • 用户投稿
    000
  • 操作系统的分类和发展

    操作系统的分类和发展操作系统的分类和发展操作系统的分类和发展操作系统的分类和发展

    知识概览 文章目录知识概览操作系统的分类和发展 手工操作阶段批处理阶段——单道批处理系统批处理阶段——多道批处理系统分时操作系统实时操作系统其他几种操作系统 知识回顾与重要考点 操作系统的分类和发展 如此AI写作 AI驱动的内容营销平台,提供一站式的AI智能写作、管理和分发数字化工具。 137 查看…

    2026年9月25日 • 用户投稿
    000
  • DNF手游:首批“75级武器”曝光,自带四属性攻击

    DNF手游:首批“75级武器”曝光,自带四属性攻击DNF手游:首批“75级武器”曝光,自带四属性攻击DNF手游:首批“75级武器”曝光,自带四属性攻击DNF手游:首批“75级武器”曝光,自带四属性攻击

    从策划在前期见面会透露的信息以及玩家“十四”爆料的内容来看,九月份DNF手游上线安图恩团本基本上已经是板上钉钉的事了,大概率会和金秋礼包同步更新。而安图恩团本的开启,势必会对游戏环境造成巨大冲击,首当其冲的就是玩家们即将迎来新一轮的武器毕业更替。 作为地下城系列最具代表性的团队副本之一,安图恩产出的…

    2026年9月25日 • 用户投稿
    000
  • MySQL连接数设置技巧与注意事项

    MySQL连接数设置技巧与注意事项MySQL连接数设置技巧与注意事项MySQL连接数设置技巧与注意事项MySQL连接数设置技巧与注意事项

    MySQL连接数设置技巧与注意事项 MySQL是一种常用的关系型数据库管理系统,在实际应用中,对于MySQL连接数的设置要特别注意,以确保系统的稳定性和性能。本文将介绍关于MySQL连接数设置的技巧和注意事项,并提供具体的代码示例供参考。 1. 连接数的概念 在MySQL中,连接数指的是同时连接到数…

    2026年9月25日 • 用户投稿
    000
  • laravel和thinkphp路由区别

    laravel和thinkphp路由区别laravel和thinkphp路由区别laravel和thinkphp路由区别laravel和thinkphp路由区别

    laravel路由有如下这些功能: 基本路由路由重定向 视图路由路由参数必填参数 可选参数 正则表达式约束命名路由路由组中间件 命名空间 子域名路由 路由前缀 路由命名前缀路由模型绑定隐式绑定 显式绑定频率限制表单方法伪造访问当前路由  (推荐学习:laravel开发) 所有 Laravel 路由都…

    2026年9月25日 • 用户投稿
    000
  • 360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程

    360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程

    关闭360极速浏览器热搜和新闻弹窗需三步操作:一、在“设置-实验室-其他设置”中关闭“启用‘360热点资讯’功能”;二、在“隐私设置-网站设置-弹出式窗口”中开启阻止;三、手动点击弹窗上的“不再弹出”选项。 如果您在使用360极速浏览器时频繁遭遇热搜和新闻弹窗干扰,影响正常浏览体验,这通常是因为浏览…

    2026年9月25日 • 用户投稿
    000
  • 怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算

    怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算

    豆包ai可通过三个技巧优化numpy计算效率。1. 描述逻辑让ai生成高效向量化表达式,如用np.mean(arr * (arr > 0), axis=1)替代循环求每行正数均值;2. 提供现有代码让ai分析瓶颈并提出优化建议,如将显式循环改为np.where(np.sum(arr, axis…

    2026年9月25日 • 用户投稿
    000
  • 微星MPG Z790 EDGE TI WIFI主板测试 14+1+1相供电

    微星MPG Z790 EDGE TI WIFI主板测试 14+1+1相供电微星MPG Z790 EDGE TI WIFI主板测试 14+1+1相供电微星MPG Z790 EDGE TI WIFI主板测试 14+1+1相供电微星MPG Z790 EDGE TI WIFI主板测试 14+1+1相供电

    微星mpg z790 edge ti wifi主板在极限负载下表现稳定,其14+1+1相供电设计为高性能处理器提供充足电力支持。1. 在极限负载测试中,如cinebench r23和prime95烤机,主板能持续为i9-13900k提供稳定电流,vrm温度控制出色,未出现降频。2. 日常高负载游戏如…

    2026年9月25日 • 用户投稿
    000
  • sublime如何卸载插件 _sublime插件卸载教程

    sublime如何卸载插件 _sublime插件卸载教程sublime如何卸载插件 _sublime插件卸载教程sublime如何卸载插件 _sublime插件卸载教程sublime如何卸载插件 _sublime插件卸载教程

    通过Package Control卸载:打开Sublime Text,调出命令面板,输入Remove Package,选择插件并删除;2. 手动删除:关闭软件后进入Packages目录,删除对应插件文件夹;3. 注意清理User目录下的残留配置文件,避免冗余。操作安全,不影响主程序。 在 Subli…

    2026年9月25日 • 用户投稿
    000
  • vivo Z5处理器是什么型号

    vivo Z5处理器是什么型号vivo Z5处理器是什么型号vivo Z5处理器是什么型号vivo Z5处理器是什么型号

    vivo Z5 搭载高通骁龙 712 处理器,其规格包括:1)64 位,8 核;2)主频高达 2.3GHz;3)GPU:Adreno 616;4)10nm 制造工艺;5)平衡高性能和能效;6)支持快速充电和有效的散热;7)增强的人工智能和游戏体验。 vivo Z5搭载的处理器型号 vivo Z5搭载…

    2026年9月25日 • 用户投稿
    000
  • GPU显存带宽如何影响4K纹理加载速度?

    显存带宽不足会严重制约4K纹理数据在显存与GPU核心间的传输速度,导致帧率下降、纹理pop-in、画面模糊等问题。4K纹理数据量庞大,现代渲染需频繁采样多张高分辨率贴图,叠加Mipmap切换和复杂着色器操作,使GPU对显存带宽需求激增。带宽不足时,数据流转不畅,渲染管线停滞,直接影响流畅度。此外,显…

    2026年9月25日
    000
  • 如何配置Debian Apache日志格式

    如何配置Debian Apache日志格式如何配置Debian Apache日志格式如何配置Debian Apache日志格式如何配置Debian Apache日志格式

    本文介绍如何在Debian系统上自定义Apache的日志格式。 以下步骤将指导您完成配置过程: 第一步:访问Apache配置文件 Debian系统的Apache主配置文件通常位于 /etc/apache2/apache2.conf 或 /etc/apache2/httpd.conf。 使用以下命令以…

    2026年9月25日 • 用户投稿
    100
  • 抖音账号不涨粉,持续发布作品还有意义吗?不涨粉时该怎么办?解析五大核心原因!

    抖音账号不涨粉,持续发布作品还有意义吗?不涨粉时该怎么办?解析五大核心原因!抖音账号不涨粉,持续发布作品还有意义吗?不涨粉时该怎么办?解析五大核心原因!抖音账号不涨粉,持续发布作品还有意义吗?不涨粉时该怎么办?解析五大核心原因!抖音账号不涨粉,持续发布作品还有意义吗?不涨粉时该怎么办?解析五大核心原因!

    一、抖音不涨粉时,坚持发作品到底值不值得? 1.1 算法推荐机制的真相 抖音的流量分发系统核心在于内容表现力与账号健康度。即使粉丝增长缓慢,持续输出内容依然具备不可忽视的价值:维持账号活跃信号:系统更愿意把流量倾斜给高频更新的创作者测试爆款潜力方向:通过不同内容获取数据反馈,逐步明确用户偏好沉淀内容…

    2026年9月25日 • 用户投稿
    000
  • Java中整数类型溢出行为详解:二进制补码与循环特性

    Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性

    Java中原始整数类型在处理超出其范围的数值时,会遵循一种基于二进制补码的循环溢出机制。这意味着当正数溢出时会“回卷”为负数,反之亦然,如同数字在一个有限的圆环上循环。理解这一特性对于准确预测类型转换和算术运算结果至关重要。 计算机中的数值表示:位、字节与二进制 在计算机底层,所有数据都以二进制形式…

    2026年9月25日 • 用户投稿
    000
  • 余承东:问界 M8 纯电版预售 72 小时 小订突破 15000 台

    余承东:问界 M8 纯电版预售 72 小时 小订突破 15000 台余承东:问界 M8 纯电版预售 72 小时 小订突破 15000 台余承东:问界 M8 纯电版预售 72 小时 小订突破 15000 台余承东:问界 M8 纯电版预售 72 小时 小订突破 15000 台

    7 月 28 日,华为常务董事、终端 bg 董事长余承东在微博透露,问界 m8 纯电版开启预售仅 72 小时,小订数量已突破 15000 台。其中,全新推出的夜紫配色订单占比超过 40%。 问界 M8 纯电版 据 CNMO 消息,问界 M8 纯电版于 7 月 25 日正式启动预售,起售价为 37.8…

    2026年9月25日 • 用户投稿
    000
  • 诛仙2六字真言坐标是什么 六字真言中原奇遇完成攻略

    诛仙2六字真言坐标是什么 六字真言中原奇遇完成攻略诛仙2六字真言坐标是什么 六字真言中原奇遇完成攻略诛仙2六字真言坐标是什么 六字真言中原奇遇完成攻略诛仙2六字真言坐标是什么 六字真言中原奇遇完成攻略

    诛仙2“六字真言”奇遇任务需前往天音寺(坐标:26795,26726,10022),到达后在世界聊天频道输入“顺风顺水顺财”即可触发奇遇,完成任务后可领取奖励。 具体完成方法如下: 1、任务地点:天音寺,对应坐标为(26795,26726,10022) 2、触发方式: 阿里云-虚拟数字人 阿里云-虚…

    2026年9月25日 • 用户投稿
    000
  • Java数据类型溢出:原理、预测与避免

    Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免

    本文旨在深入解析Java中数据类型溢出的现象,阐述其背后的二进制补码原理,并提供预测溢出结果的方法。通过理解数据在计算机中的存储方式,以及溢出时数值的循环特性,开发者可以更好地掌握Java中的数据类型,避免潜在的错误。 数据在计算机中的存储:二进制补码 计算机底层使用二进制(bits)来表示所有数据…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信