A*算法现实应用的实际意义

作者&投稿:翟薇 (若有异议请与网页底部的电邮联系)
A*算法的实际运用~

估价值与实际值越接近,估价函数取得就越好例如对于几何路网来说,可以取两节点间曼哈顿距离做为估价值,即f=g(n) + (abs(dx - nx) + abs(dy - ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijkstra算法的毫无方向的向四周搜索。conditions of heuristicOptimistic (must be less than or equal to the real cost)As close to the real cost as possible详细内容:创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。算起点的估价值;将起点放入OPEN表; while(OPEN!=NULL){ 从OPEN表中取估价值f(n)最小的节点n; if(n节点==目标节点) break; for(当前节点n的每个子节点X) { 算X的估价值; if(XinOPEN) if(X的估价值小于OPEN表的估价值) { 把n设置为X的父亲; 更新OPEN表中的估价值;//取最小路径的估价值 } if(XinCLOSE) continue; if(Xnotinboth) { 把n设置为X的父亲; 求X的估价值; 并将X插入OPEN表中;//还没有排序 } }//endfor 将n节点插入CLOSE表中; 按照估价值将OPEN表中的节点排序;//实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。}//endwhile(OPEN!=NULL)保存路径,即从终点开始,每个节点沿着父节点移动直至起点,这就是你的路径;用C语言实现A*最短路径搜索算法 ,作者 Tittup frog(跳跳蛙)。 #include #include #define MaxLength 100 //用于优先队列(Open表)的数组#define Height 15 //地图高度#define Width 20 //地图宽度 #define Reachable 0 //可以到达的结点#define Bar 1 //障碍物#define Pass 2 //需要走的步数#define Source 3 //起点#define Destination 4 //终点 #define Sequential 0 //顺序遍历#define NoSolution 2 //无解决方案#define Infinity 0xfffffff #define East (1 = 0 && y >= 0 && x length = 0; // 队内元素数初始为0} void push(Open *q, Close cls[Height][Width], int x, int y, float g){ //向优先队列(Open表)中添加元素 Close *t; int i, mintag; cls[x][y].G = g; //所添加节点的坐标 cls[x][y].F = cls[x][y].G + cls[x][y].H; q->Array[q->length++] = &(cls[x][y]); mintag = q->length - 1; for (i = 0; i length - 1; i++) { if (q->Array[i]->F Array[mintag]->F) { mintag = i; } } t = q->Array[q->length - 1]; q->Array[q->length - 1] = q->Array[mintag]; q->Array[mintag] = t; //将评价函数值最小节点置于队头} Close* shift(Open *q){ return q->Array[--q->length];} // 地图初始化操作void initClose(Close cls[Height][Width], int sx, int sy, int dx, int dy){ // 地图Close表初始化配置 int i, j; for (i = 0; i 0) { if (graph[i][j - 1].reachable) // left节点可以到达 { graph[i][j].sur |= West; graph[i][j - 1].sur |= East; } if (i > 0) { if (graph[i - 1][j - 1].reachable && graph[i - 1][j].reachable && graph[i][j - 1].reachable) // up-left节点可以到达 { graph[i][j].sur |= North_West; graph[i - 1][j - 1].sur |= South_East; } } } if (i > 0) { if (graph[i - 1][j].reachable) // up节点可以到达 { graph[i][j].sur |= North; graph[i - 1][j].sur |= South; } if (j cur->x; curY = p->cur->y; for (i = 0; i cur->sur & (1 G + 1; q[r] = &close[surX][surY]; r = (r + 1) % MaxLength; } } times++; } return times;} int astar(){ // A*算法遍历 //int times = 0; int i, curX, curY, surX, surY; float surG; Open q; //Open表 Close *p; initOpen(&q); initClose(close, srcX, srcY, dstX, dstY); close[srcX][srcY].vis = 1; push(&q, close, srcX, srcY, 0); while (q.length) { //times++; p = shift(&q); curX = p->cur->x; curY = p->cur->y; if (!p->H) { return Sequential; } for (i = 0; i cur->sur & (1 G + sqrt((curX - surX) * (curX - surX) + (curY - surY) * (curY - surY)); push(&q, close, surX, surY, surG); } } } //printf(times: %d
, times); return NoSolution; //无结果} const int map[Height][Width] = { {0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, {0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1}, {0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1}, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0}, {0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1}, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}}; const char Symbol[5][3] = { □, ▓, ▽, ☆, ◎ }; void printMap(){ int i, j; for (i = 0; i from; p->from = q; q = p; p = t; } close[srcX][srcY].from = q->from; return &(close[srcX][srcY]); case NoSolution: return NULL; } return NULL;} static Close *start;static int shortestep;int printShortest(){ Close *p; int step = 0; p = getShortest(); start = p; if (!p) { return 0; } else { while (p->from) { graph[p->cur->x][p->cur->y].value = Pass; printf((%d,%d)→
, p->cur->x, p->cur->y); p = p->from; step++; } printf((%d,%d)
, p->cur->x, p->cur->y); graph[srcX][srcY].value = Source; graph[dstX][dstY].value = Destination; return step; }} void clearMap(){ // Clear Map Marks of Steps Close *p = start; while (p) { graph[p->cur->x][p->cur->y].value = Reachable; p = p->from; } graph[srcX][srcY].value = map[srcX][srcY]; graph[dstX][dstY].value = map[dstX][dstY];} void printDepth(){ int i, j; for (i = 0; i < Height; i++) { for (j = 0; j < Width; j++) { if (map[i][j]) { printf(%s , Symbol[graph[i][j].value]); } else { printf(%2.0lf , close[i][j].G); } } puts(); } puts();} void printSur(){ int i, j; for (i = 0; i < Height; i++) { for (j = 0; j < Width; j++) { printf(%02x , graph[i][j].sur); } puts(); } puts();} void printH(){ int i, j; for (i = 0; i < Height; i++) { for (j = 0; j < Width; j++) { printf(%02d , close[i][j].H); } puts(); } puts();} int main(int argc, const char **argv){ initGraph(map, 0, 0, 0, 0); printMap(); while (scanf(%d %d %d %d, &srcX, &srcY, &dstX, &dstY) != EOF) { if (within(srcX, srcY) && within(dstX, dstY)) { if (shortestep = printShortest()) { printf(从(%d,%d)到(%d,%d)的最短步数是: %d
, srcX, srcY, dstX, dstY, shortestep); printMap(); clearMap(); bfs(); //printDepth(); puts((shortestep == close[dstX][dstY].G) ? 正确 : 错误); clearMap(); } else { printf(从(%d,%d)不可到达(%d,%d)
, srcX, srcY, dstX, dstY); } } else { puts(输入错误!); } } return (0);}

