基于A星算法的最优路径规划系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于A*算法的最优路径规划系统
XXXXXXXXX
摘要:人工智能(Artificial Intelligence)是当前科学技术发展的一门前沿学科,同时也是一门新思想,新观念,新理论,新技术不断出现的新兴学科以及正在发展的学科。本文将主要介绍人工智能在搜索方法上的应用,即基于A*算法的最优路径规划问题的解决方法。A*算法是一种求解最短路径的有效方法,也是人工智能算法中一种简单的启发式搜索方法。本文介绍了A* 算法的原理及实现机制,以及在搜索出的结点解空间集中,用A* 算法如何选择最优结点,最终求解出最短路径的过程。
关键词:人工智能;研究报告;模板
本组成员:xxxxxxx
本人分工:A*算法设计及实现
1 引言
人工智能是在计算机科学,控制论,信息论,神经心理学,哲学,语言学等多种学科研究的基础发展起来的,因此又可把它看作是一门综合性的边缘学科[1]。它的出现及所取得的成就引起了人们的高度重视,并取得了很高的评价。有的人把它与空间技术,原子能技术一起并誉为20世纪的三大科学技术成就。人工智能学科研究的主要内容包括:知识表示、自动推理和搜索方法、机器学习和知识获取、知识处理系统、自然语言理计算机视觉、智能机器人、自动程序设计等方面。
本文主要介绍在路径规划问题上使用A*搜索算法来找到最优路径的设计与实现。
路径规划是指在旅行前或旅行中为驾驶员提供参考行驶路线的过程,是车辆定位与导航系统的基本功能之一针对陆地车辆导航的不同要求,在路径规划中可采取多种优化标准,如最短距离、最少行驶时间或收费。本实验中将使用最短距离来寻找最优路径。
2 算法原理与系统设计
2.1 A*算法的基本思想
A*算法在人工智能中是一种典型的启发式搜索算法,通过选择合适的估价函数,指导搜索朝着最有希望的方向前进, 以求得最优解[2]。A*算法中,关键是求估价函数:f(n)=g(n)+h(n).其中,g(n)是从起点u 到当前节点n 己付出的代价,h(n)是从当前节点n 到目标节点v 的代价估计函数,必须保证h(n) <=h’(n),其中h’(n)是从当前点到目标点的实际最小代价。
2.2 A*算法的步骤
A*算法的搜索步骤如下:
(1)给起始节点标记,对它的没有标记过的子节点进行扩展;
(2)对每一个子节点计算评价函数值,按评价值的大小进行排列,找出评价值最小的节点,并给它作标记,如果当前节点就是目标节点,则停止搜索。
(3)否则,对最新被标记的节点进行第(2)步处理,并记录最短路径。
2.3算法分析
A*算法是利用对问题的了解和对问题求解过程和解的了解,寻求某种有利于问题求解的启发信息,从而利用这些启发信息去搜索最优路径它不用遍历整个地图,而是每一步搜索都根据启发函数朝着某个方向搜索当地图很大很复杂时,它的计算复杂度大大优于算法,是一种搜索速度非常快、效率非常高的算法。但是,相应的A*算法也有它的缺点,启发性信息是人为加入的,有很大的主观
性,直接取决于操作者的经验,对于不同的情形要用不同的启发信息和启发函数,且他们的选取难度比较大,很大程度上找不到最优路径。
2.4 系统设计
系统的实现流程图如图2.1所示。
图2.1 系统的实现流程图
首先判断初始结点的周围8个结点是否有障碍点,从除障碍点以外的结点中求解出代价最小的结点,并加入到结果列表中。
求解结点代价是根据A*算法的估价函数f(n)=g(n)+h(n)。其中g(n)是从起始结点到当前节点n 己付出的代价,h(n)是从当前节点n 到目标节点的代价估计。
对于本实验中,设计的g(n)=10(当前结点与起始结点在同一水平线或者竖直线上。如图2.2中,初始结点,即蓝结点与1、3、5、7结点之间的代价即为10。)g(n)=14(当前结点与起始结点在同一对角线上时。如图2.2中,初始结点,即蓝结点与0、2、4、6结点之间的代价即为14。)
对于本实验中,h(n) = (当前结点与目标结点之间横坐标格数+ 当前结点与目标结点之间纵坐标格数) * 10。如图2.2中,当前结点依次为0、1、2、3、4、5、6、7,分别与红色目标结点求解h(n)。
图2.2 搜索图
每次求解出的8个h(n),比较大小,选出最小的结点作为起始节点继续搜索。直到遇到目标结点便结束搜索,画出求解出的最优路径。
3 系统实现
void CAxingTestDlg::ExecuteCalculate(RectIndex RI[], RectIndex * resultRI, bool * find) {
//判断8个相邻点里是否有障碍点
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < blockPointNum; j++)
{
if (RI[i].m == blockIndexM[j]&&RI[i].n == blockIndexN[j])//有障碍点
{
RI[i].weight = 10000;
}
}
}
//得到权值最小的点
int minWeight=10000, minweightIndexM,minweightIndexN;
for(int i = 0; i < 8; i++)
{
minWeight = min(minWeight,RI[i].weight);
}
resultRI->weight = minWeight;
for(int i = 0; i < 8; i++)//获得权值最小点的坐标
{
if (RI[i].weight == minWeight)
{
minweightIndexM = RI[i].m;
minweightIndexN = RI[i].n;
}
}
resultRI->m = minweightIndexM;
resultRI->n = minweightIndexN;
pathPointIndex[pathPointIndexSub].m = resultRI->m;//存储路径
pathPointIndex[pathPointIndexSub].n = resultRI->n;
pathPointIndex[pathPointIndexSub].weight = resultRI->weight;//存储当前遍历点的权值totalWeigeht += pathPointIndex[pathPointIndexSub].weight;
pathPointIndexSub++;
//判断8个相邻点是否有目标点
for (int i = 0; i < 8; i++)
{
if (RI[i].m == endRectIndex.m&&RI[i].n == endRectIndex.n)
{
*find = true;
break;
}
}
}
void CAxingTestDlg:: GetAroundPoint(RectIndex RI0, RectIndex RI[])//获得邻接点坐标,同时计算权值
{
int i = RI0.m;
int j = RI0.n;
int postM,postN;
RI[0].m = i-1;
RI[0].n = j-1;
postM = (i-1)>endRectIndex.m?(i-1-endRectIndex.m):(endRectIndex.m-(i-1));
postN = (j-1)>endRectIndex.n?(j-1-endRectIndex.n):(endRectIndex.n-(j-1));