A* 算法之误区

原创 2007年09月23日 14:17:00
 

HTML Tags and JavaScript tutorial



A* 算法之误区



nbsp;
下一篇: A* 算法之误区

function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}


 A* 算法之误区


本文作者云风,自认为讲的还是比较可以的.
估计是因为我在上大学时在网上留过一篇文章,里面有一个简单的使用 A* 算法寻路的源程序,导致了这近七年来,不段的收到 email 和我讨论这个算法。
对,毫不夸张。那个简陋的代码。在七年前我随手写出来扔在网上后,已经遍布中文网络世界的犄角旮旯,让我在痛恨那段代码的时候,想收回都不可能。
我最大的困惑在于,为什么课堂上最为基础的算法知识,却有如此多的人行入误区。难道写游戏的程序员都不去读读基本的课本?
A* ,读作 A-Star 。它仅仅是一个启发式搜索算法。就是说在一个可以被穷举的有限解空间集中,用比较有效的方法(主要是利用估价函数)求出最优解的算法。A* 跟寻路算法没有太多关系,我们只是借助了这个方法来解决寻路这个问题,正如四则运算对于无数的数学题一样,它只是一个基本工具。寻路算法本身有很多种,我们找到算法后,借助 A* 这个工具实现这个算法而已。
我的那篇文章中提到的,也是传统意义上的地图寻路,其实依据的是这样一种算法:把地图分成若干个格子,把起始点的格子上标作 0 。然后根据将周围一圈可以通畅的格子上标为1。然后再把所有标上 1 的格子周围可以通达的格子标为 2 ,当然,如果那些格子上已经有过数字了(一定比 2 小)就不用标了。
如此反复跌代下去,我们地图上的终点只要可以通达,就一定会被标上数字。而这个数字就是理论最短的距离,而标记过的每个格子都有一个前导的入口(即它由附近一个比它小 1 的格子引导过来)整个标记的过程逆推,也就找到了最短路径。
这种一步步尝试的过程,就是一种搜索过程。如果加上启发函数,不让它盲目的寻找,就衍生出很多启发式搜索算法。A* 是其中的一种。之所以加一个 * 号,是因为它的启发式函数是有限制的,这个限制确保它能找到绝对最优解,去掉这个限制,就是 A 算法了。
我们可以看到,把地图分格子,给格子间的路径一个权值(前面的例子中,格子间的距离都是相等的,我们也可以根据地形划分成不等的距离,即权值,或者定义单向道路,这都是可以的),这是解决寻路问题的关键,但都不是 A* 算法的范畴。
如果你想出某种算法,比如把地图划分成不规则的区域,或者把地图矢量化。依然可以再此基础上用 A* 算法这个工具来从中求到最优解。如果想别的方法来寻路,比如拟人的判断,预设路点等等,甚至按走迷宫的方法一样,分叉右转,碰壁回头,那些可以算是对分格寻路方法的一些改进,却都不关 A* 什么事情。
A* 算法理论上是时间最优的,不过我们可以通过选择一个更好的估价函数,或是减少了解空间来提高性能。 A* 算法也有最大的缺点就是,空间需求太大。我们可以用一些时间换空间的方法改进。但是如果不存在解(比如在寻路问题中,根本不存在一条通达的路),采用 A* 算法求解,势必会穷举所有的可能。所以一般在游戏里,我们一般会采用额外的手法避免这个问题。
ps. 如果用 waypoint 的方法来解决寻路问题,实际上将地图化成了一个图,经典的最段路径算法是 dijkstra 算法。若是把地图的阻挡物用凸多边形描述,有一道 10 年前的 ACM 赛题可以参考:Cutting Corners。
 


做人工智能,先理解好这七大误区!

近几年,大数据、人工智能、AI等词已被媒体大肆宣传,让很多人赶鸭子上架也往这几个方面蹭一蹭,纷纷投入研发,但效果甚微,不禁让人产生疑问。人工智能真的如同媒体宣传那般神奇吗?今天大圣众包小编就为大家分享...
  • dashenghuahua
  • dashenghuahua
  • 2017年01月05日 11:58
  • 597

几个常见思维误区

有很多人大学毕业后,还是保持学习,这其实挺好的。但进入社会开始工作后,现在的学习跟大学时候的学习肯定是有区别的。最大的区别是,这个时候你所学的要用起来创造价值。 思维方式出问题 考场逻辑:我没有准...
  • luopeng123456789
  • luopeng123456789
  • 2015年10月14日 15:58
  • 504

项目管理十大误区

 随着计算机硬件水平的不断提高,计算机软件的规模和复杂度也随之增加。计算机软件开发从“个人英雄”时代向团队时代迈进,计算机软件项目的管理也从“作坊式”管理向“软件工厂式”管理迈进。这就要求软件开发人员...
  • a313586
  • a313586
  • 2008年04月17日 19:06
  • 277

A*,Dijkstra,BFS算法性能比较及A*算法的应用

一之续、A*,Dijkstra,双向BFS算法性能比较及A*算法的应用 作者:July   二零一一年三月十日。 出处:http://blog.csdn.net/v_JULY_v ---...
  • qq_34446253
  • qq_34446253
  • 2016年05月16日 19:21
  • 2199

应该注意的搜索引擎营销的误区

内容提要:应该注意的搜索引擎营销的误区,搜索引擎营销行业在一定程度上弥漫着一些谎言或者误导。   搜索引擎营销行业在一定程度上弥漫着一些谎言或者误导。这些误导大多是由一些所谓的“搜索引擎优化专家...
  • axl19530209
  • axl19530209
  • 2015年01月21日 09:16
  • 194

软件测试的几大误区

我们暂且不去评析软件测试在当今it公司中的地位,只说大家对软件测试的认识。基于我短暂的经验,我总结出软件测试几个最常见的误区,供大家研究:   一大误区:测试简单,对技术要求不高   这是对测试最...
  • xqtesting
  • xqtesting
  • 2014年07月25日 12:37
  • 670

谈谈敏捷开发的误区

今天有人做演讲有关敏捷开发的。就演讲而言,讲得非常好,吐字清晰,语速适当,穿插例子,娓娓道来,将意思表达得非常清楚到位,是个很好的演讲。但就内容而言,我却有很大的异议,当中部分观点我认为是对敏捷开发的...
  • flowingflying
  • flowingflying
  • 2013年01月23日 23:12
  • 2640

A/B测试五大注意事项

随着Growth Hacking在中国的传播和兴起,作为增长黑客必杀技之一的A/B测试,也被越来越多的国内企业所接受和重视。然而,A/B测试看似简单,实则隐藏着许多沟沟坎坎,稍不注意就会导致试验结果偏...
  • byfworking
  • byfworking
  • 2016年07月14日 21:45
  • 3158

REST和RESTful浅谈

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。 网...
  • fly_zhyu
  • fly_zhyu
  • 2017年07月30日 21:30
  • 255

大数据的误区

本文仅从另一个视角看待大数据,有多少用户有真正的大数据,数据真的很值钱吗,小数据都没有用好如何用好大数据呢?...
  • zhulinu
  • zhulinu
  • 2016年03月28日 14:32
  • 1392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:A* 算法之误区
举报原因:
原因补充:

(最多只允许输入30个字)