
a*算法
省粮
在源代码的世界里翱翔,领略大师创造的精彩篇章
展开
-
关于寻路算法的一些思考(3):A*算法的实现
概述剥除代码,A* 算法非常简单。算法维护两个集合:OPEN 集和 CLOSED 集。OPEN 集包含待检测节点。初始状态,OPEN集仅包含一个元素:开始位置。CLOSED集包含已检测节点。初始状态,CLOSED集为空。从图形上来看,OPEN集是已访问区域的边界,CLOSED集是已访问区域的内部。每个节点还包含一个指向父节点的指针,以确定追踪关系。算法有一个主循环,重复转载 2015-09-21 17:11:12 · 769 阅读 · 0 评论 -
关于寻路算法的一些思考(9):寻路者的移动成本
寻路者的移动成本当使用寻路算法的时候,你可能想把地图空间当做一种不单是用通畅或阻碍来表达的东西。通常地图空间会有更多的已知信息,比如通过那片区域的移动难度。比如,沼泽和高山可能比草地和沙漠更难通过。使用算法,比如A*,你可以把给信息编码代入成本函数中。下面列出了一些计算移动成本的想法,也许会派上用场。海拔高海拔(比如高山)比低海拔有更高的移动成本。当使用成本函数转载 2015-09-21 17:16:27 · 542 阅读 · 0 评论 -
关于寻路算法的一些思考(7):地图表示
在本系列文档大部分内容中,我都假设A*用于某种网格上,其中的“节点”是一个个网格的位置,“边”是从某个网格位置出发的各个方向。然而,A*可用于任意图形,不仅仅是网格,有很多种地图表示都可以使用A*算法。地图表示可能对性能和路径的质量产生很大影响。寻路算法不是线性的,而是越来越差。如果需要行进的距离翻倍了,那么会消耗超过两倍的时间来找路径。你可以想象寻路算转载 2015-09-21 17:14:52 · 4877 阅读 · 1 评论 -
关于寻路算法的一些思考(6):预先计算好的路径的所用空间
有时候,影响计算寻路路径的不是时间,而是计算路径所需的上百个单元格所占的空间。寻路是需要内存来运行寻路算法,还需要额外内存来存储寻到的路径。运行寻路算法(A*,开集或闭集)所需的临时空间经常会比存储这些寻到的路径所需的空间更大。通过在同一时间内只进行一条路径计算来限制游戏中的计算量,可以将你需要的临时空间降到最少。另外,对开集闭集的数据结构的选择也会对减少你所需转载 2015-09-21 17:13:48 · 388 阅读 · 0 评论 -
关于寻路算法的一些思考(4):A* 算法的变体
定向搜索在A*算法的循环中,OPEN集合用来保存所有用于寻找路径的被搜索节点。定向搜索是在A*算法基础上,通过对OPEN集合大小设置约束条件而得到的变体算法。当集合太大的时候,最不可能出现在最优路径上的节点将会被剔除。这样做会带来一个缺点:由于必须得保持这样的筛选,所以可选择的数据结构类型会受到限制。迭代深化(Iterative deepening)迭代深化是一种很转载 2015-09-21 17:12:00 · 1712 阅读 · 0 评论 -
A*算法入门
在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算法。 启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。估价函数:从当前节点移动到目标节点的预估费用;这个估计就是启发式的。在转载 2015-09-21 18:25:17 · 562 阅读 · 0 评论 -
关于寻路算法的一些思考(10):最短路径的用户体验
最短路径的用户体验玩家是游戏最重要的部分。你想让用玩家愉快地玩耍!你不想让他(她) 认为电脑在作弊,或是游戏单位运行不正常。愚蠢的移动如果寻路算法运行不正常,用户将最后放弃并选择手动移动单位。避免出现这种情况!在《文明》中,游戏的规则允许利用铁路无代价地移动。但是,游戏的导航只能进行其他方式的有代价移动。这样导致玩家拒绝使用游戏导航,而选择利用铁路手动移动单转载 2015-09-21 17:17:46 · 674 阅读 · 0 评论 -
关于寻路算法的一些思考(2):Heuristics 函数
关于寻路算法的一些思考(2):Heuristics 函数启发式函数在A* 中的作用启发式函数可以用来控制A*的行为。一种极端情况,如果h(n)是0,则只有g(n)起作用,此时A* 算法演变成Dijkstra算法,就能保证找到最短路径。如果h(n)总是比从n移动到目标的代价小(或相等),那么A* 保证能找到一条最短路径。h(n)越小,A* 需要扩展的点越多转载 2015-09-21 17:09:40 · 708 阅读 · 0 评论 -
关于寻路算法的一些思考(1):A*算法介绍
关于寻路算法的一些思考(1):A*算法介绍物体的移动算法似乎显得很简单,然而寻路规划问题却十分复杂。考虑下面这个例子:这个单位的初始位置在地图的下方,想要到达地图的顶部。如果物体所能侦测到的地方(粉色部分所示)并没有障碍,那么物体就会直接向上走到它的目标位置。但在距离顶端较近的位置时,物体侦测到了障碍,因而改变了方向。该物体将不得不行进一个“U”形的路径绕过转载 2015-09-21 17:08:08 · 815 阅读 · 0 评论 -
关于寻路算法的一些思考(12):AI 技术
AI技术寻路问题常常会和人工智能(AI) 联系在一起,原因是 A*算法和许多其他寻路算法是由 AI 研究者开发出来的。一些生物启发式的 AI 技术目前十分流行,我也收到一些为何不使用这类技术的咨询。神经网络是依据实例的大脑学习建模——给定一个正解的集合,它会学习出一个一般的解决问题模式。强化学习是依据经验的大脑学习建模——给定一些行为的集合和最终转载 2015-09-21 17:19:17 · 565 阅读 · 0 评论 -
关于寻路算法的一些思考(11):寻路算法的其他应用
除了查找一条可沿着移动找到一个单位的路径之外,寻路在其它方面还有很多用途。探索如果你的成本函数对已知世界的路径进行惩罚,那路径更有可能会通过处女地。这些路径能很好地侦测到其它单位。侦查如果你的成本函数对敌方瞭望塔等单位附近的路径进行惩罚,那你的单位会倾向保持隐蔽。但请注意,为了能良好运行,你需要考虑到敌方单位的移动,定期更新你的路径。道路建设从历转载 2015-09-21 17:18:24 · 519 阅读 · 0 评论 -
即时战略游戏中实用的寻路算法都有哪些,比较如何?
rts中的寻路系统一般需要满足有以下几个条件,1. 效率高,因为rts普遍地图大,单位多,所以处理效率很重要2. 易编辑,以便于level design3. 效果真实,如能找出最优(或者是看上去合理)4. 可以应对动态的游戏世界,例如起建筑如 @王亞暉 所说,一般用于寻路的算法是A Star,首先是A Star有利用到转载 2015-09-21 17:31:43 · 2584 阅读 · 1 评论 -
关于寻路算法的一些思考(8):长期和短期目标
我已经集中讲过了从一个地方到另一个地方寻找路径的任务。然而,一个与之同等重要的问题是:一旦我有一个路径,我该怎样沿着它移动?最明显的答案是从一个位置到另一个的位置的直线移动。然而,你可能想在曲线上移动,或者多次的移动。你可能想把位置偏离成为低优先级的目标。一个更高层次的问题是:你要去哪里?除非你先回答的是高层次的问题,路径规划不是很有用。当然,目标设定的一个形式就是让用户点转载 2015-09-21 17:15:47 · 786 阅读 · 0 评论 -
关于寻路算法的一些思考(5):处理移动中的障碍物
一个寻路算法会计算出一条绕过静止障碍物的路径,但如果障碍物会移动呢?当一个单位移动到达某特定点时,原来的障碍物可能不在那点了,或者在那点上出现了新的障碍物。如果路线可以绕过典型的障碍物,那么只要使用单独的避障算法来配合你的寻路算法。寻路算法会寻找到期望的路径,并且在沿着路径的同时绕过障碍物。但是如果障碍物可以移动,进而导致路径不停地发生显著改变,就应考虑使用寻路算法来避障。转载 2015-09-21 17:13:06 · 3125 阅读 · 0 评论