`

对于A*算法的一些疑问

阅读更多
链接:http://godorz.info/2009/11/some-questions-about-a-star-algorithm/

Article 13518 of comp.games.development.programming.algorithms:
Path: nntp.stanford.edu!newsfeed.stanford.edu!logbridge.uoregon.edu
!cyclone-west.rr.com!news.rr.com|news-west.rr.com
!newsfeed2.earthlink.net!newsfeed.earthlink.net
!newsmaster1.prod.itd.earthlink.net
!newsread2.prod.itd.earthlink.net.POSTED!not-for-mail
From: “Tom Hatfield” <rskorpion@NOSPAMearthlink.net>
Newsgroups: comp.games.development.programming.algorithms
References: <8bvf90$rto$1@duke.telepac.pt>
Subject: Re: Path-finding algorithm
Lines: 97
Message-ID: <mXDF4.13013$64.467989@newsread2.prod.itd.earthlink.net>
Date: Sun, 02 Apr 2000 08:56:50 GMT
NNTP-Posting-Host: 63.27.26.87
Organization: EarthLink Inc. — http://www.EarthLink.net

> Hi,
>   我在寻找着一种路径-查找算法(我觉得是这么叫的).我正在写着基于瓷砖的游戏,我需要一种可以找到
>   绕过障碍物(无法被穿越的瓷砖)到达目的瓷砖的算法.

因为你并没有要求特定的编程语言,因此我仅仅是给出了算法的一个框架.下面是一个对于A*算法的半编码的描述,A*算法对于你所要求的找到穿越障碍物的路径的问题是快速而且高效的.你可以用它来处理很多其他的问题.

基本上,A*算法作用于以下3个部分:Opem表(存储需要被扫描的结点),Closed表(存储并不需要被扫描的结点)以及启发函数.在这里的问题中,一个”结点”包含一片瓷砖的简单信息.每片瓷砖有它自己的结点,但是扫描地图上的所有瓷砖的可能是很小的;事实上,一切顺利的话,你仅会扫描很少的一部分.

启发函数是A*算法效率的关键.它是从任意给定瓷砖到目标瓷砖的距离的估计.你的启发函数越接近真实距离,你寻找到的路径将越优.你能使用的最好的启发函数是连接起始结点到目标结点的直线:

d=|gx-sx|+|gy-sy|

为了让代码能够运行起来,你需要一个数组来保存Open表中的结点,另一个数组来保存Closed表中的结点.为了安全起见,Closed表的数组需要与你的地图大小(x*y)一样大,而Open表的数组大约是地图大小的一半.你的结点的结构大概就像下面的样子:

structure Node(n)

.XCoord

.YCoord

.Cost

.XParent

.YParent

现在让我们更深入地讨论该算法.我不能保证这一定是A*算法的最佳版本,因为这是我特别为Visual Bacis设计的(你步可能从因特网上找到一份VB语言编写的路径-查找算法,相信我).它的确含有一个我遇到过的不足,但是你可以稍作调整来满足你的需要.代码如下:

将起始结点压入Open表

Do:

找出Open表中拥有最佳的估计值的结点(耗散值+启发值)
把该结点压入Closed表中

If 该结点就是目标结点,结束程序,返回真值
Else,对该结点可达的所有邻居结点n:

计算结点n的估计值e(耗散值+启发值)

If 结点n已经在Open表中

If 结点n先前的估计值比当前的估计值e更优,那么仍保持结点n在Open表中
Else,把结点n移至Closed表中(它当前的估计值e更槽糕,因此我们可以无视n已经在Open表的事实)

If 结点n已经在Closed表中

If 结点n先前的估计值比当前的估计值e更优,把结点n移至Open表中
Else,那么仍保持结点n在Closed表中

If 结点n既不在Open表中,也不在Closed表中,那么把结点n移至Open表中

Loop while Open表中仍然有结点

当程序结束时,递归地查找结点的父亲位置得到最终的路径.

就是这样子.如果你在理解上有什么问题,我建议你可以在一张简单地图上,跟踪你是如何遍历结点的.这可以让你更好地理解算法如何运转.(我自己就这么做了)

就像我说的,这仅仅是A*算法众多实现中的一种.A*算法有很多变形,这决定于你的要求.也许你可以好好地检查这些实现:

我曾经问过一些人(A*算法的实现),但至今我没有得到任何回复.在下面描述中,你可以很快地做出一些修改,以得到更好的结果:

If 结点n已经在Closed表中

If 结点n先前的估计值比当前的估计值e更优,把结点n移至Open表中
Else,那么仍保持结点n在Closed表中

我不清楚在程序运行时,这会起到什么作用.但是在测试之后,我发现,将一个结点从Closed表中移出是没有什么道理的
不管怎么样,如果你有什么问题的话,尽量去尝试吧.这算法在很多情况下是可以工作的.祝你好运.
分享到:
评论

相关推荐

    ClassAStart(经典A*算法C++版)

    阅读并理解这样的源代码对于学习A*算法以及提升编程技能是非常有益的。通过实际操作和分析代码,你可以更好地理解算法的工作原理,并能够在自己的项目中灵活运用。如果你对某个特定部分有疑问,可以逐行阅读并思考...

    银行家算法死锁的避免.doc

    5. **体会与疑问**:记录实验过程中的体验和遇到的问题。 实验中,你需要确保程序能正确处理各种情况,包括但不限于资源的申请、释放,以及在不安全状态下如何拒绝资源申请。通过这个实验,你将深入理解死锁的避免...

    A星优化算法的MATLAB代码

    基于MATLAB编程,A星优化算法的MATLAB代码,代码完整,包含数据,有注释,方便扩展应用 1,如有疑问,不会运行,可以私信, 2,需要创新,或者修改可以扫描二维码联系博主, 3,本科及本科以上可以下载应用或者扩展, ...

    猎人猎物优化算法MATLAB代码,猎食者优化算法代码,Hunter-Prey Optimizer(HPO)代码

    1. 该资源是MATLAB代码,猎人猎物优化算法Hunter-Prey Optimizer(HPO),也叫猎食者优化算法,该算法的灵感来自对动物的猎食,如狮子,豹和狼,以及雄鹿和瞪羚的捕食者,该算法于2022年提出。Reference: Naruei, I....

    基于多层编码遗传算法的车间调度算法

    用户可以通过研究这个项目,学习如何将复杂的优化策略如多层编码遗传算法与实际问题相结合,并且如果有任何疑问,可以直接向作者咨询。 【标签】:“多层编码 遗传算法 车间调度 智能算法 matlab” 多层编码遗传...

    精华游戏算法整理(经典)

    毫 无疑问,作者用形象的描述,简洁诙谐的语言由浅入深的讲述了这一神奇的算法,相信每个读过的人都会对此有所认识(如果没有,那就是偶的翻译太差了-- b)。 原文链接:...

    Matlab实现基于MUSIC算法的宽带信号

    - 私信作者寻求帮助,如果遇到运行问题或者对算法有疑问。 通过这个MATLAB实现,用户可以直观地看到如何在实际操作中应用MUSIC算法,从而提升对宽带信号处理和源定位的理解。这不仅有助于理论学习,也为实际工程...

    ARIMA模型算法原理

    ### ARIMA模型算法原理 #### 一、引言 ARIMA (AutoRegressive Integrated Moving Average) 模型是一种广泛应用于时间序列分析与预测的强大工具。本文将深入探讨ARIMA模型的基本概念、数学表示以及实现细节,帮助...

    5.3基本算法语句练习(苏教版必修3).doc

    在初高中数学学习中,掌握基本的算法语句是非常重要的,因为它们是编写计算机程序的基础。以下是基于给定内容的一些关键知识...对于习题答案的疑问,教师应该给出详细的解答步骤和逻辑推理,以确保学生能够理解和掌握。

    (数学试卷高一)5.1算法练习(苏教版必修3).doc

    算法是计算机科学的基础,它是...在学习这个章节时,学生可能会对算法的定义、算法与程序的区别、如何用算法描述实际问题以及如何编写简单的算法流程图产生疑问。教师需要通过实例和练习帮助学生理解和掌握这些概念。

    C++快速幂与大数取模算法示例

    例如,对于大整数12345678,我们可以将其拆分为`1*10^7 + 2*10^6 + 3*10^5 + 4*10^4 + 5*10^3 + 6*10^2 + 7*10^1 + 8*10^0`,然后对每一位取模,再将结果相加。以下是C++实现: ```cpp #define mod 10000010 int ...

    基于android北京地铁小助手有导航功能.zip

    - **导航算法**:应用可能包含了路径搜索算法,如Dijkstra算法或A*算法,用于计算最优地铁线路。 - **用户界面**:UI设计需要简洁直观,提供起点和终点输入、线路查询、站点信息显示等功能。 - **数据存储**:...

    百度推荐系统 推荐算法应用实践 面向广告主的推荐 共46页.pdf

    在实际应用中,可能会遇到广告主对推荐系统的疑问和反馈,通过Q&A环节,百度可以解答疑惑,收集反馈,持续改进推荐系统的性能和用户体验。 总结,百度的推荐系统在搜索广告和展示广告中都发挥了重要作用,通过深度...

    c语言数据结构字符串模式匹配算法.zip

    对于一般文稿中串的匹配,简单匹配算法的时间复杂度可降为O (m+n),因此在多数的实际应用场合下被应用。 KMP算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。看前面的例子。为什么T[5]==’d’的...

    IGE+XAO SEE Electrical电气软件试用版下载-2009.rar

    这表明可能存在一些混淆,因为"IGE+XAO SEE Electrical"是一款电气设计软件,而"DSP BIOS"通常与数字信号处理和嵌入式系统相关,与电气设计不太直接关联。 不过,我可以分别介绍这两个主题的知识点: 1. **IGE+XAO...

    基于动态规划法二维、三维空间最短路径规划含Matlab源码.zip

    在这个项目中,Matlab源码可能包括了生成代价矩阵、应用动态规划算法(如Dijkstra或A*算法)以及可视化结果的函数。"运行结果2.JPG"和"运行结果.JPG"很可能是规划出的最短路径的可视化图像,展示在二维和三维空间中...

    人工智能在电商领域的应用.pptx

    例如,如果用户A和用户B购买了相同的产品,那么可以向用户A推荐用户B购买过但用户A尚未购买的产品。 - **内容过滤算法:** 根据产品本身的特性(如类别、品牌、风格等)和用户的历史行为来进行推荐。 - **混合推荐...

    清华严老师数据结构习题集答案

    9. **图算法**:如深度优先搜索(DFS)和广度优先搜索(BFS)用于遍历图,Dijkstra算法和A*算法用于寻找最短路径,Floyd-Warshall算法用于所有顶点间的最短路径。 在使用"严蔚敏:数据结构题集(C语言版).pdf"这个...

Global site tag (gtag.js) - Google Analytics