A算法详细解答

上传人:公**** 文档编号:474328288 上传时间:2022-12-04 格式:DOCX 页数:9 大小:22.04KB
返回 下载 相关 举报
A算法详细解答_第1页
第1页 / 共9页
A算法详细解答_第2页
第2页 / 共9页
A算法详细解答_第3页
第3页 / 共9页
A算法详细解答_第4页
第4页 / 共9页
A算法详细解答_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《A算法详细解答》由会员分享,可在线阅读,更多相关《A算法详细解答(9页珍藏版)》请在金锄头文库上搜索。

1、A 算法详解网络未知加入时间:2005-1-28 12:55:21点击: 惡125第一部分:A*算法简介写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点 实在太少,我在这里 抛砖引玉,希望大家都来热心的参与。还是说正题,我先拿A*算法开刀,是因为A*在游戏中有它很典型的用法,是人工智 能在游戏中的代表。A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是 先说说何谓启发式算法。一、何谓启发式搜索算法:在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求 解过程表现为从 初始状态到目标状态寻找这个路径的过程。通俗点说,就是在

2、解一个问 题时,找到一条解题的过程可以从 求解的开始到问题的结果(好象并不通俗哦)。由于 求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成 的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解 实际上就是在这个图中找到一条路径可以从开始到结果。这个寻找的过程就是状态空间 搜索。常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下 找,直到找到目标 为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个 分支,以至找到目标为止。这两种算法在数据结构书中都有描述,可以参看这些书得到 更详细的解释。前面说的广度和深度优先搜

3、索有一个很大的缺陷就是他们都是在一个给定的状态空 间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不 预测的情况下就不可取了。他的效率实在太低,甚至不可完成。在这里就要用到启发式 搜索了。启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位 置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。 在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。 我们先看看估价是如何表示的。启发中的估价是用估价函数表示的,如:f(n) = g(n) + h(n)其中f(n)是节点n的估价函数,g(n)实在状态空间中

4、从初始节点到n节点的实际代价, h(n)是从n到目标节点最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息, 因为g(n)是已知的。如果说详细 点,g(n)代表了搜索的广度的优先趋势。但是当 h(n) g(n)时,可以省略g(n),而提高效率。这些就深了,不懂也不影响啦!我们继续看 看何谓A*算法。二、初识A*算法:启发式搜索其实有很多的算法,比如:局部择优搜索法、最好优先搜索法等等。当然 A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。象 局部择优搜索法,就是在搜索的过程中 选取“最佳节点”后舍弃其他的兄弟节点,父亲节 点,而一直得搜索下去。这种搜索的结

5、果很明显,由于舍弃了其他的节点,可能也把最 好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。 最好优先就聪明多了,他在搜索时,便没有舍弃节点(除非该节点是死节点),在每一步 的估价中 都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以 有效的防止“最佳节点”的丢失。那么A*算法又是一种什么样的算法呢?其实A*算法也 是一种最好优先的算法。只不过要加上一些约束条件罢了。由于在一些问题求解时,我 们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干 这种事情的!我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可

6、 采纳性。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)g = 0;/这是计算 h 值Node-h = (dx-sx)*(dx-sx) + (dy-sy)*(dy-sy); / should really use sqrt().这是计算f值,即估价值Node-f = Node-g+Node-h;Node-NodeNum = TileNum(dx, dy);Node-x = dx;Node-y = dy;OPEN-NextNode=Node; / make Open List point to fir

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号