其实A*算法也是一种最好优先的算法只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:f'(n) = g'(n) + h'(n)这里,f'(n)是估价函数,g'(n)是起点到节点n的最短路径值,h'(n)是n到目标的最短路经的启发值。由于这个f'(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做近似。g(n)代替g'(n),但 g(n)>=g'(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h'(n),但h(n)<=h'(n)才可(这一点特别的重要)。可以证明应用这样的估价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是。当然它是一种最臭的A*算法。再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由于实时性的问题,h(n)的信息越多,它的计算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这里就有一个平衡的问题。

A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是先说说何谓启发式算法。

一、何谓启发式搜索算法

在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。这个寻找的过程就是状态空间搜索。

常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。这两种算法在数据结构书中都有描述,可以参看这些书得到更详细的解释。

前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。在这里就要用到启发式搜索了。

启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。我们先看看估价是如何表示的。

启发中的估价是用估价函数表示的,如:

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

其中f(n)是节点n的估价函数,g(n)实在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。如果说详细点,g(n)代表了搜索的广度的优先趋势。但是当h(n)>>g(n)时,可以省略g(n),而提高效率。这些就深了,不懂也不影响啦!我们继续看看何谓A*算法。

二、初识A*算法

启发式搜索其实有很多的算法,比如:局部择优搜索法、最好优先搜索法等等。当然A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。象局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了其他的节点,可能也把最好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。最好优先就聪明多了,他在搜索时,便没有舍弃节点(除非该节点是死节点),在每一步的估价中都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的丢失。那么A*算法又是一种什么样的算法呢?其实A*算法也是一种最好优先的算法。只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:

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

