机器人路径规划之A*算法(附C++源码)机器人

A*算法在Dijkstra的基础上加入了启发式变量,一般用启发式距离(两点的直线距离)表示。

启发式距离

2.算法伪代码

其中O代表优先队列,C存放着已访问过的节点。

先来看看A*算法运行的最终结果吧

首先先创建一个类代表节点(省略了构造函数等Method)。

classnode{

private:

intx,y;//坐标

doublesumCost;//f(n)

doubleheuristic;//启发值

node*backpoint;//前驱节点

};

在main函数中定义起始节点和目标节点

nodestartNode(40,10);//起始点

nodegoalNode(10,40);//目标点

初始化地图,这里计算了每个节点的启发式距离

vector《node*》tmp;

for(intj=0;j《mapSize;++j){

node*tmpNode=newnode(i,j);

tmpNode-》setHeuristic(calHeristic(tmpNode,goalNode));

tmp.push_back(tmpNode);

}

添加障碍物

voiddefineObstacle(vector《vector《node*》》&roadmap){

//先框住四周

for(inti=0;i《mapSize;++i){

roadmap[0][i]-》setObstacle();

roadmap[i][0]-》setObstacle();

roadmap[i][mapSize-1]-》setObstacle();

roadmap[mapSize-1][i]-》setObstacle();

//再定义一个条形快

for(inti=1;i《mapSize/2;++i){

roadmap[mapSize*2/3][i]-》setObstacle();

roadmap[mapSize*2/3-1][i]-》setObstacle();

roadmap[mapSize*1/3][mapSize-i]-》setObstacle();

roadmap[mapSize*1/3-1][mapSize-i]-》setObstacle();

A*算法函数

voidaStar(constnode&startNode,constnode&goalNode,vector《vector《node*》》&roadmap,Mat&background){

//使用Lambda表达式定义一个优先队列

autocmp=[](node*left,node*right){returnleft-》gN()》right-》gN();};

priority_queue《node*,vector《node*》,decltype(cmp)》O(cmp);

node*tmp=roadmap[startNode.coordinateX()][startNode.coordinateY()];

O.push(tmp);

//Algorithm24A*Algorithm

while(!O.empty()){

node*nBest=O.top();

//RemovenbestfromOandaddtoC(isVisited)。

O.pop();

nBest-》setIsVisited();

//ifnbest==qgoal,EXIT.

if(*nBest==goalNode)

break;

//八个方向都可以走

std::vector《node》motion={node(1,0,1),

node(0,1,1),

node(-1,0,1),

node(0,-1,1),

node(-1,-1,std::sqrt(2)),

node(-1,1,std::sqrt(2)),

node(1,-1,std::sqrt(2)),

node(1,1,std::sqrt(2))};

for(inti=0;i《8;i++){

nodetmpNode=motion[i];

tmpNode+=*nBest;

node*tmpNodePointer=roadmap[tmpNode.coordinateX()][tmpNode.coordinateY()];

*tmpNodePointer=tmpNode;

if(verifyNode(*tmpNodePointer)&&!tmpNodePointer-》returnIsVisited()&&!tmpNodePointer-》isObstacle()){

O.push(tmpNodePointer);

tmpNodePointer-》setIsVisited();

tmpNodePointer-》setBackpoint(nBest);

imshow(“aStar”,background);

//画出最终的路径

tmp=roadmap[goalNode.coordinateX()][goalNode.coordinateY()];

while(!(*tmp==startNode)){

tmp-》drawNode(background,imgGridSize,Scalar(255,0,0));

tmp=tmp-》returnBackpoint();

waitKey(5);

4.资源指路

A*算法其中大部分变量和算法过程我都尽量和PrinciplesofMotion中的说明保持一致,源代码已上传github(非工程文件,需自行配置)

THE END
1.最短路径A*算法原理及java代码实现(看不懂是我的失败)算法只要懂原理了,代码都是小问题,先看下面理论,尤其是红色标注的(要源码请留下邮箱,有测试用例,直接运行即可) A*算法 百度上的解释: A*[1](A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法。 公式表示为: f(n)=g(n)+h(n), https://blog.csdn.net/h348592532/article/details/44421753
2.Java编程实现A*算法完整代码java这篇文章主要介绍了Java编程实现A*算法完整代码,简单介绍了a星算法,然后分享了完整测试代码,具有一定借鉴价值,需要的朋友可以参考下。前言 A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中 通过二维数组构建的一个迷宫,“%”表示墙壁,A为起点,B为终点,“#https://www.jb51.net/article/129284.htm
3.启发式搜索AStar算法附代码A*算法是对Best-First算法的一种改进,核心思想是广搜,利用open表和close表对节点进行剪枝,同时利用启发式测度来选择最优的扩展节点。 A*算法在满足一定条件下找到的解必然是最优解。 最短路得到最优解条件:A*算法的启发式函数h如果小于等于真实值n的话,那么算法是能得到最优解的,若h大于等于真实值n,那么就不https://www.jianshu.com/p/5704e67f40aa
4.基于向量矩阵的Apriori改进算法研究摘要: 针对传统的关联分析算法Apriori执行效率低、I/O过重、计算量过大等问题,提出了一种通过减少扫描数据库次数来降低候选项集计算复杂度, 在频繁项集求解过程中通过将事务项集转换为行向量,利用“与”操作来提高算法执行效率的Apriori改进算法。利用学生在校行为数据集对Apriori改进算法进行有效性和高效性验证。https://jns.usst.edu.cn/html/2022/1/20220109.htm
5.Apriori算法如何用代码实现mb64ca025376906的技术博客Apriori算法如何用代码实现 Apriori算法是一种用于频繁项集挖掘的算法,通常用于市场篮子分析等场景,用于发现不同商品之间的关联规则。以下是使用Python实现Apriori算法的示例: from itertools import combinations # 定义函数用于生成候选项集 def generate_candidates(itemsets, k):https://blog.51cto.com/u_16213142/7073018
6.基于时空A*算法的多AGV无冲突路径规划从这一角度出发, 本文首先根据物流分拣中心的场地特点选择合适的地图建模方法, 然后将时间维度导入A*算法, 将其改进为时空A*算法, 并将时空A*算法作为基于冲突搜索框架的下层规划器, 用于求解多AGV无冲突路径规划问题. 对上述两种算法的融合, 旨在优势互补为解决路径规划中的冲突问题提供新的求解思路. 最后, 通过仿https://c-s-a.org.cn/html/2022/4/8454.htm
7.实测A*寻路与JPS寻路同一地图运行效率腾讯云开发者社区前面几篇我们把A*算法和JPS的算法都简单介绍了一下,并且展现出来了行动规划,其中A*算法的核心代码我也在《实战|OpenCV结合A*算法实现简单的运动路径规划》中放出来了, 感兴趣的朋友可以连接过去看一下,今天我们就专门对两个算法的运算效果进行一下实测,对比一下看看 https://cloud.tencent.com/developer/article/1621022