A*寻路极限优化概述

github源码:https://github.com/boycy815/fastAStar

这几天在天地会上看到有算法比赛,比的是谁实现的A*寻路速度快,虽然比赛不是那么正规,但是这种展现实力的机会咱也不能落后是不,于是咱也折腾出一个算法提交上去,帖子在此:http://bbs.9ria.com/forum.php?mod=redirect&goto=findpost&ptid=172851&pid=1668442&fromuid=64655

128*128地图规模下1000个随机障碍,在我的电脑上一般不会超过1毫秒,只有一些奇葩的情况下会是1毫秒,没出现过2毫秒的情况。然后我尝试过5000个随机障碍,一般不超过2毫秒,偶尔2毫秒,不存在路径的情况下一般不超过8毫秒。

另外,虽然产生的路径看起来是8方向的,实际计算的时候是使用4方向展开,再通过简单的方式合并四个斜方向和同方向路径,让路径尽量看起来自然。

合并斜方向 合并同方向

鉴于参赛程序写得过于装逼,部分同学反映看着累,所以也就有了本文。本文不打算讲得太细致,默认读者已经掌握基本的数据结构并了解了A*搜索的大概流程。不了解A*搜索的请移步:http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html

启发式搜索

A*搜索是一种启发式搜索(可移步:http://baike.baidu.com/view/1237243.htm)。我们通常做寻路的时候,是把起点作为一个树结构的根节点进行遍历,直到找到终点。对于树的遍历,通常的我们有深度优先遍历和广度优先遍历,这个是数据结构的基础。但是通过这些方法做寻路往往显得盲目,有时候眼看终点就在眼前,我们仍然需要先对其他节点展开遍历。然而启发式搜索虽然对树做的也是遍历,可它对节点展开的顺序既不是深度优先也不是广度优先,而是“估计值优先”。这个估计值是树中每个节点绑定的一个值,这个值通过启发式结合节点的一些属性计算出来。好的启发式能产生对搜索目标有导向性的估计值,估计值更优的节点在概率上应更接近搜索目标。通过启发式我们能优化树的节点展开顺序从而更早找到目标节点,减少无谓的节点展开数量,提高效率。

A*的启发式

A*搜索采用f(n) = g(n) + h(n)作为启发式,其中g(n)为起点通过某个路径到达地图格子n的确定耗损,h(n)为地图格子n到达终点的估计耗损。我们通常采用的h(n)有曼哈顿式,欧几里得式等。曼哈顿式为h(n) = dx + dy,其中dx和dy为n点到终点的水平和竖直距离。欧几里得式为h(n) = sqrt(dx^2 + dy^2),代表n点到终点的欧几里得距离。这两个启发式的特点会在下文中讲到。

最佳路径定理

当任何格子n,其h(n)不大于格子其到终点的最小实际耗损时,A*搜索必然会得到最佳路径。我们可以这么理解:当一个格子a为最佳路径上的节点,其当前耗损为i,其到终点的实际耗损为j(假设已经知道),那么最佳路径的耗损为i+j,那么当h(a)不大于j时,f(a)将不大于i+j,在路径搜寻过程中,可能存在很多通往终点的路径,只要其路径长度不是最佳,那么当到达终点(估计耗损等于实际耗损),其耗损必将大于最佳路径的耗损,根据“估计值”小先展开的顺序,f(a)由于不大于最佳路径耗损,所以必定会被先展开,同理所有最佳路径上的格子都会在得到最佳路径之前被展开,所以此定理就成立了。

高效启发式原则

h(n)值的大小将影响A*搜索的效率,更大的值将更有效得减少无谓的分支展开,更快得找到终点。其原因是增加启发式中估计值的权重,可让启发式对消耗的路程不敏感而对终点的方向更加敏感。在不得已时不会去展开大方向不对的格子。但是如果h(n)大于b格子到终点的最小路径损耗,那么寻找出来的路径就不一定是最短。所以结合最佳路径定理,从搜索效率和质量上看,h(n)等于n格子到终点的最小实际损耗是最好的。

启发式选择

从上面的规律来看,曼哈顿式似乎优于欧几里得式。曼哈顿式在没有障碍的时候满足h(n)等于n格子到终点的最小实际损耗。而欧几里得式似乎得到的值小了一点。但是通常人们更愿意使用欧几里得式,因为欧几里得式会优先选择n格子到终点连线上的展开节点。而曼哈顿式对n格子到终点范围内的点都一视同仁。

如图曼哈顿式在n点和终点围城的矩形启发式值都相同,由于程序的循环顺序是固定的,所以会产生这样的路径,虽然正确但不符合人的习惯。

而欧几里得式会在如图的对角线上有更低的启发式值,所以程序会优先选择对角线位置的路径,如果将得到的路径合并斜方向会得到非常符合人习惯的路径。虽然曼哈顿式在效果上逊色于欧几里得式,但是由于曼哈顿式计算简单,拥有不少良好的性质非常适合优化,并且其效果不好的问题可以在前期预处理地图的时候解决,故程序中使用曼哈顿式。

时间: 2024-11-08 23:24:53

A*寻路极限优化概述的相关文章

PgSQL · 性能优化 · PostgreSQL TPC-C极限优化玩法

简介 本文以工业界测试模型TPC-C为测试模型,介绍PostgreSQL数据库从系统层面的优化到数据库层面的优化方法. TPmC从 256195.32 提升到 606466.31 是如何做到的. 测试环境介绍 16核开HT共32线程 256G 1600MHz 内存 万兆网卡 3 块 6.4TB AliFlash PCI-E SSD 逻辑卷条带 XFS 数据块对齐 XFS文件系统优化 主要分3块: 逻辑卷优化部分 XFS mkfs 优化部分 XFS mount 优化部分 以上几个部分都可以通过ma

Visual C++优化概述

摘要:演示了Visual C++ 2003 编译器提供的众多代码优化功能中的几项功能. Microsoft Visual C++ Toolkit 2003 包含优化 C++ 编译器.大多数开关相当简明,并且已经在 Visual C++ 产品的多个版本中存在,但仍然有两个开关比较新,并且无须重写代码就能够显著提高速度.它们是 /GL (Whole Program Optimization) 和 /G7(它能产生为 Pentium 4 或 AMD Athlon 优化的代码).还有一个选项 /arch

WEB应用程序的测试与优化概述

"让你的WEB应用程序完成你想做的事情是一回事,而让他们快速.有效的去做常常是另外一回事." 在这篇文章里我将初步讨论有关"WEB应用程序的性能"的问题,主要是一些基本概念以及工具,算是抛砖引玉吧!注意这些内容同样适用于J2EE应用.此后,也许我会写更多关于此方面的文章. 首先,这里有两个性能方面的重要指标.请注意,下面的"定义"并不规范,仅供参考. * Response Time - 响应时间 从初始化请求到完成响应所用的时间.这是一个测试WE

【性能优化】ORACLE数据库性能优化概述

   为了保证ORACLE数据库运行在最佳的性能状态下,在信息系统开发之前就应该考虑数据库的优化策略.优化策略一般包括服务器操作系统参数调整.ORACLE数据库参数调整.网络性能调整.应用程序SQL语句分析及设计等几个方面,其中应用程序的分析与设计是在信 分析评价ORACLE数据库性能主要有数据库吞吐量.数据库用户响应时间两项指标.数据库吞吐量是指单位时间内数据库完成的SQL语句数目:数据库用户响应时间是指用户从提交SQL语句开始到获得结果的那一段时间.数据库用户响应时间又可以分为系统服务时间和

MySQL数据库优化概述

一,数据库优化的目的  1,避免出现页面访问错误     由于数据库的timeout产生的5**错误:     由于慢查询造成的也没无法加载:     由于阻塞造成数据无法提交: 2,增加数据库的稳定性     很多数据库的问题都是由于低效的查询引起的: 3,优化用户体验     流畅页面的访问速度:     良好的网址功能体验: 二,数据库优化的角度 SQL及索引:避免慢查询,阻塞操作: 数据库表结构:满足三范式,冗余设计:分库分表: 系统配置:linux打开文件数目: 硬件:磁盘选择,如SS

百度网盟推广优化概述

合理的投放设置为优化的基础,成功的营销效果来自于持续的优化.网盟推广将推广信息展现在丰富的内容网络上,即通过大量的宣传提升http://www.aliyun.com/zixun/aggregation/12972.html">品牌价值,又吸引目标消费者进行点击访问以及产生购买等行为.我们需要优化我们的推广行为,提升推广的投资回报率.根据成功客户经验,在新帐户/新产品推广的建立阶段,要通过资金投入进行测试来为以后高回报打好基础.测试资金的投入,需要进行推广优化来保证后期的高回报阶段. 在网盟

MySQL手册版本 5.0.20-MySQL优化(一)

mysql|优化 7 MySQL 优化 数据库优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解才行.尽管对系统或应用系统的了解不多的情况下优化效果还不错,但是如果想优化的效果更好,那么就需要对它了解更多才行. 本章主要讲解了几种优化MySQL的方法,并且给出了例子.记着,总有各种办法能让系统运行的更快,当然了,这需要更多的努力. 7.1 优化概述 让系统运行得快得最重要因素是数据库基本的设计.并且还必须清楚您的系统要用来做什么,以及存在的瓶颈. 最常见的系统瓶颈有以下几种: 磁盘搜索.

7年老鸟分享完整门户网站SEO优化细节

前言: 最近公司网站改版,都是测试网站,闲来无事将这二年淘课网的优化的过程翻了这来看了几遍,觉得受益匪浅,这个优化执行方案是我们老大写的,他带团队做网站推广将近7年了非常厉害,原来他做的很多网站在自己的行业内都是数一数二了,希望能够对想我一样的新手有所帮助,我也做SEO优化一年多了,觉得SEO最重要的就是注重细节,掌握一套自己所熟悉实用的操作手法,并将这些方法运用到极致,也不用每天都去花大量的时间去看什么秘籍.方法,反而浪费了自己最宝贵的时间,定期看看A5和其他一些SEO论坛的一些咨询就可以了,

Visual C++ 2005中的命名返回值优化

多年来,Microsoft Visual C++编译器一直在努力寻求更新的技术与优化方式,以求最大可能地提高程序的性能.此文描述了Visual C++编译器在不同情况下,是怎样消除多余的复制构造函数和析构函数的. 通常来说,当方法返回对象的一个实例时,会创建一个临时对象,并通过复制构造函数复制到目标对象中.在C++标准中,允许省略复制构造函数(哪怕会导致不同的程序行为),但这有一个副作用,就是编译器可能会把两个对象当成一个.Visual C++ 8.0(Visual C++ 2005)充分利用了