这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值,h'(n)是n到目标的最断路经的启发值。由于这个f'(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做近似。g(n)代替g'(n),但g(n)>=g'(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h'(n),但h(n)<=h'(n)才可(这一点特别的重要)。可以证明应用这样的估价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。哈!你懂了吗?肯定没懂!接着看!

举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是。当然它是一种最臭的A*算法。

再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由于实时性的问题,h(n)的信息越多,它的计算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这里就有一个平衡的问题。


p3算法在现实中存在吗
此计算方法是真实存在的。P3算法是一种用于解决任务调度问题的优化算法,在现实中存在且被广泛应用。在生产制造领域,P3算法可以帮助企业合理安排生产任务,最大程度地提高生产效率和资源利用率。在交通运输领域,P3算法可以优化公共交通车辆的调度,减少乘客等待时间和拥挤情况。在互联网广告投放、电力系统调度...

算法在前端开发的中实际应用有哪些
如果是游戏前端,算法很重要。。。比如角色寻路,主要就是使用A*算法,怪物的AI,通常需要使用树相关的算法,比如二叉树,行为树等。。。如果是APP或网页前端,实际工作中,需要使用算法的概率几乎是零。。

最短路径算法在现实生活中具有哪些实际的应用
供暖、供气、供电、供水管道等的的费用节省问题 公路修建的费用节省问题

如何将数据结构和算法应用到实际之中?
这类随时随地“发明”的算法实在不值一提,不能让你像那些著名案例一样一举成名;但它们却实实在在可以提高你的工作效率,让其他人望尘莫及。——经常有高手骄傲的宣称,别人几万、几十万行代码都解决不了的问题,他数百行代码就清楚漂亮的解决了,执行效率还高出许多倍:他们就是这样做到的。

计算方法在智能制造工程中有哪些应用和研究?
计算方法在智能制造工程中有广泛的应用和研究。以下是一些主要的方面:1. 优化算法:智能制造工程中经常需要解决各种优化问题,例如生产调度、路径规划、资源分配等。计算方法中的优化算法,如梯度下降法、遗传算法、粒子群算法等,被广泛应用于这些问题的求解。2. 数据分析与挖掘:智能制造工程涉及到大量的...

ai的实际应用ai的具体应用
人工智能的实际应用包括:1、人脸识别;2、机器翻译;3、文本编辑器或自动更正;4、搜索和推荐算法;5、聊天机器人;6、数字助理;7、社交媒体;1、人脸识别 人脸识别也称人像识别、面部识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。人脸识别涉及的技术主要包括计算机视觉、图像处理等。2、机器...

p3算法在现实中存在吗
P3算法在现实中存在。P3算法,也称为PageRank算法,是一种用于评估网页重要性的算法。它被广泛应用于搜索引擎中,例如谷歌搜索引擎就是基于P3算法来排序搜索结果的。P3算法通过分析网页之间的链接关系,将重要的网页赋予更高的权重,从而提供更准确和有用的搜索结果。P3算法的原理和实现细节可以在谷歌的创始...

机器视觉算法与应用
机器视觉算法与应用是计算机科学与技术领域的一个重要分支,它涵盖了利用计算机和图像处理技术来模拟和实现人类视觉功能的各种方法和技术。在机器视觉算法方面,目前最为广泛应用的包括特征提取、目标检测、图像分割等。例如,特征提取算法可以从图像中提取出关键信息,如边缘、角点或纹理,这些信息对于后续的分类...

并行算法未来应用
随着科技的飞速发展,研究领域的需求也随之转变。当前并行算法的研究趋势呈现出多元化的特征。不再局限于传统的算法框架,而是将并行计算作为一个核心组成部分,纳入研究的视野之中。新的研究路径注重将理论与实践相结合,更加关注于实际应用,致力于将并行算法带入日常生活和各行各业,以解决实际问题为出发点...

帮忙说一种加密方法实际应用的案例
上面所有这些都不足以成为md5的在实际应用中的问题。并且,由于md5算法的使用不需要支付任何版权费用的,...时政信息不实 垃圾广告 低质灌水 我们会通过消息、邮箱等方式尽快将举报结果通知您。 说明 0\/200 提交

平顺县15528045678: A*算法现实应用的实际意义 -
易柱天仲: A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是先说说何谓启发式算法.一、何谓启发式搜索算法 在说它之前先提提状态空间搜索.状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状...

平顺县15528045678: 最短路径算法 -
易柱天仲: 原发布者:萨sky简述几种常用的最短路径算法摘要:随着社会的发展,最短路径问题在现实生活中占据的地位越来越重要.求解这一类问题的方法有很多,包括Floyd算法、Dijkstra算法、Bellman-Ford算法、动态规划算法和智能优化算法.其...

平顺县15528045678: 什么是a算法?a*算法有什么特点
易柱天仲: A*算法:A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法.估价值与实际值越接近,估价函数取得就越好 A* (A-Star)算法是一种静态路网中求解最短...

平顺县15528045678: A*算法的原理 -
易柱天仲: A* (A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法.注意是最有效的直接搜索算法.之后涌现了很多预处理算法(ALT,CH,HL等等),在线查询效率是A*算法的数千甚至上万倍.公式表示为: f(n)=g(n)+h(n),其中 f(n) 是从初始...

平顺县15528045678: 关于A*算法和3D算法
易柱天仲: A*算法是一种启发式搜索的算法,公式表示为: f(n)=g(n)+h(n) g(n) 是在状态空间中从初始节点到n节点的实际代价, h(n)是从n到目标节点最佳路径的估计代价. 3D算法,没看懂你说什么意思

平顺县15528045678: 什么是A*算法? -
易柱天仲: 是人工智能的一个搜索算法,随便找一本人工智能的书上都有 A*算法的实质也是宽度优先搜索,只不过在宽度优先搜索的基础上增加条件控制,并不是每次把一层的所有节点都展开,而是根据某个特定的条件(估价函数)把某些或某个节点打开,以尽快找到目标节点.

平顺县15528045678: A*算法是什么? -
易柱天仲: A* (A-Star)算法是一种静态路网中求解最短路最有效的方法.公式表示为: f(n)=g(n)+h(n),其中f(n) 是从初始点经由节点n到目标点的估价函数, g(n) 是在状态空间中从初始节点到n节点的实际代价, h(n)是从n到目标节点最佳路径的估计代价.保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低.但能得到最优解.如果 估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解

平顺县15528045678: a*算法求最短路径和floyd还有dijsktra算法求最短路径的区别? -
易柱天仲: A*算法是启发式搜索,适合点对点的最短路径,单源单汇的情况 Floyd是动态规划的一种,可以求出任意两点之间的最短路径 Dijkstra是贪婪算法的一种,求一点到其他所有点的最短路,即所谓的单源最短路算法 从时间复杂度来说 Floyd是O(N^3) Dijkstra是O(N^2) 而启发式搜索就不好说了……结果当然是一样的,都是最短路,但是适用情形和时空开销就不同了 举例来说,你做任意两点间最短路可以用N次Dijkstra或者1次Floyd,时间消耗一样,显然用后者,而如果你只用求两点间的,用Floyd就不合算了

平顺县15528045678: 谁会A*路径寻找算法 -
易柱天仲: 1. 简述A*是当今游戏软件开发中十分常用的一种路径寻找算法.A*算法之所以会如此吸引人,是因为它可以保证在任何起点及任何终点间找到最佳的路径.我们可以尽量使用A*算法,除了某些特殊情况的场景.例如,如果起点和终点之间没有...

平顺县15528045678: 搜索算法中,A算法A*算法的区别(急) -
易柱天仲: A算法一般指某个搜索算法的朴素的思路A*指使用了启发式搜索之后的算法,也就是运算速度会快很多,但不一定能保证最后得到最优解

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网