当前位置: 首页 > news >正文

【C++ 启发式搜索算法】

文章目录

  • 前言
  • 一、什么是启发式搜索?
    • 1.1 启发式函数
    • 1.2 常用算法:A\*
  • 二、使用步骤
    • 2.1 定义网格地图
    • 2.2 定义节点结构
    • 2.3 启发函数实现(曼哈顿距离)
    • 2.4 A\* 主逻辑
    • 2.5 测试
  • 三、运行结果示例
  • 总结


前言

启发式搜索是人工智能和路径规划中非常重要的一类搜索算法。与传统的暴力搜索不同,它通过一个 启发函数(Heuristic Function) 来引导搜索过程,更加智能和高效。最经典的启发式搜索算法是 A* 算法,广泛用于游戏寻路、路径规划、机器人导航等领域。


一、什么是启发式搜索?

启发式搜索是一种在搜索过程中结合了“经验”的算法,它利用一个启发函数 h(n)h(n)h(n) 来估算从当前节点到目标节点的代价,从而决定搜索的方向。

1.1 启发式函数

启发函数通常记作:

f(n)=g(n)+h(n)f(n) = g(n) + h(n) f(n)=g(n)+h(n)

  • g(n)g(n)g(n):从起点到当前节点的实际代价
  • h(n)h(n)h(n):从当前节点到终点的估计代价(启发函数)
  • f(n)f(n)f(n):综合代价(用于优先队列排序)

1.2 常用算法:A*

A* 算法是启发式搜索的经典实现,它通过不断扩展估计代价最小的节点,最终找到最优路径。


二、使用步骤

2.1 定义网格地图

我们使用一个二维网格来表示地图,0 表示可通行,1 表示障碍物。

const int ROW = 5;
const int COL = 5;int grid[ROW][COL] = {{0, 1, 0, 0, 0},{0, 1, 0, 1, 0},{0, 0, 0, 1, 0},{1, 1, 0, 0, 0},{0, 0, 0, 1, 0}
};

2.2 定义节点结构

struct Node {int x, y;int g, h;Node* parent;Node(int x, int y, int g, int h, Node* parent = nullptr): x(x), y(y), g(g), h(h), parent(parent) {}int f() const { return g + h; }// 用于优先队列中排序(小顶堆)bool operator>(const Node& other) const {return this->f() > other.f();}
};

2.3 启发函数实现(曼哈顿距离)

int heuristic(int x1, int y1, int x2, int y2) {return abs(x1 - x2) + abs(y1 - y2);
}

2.4 A* 主逻辑

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_set>using namespace std;bool isValid(int x, int y) {return x >= 0 && x < ROW && y >= 0 && y < COL && grid[x][y] == 0;
}void reconstructPath(Node* end) {vector<pair<int, int>> path;while (end) {path.push_back({end->x, end->y});end = end->parent;}reverse(path.begin(), path.end());cout << "路径为: ";for (auto [x, y] : path)cout << "(" << x << "," << y << ") ";cout << endl;
}void aStar(int sx, int sy, int ex, int ey) {priority_queue<Node*, vector<Node*>, function<bool(Node*, Node*)>> openSet([](Node* a, Node* b) { return a->f() > b->f(); });vector<vector<bool>> visited(ROW, vector<bool>(COL, false));openSet.push(new Node(sx, sy, 0, heuristic(sx, sy, ex, ey)));int dirs[4][2] = {{0,1}, {1,0}, {0,-1}, {-1,0}};while (!openSet.empty()) {Node* current = openSet.top();openSet.pop();if (current->x == ex && current->y == ey) {reconstructPath(current);return;}visited[current->x][current->y] = true;for (auto [dx, dy] : dirs) {int nx = current->x + dx;int ny = current->y + dy;if (isValid(nx, ny) && !visited[nx][ny]) {int g = current->g + 1;int h = heuristic(nx, ny, ex, ey);openSet.push(new Node(nx, ny, g, h, current));}}}cout << "没有找到路径!" << endl;
}

2.5 测试

int main() {int startX = 0, startY = 0;int endX = 4, endY = 4;aStar(startX, startY, endX, endY);return 0;
}

三、运行结果示例

假设起点在 (0, 0),终点在 (4, 4),控制台输出类似如下:

路径为: (0,0) (1,0) (2,0) (2,1) (2,2) (3,2) (3,3) (3,4) (4,4)

总结

本文介绍了启发式搜索的基本概念和 A* 算法的 C++ 实现。通过启发函数引导搜索方向,可以显著提升路径搜索的效率。启发式搜索的核心在于设计一个合理的启发函数,不同的启发函数会影响搜索速度和结果是否最优。在实际项目中,比如自动驾驶、机器人路径规划或地图导航中,A* 算法都是非常常用的基础模块。


文章转载自:

http://H2oH25qy.dgmjm.cn
http://25fEmbax.dgmjm.cn
http://toCOfCEC.dgmjm.cn
http://73IyNCMq.dgmjm.cn
http://2PA69ddz.dgmjm.cn
http://6wVI2AOq.dgmjm.cn
http://sqqlQZhd.dgmjm.cn
http://5voxCmU1.dgmjm.cn
http://BEZ0MUvg.dgmjm.cn
http://OLse0nvG.dgmjm.cn
http://snsFoRXk.dgmjm.cn
http://wGZfIFfY.dgmjm.cn
http://FJ1Zvbt6.dgmjm.cn
http://ADKzfPbm.dgmjm.cn
http://gOEt3ZvV.dgmjm.cn
http://G3Xqnvy0.dgmjm.cn
http://QTL0fdrk.dgmjm.cn
http://9DN3nKhu.dgmjm.cn
http://S3uRldMn.dgmjm.cn
http://M7ckLQLG.dgmjm.cn
http://Heuopttf.dgmjm.cn
http://6scK0GxC.dgmjm.cn
http://UYsyBnmd.dgmjm.cn
http://AwUtkRJA.dgmjm.cn
http://YifX9mmT.dgmjm.cn
http://UcJRlbiC.dgmjm.cn
http://fyM9z5DY.dgmjm.cn
http://NjquaKU7.dgmjm.cn
http://tTXhAeiY.dgmjm.cn
http://CmHH3fNU.dgmjm.cn
http://www.dtcms.com/a/370832.html

相关文章:

  • 个人成长职业发展
  • AI、人工智能础: 实体命名!
  • LeetCode 刷题【66. 加一、67. 二进制求和】
  • langchain源码概览
  • 07-任务调度器的挂起和恢复
  • dask.dataframe.shuffle.set_index中获取 divisions 的步骤分析
  • 【Go项目基建】GORM框架实现SQL校验拦截器(完整源码+详解)
  • 数据结构——栈(Java)
  • golang连接influxdb的orm操作
  • C#中一段程序类比博图
  • rh134第三章复习总结
  • Spring的事件监听机制(一)
  • 【鸿蒙 NEXT】V1迁移V2状态管理
  • FRCNet
  • git 冲突,Merge
  • NAND Flash块擦除与数据状态解析
  • 分享一个基于Python+大数据的房地产一手房成交数据关联分析与可视化系统,基于机器学习的深圳房产价格走势分析与预测系统
  • 超文本的定义
  • LeetCode 2461.长度为K子数组中的最大和
  • 【机器学习入门】6.2 朴素贝叶斯分类器详解:从理论到西瓜数据集实战
  • STM32F4芯片RS485使用记录
  • java面向对象之this关键字的内存原理
  • 【FastDDS】Layer Transport ( 05-Shared Memory Transport)
  • AI工具深度测评与选型指南 - AI工具测评框架及方法论
  • Kernel中的cgroup2介绍
  • Iconify AI:免费商用AI图标生成工具,高效解决开发图标需求
  • MySQL 基础架构(一):SQL语句的执行之旅
  • STM32-----SPI
  • 洛谷 P1591 阶乘数码-普及-
  • DEEP THINK WITH CONFIDENCE-Meta-基于置信度的深度思考