如何在无网格的2D平面上使用A *路径查找算法?

时间:2010-10-29 18:19:14

标签: heuristics path-finding

如何在没有节点或单元格的无网格2D平面上实现A *算法?我需要物体以目标的方式围绕相对大量的静态和移动障碍物进行操纵。 我目前的实现是在对象周围创建八个点,并将它们视为可能是对象的潜在位置的虚构相邻正方形的中心。然后我计算每个的启发函数并选择最佳。起点和运动点之间的距离,以及运动点和目标之间的距离我用毕达哥拉斯定理计算正常方式。问题在于,通过这种方式,物体通常会忽略所有障碍物,甚至更常被卡在两个位置之间来回移动。 我意识到看起来多么愚蠢的问题,但任何帮助都表示赞赏。

5 个答案:

答案 0 :(得分:5)

以适合您的问题的任何分辨率创建一个虚构网格:尽可能粗粒度以获得良好的性能,但细粒度足以找到(理想的)障碍之间的间隙。您的网格也可能与障碍物的四叉树相关。

在网格上执行A *。网格甚至可以预先填充有用信息,例如接近静态障碍物。一旦沿着网格方格有一条路径,就可以将该路径后处理到一系列路点中,无论路径中存在拐点。然后沿着航点之间的线路行进。

顺便说一句,你不需要实际的距离(例如你提到毕达哥拉斯定理):A *可以用距离的估计来正常工作。曼哈顿距离是一个受欢迎的选择:|dx| + |dy|。如果您的网格游戏允许对角线移动(或网格是“假的”),那么只需max(|dx|, |dy|)即可。

答案 1 :(得分:1)

嗯。我想到的第一件事是,你需要在每个点计算渐变或向量,以找出下一步的方向。然后你移动一个小的 epsilon 并重做。

这基本上为您创建了一个网格,您可以通过选择一个小的 epsilon 来改变单元格大小。通过这样做而不是使用固定网格,你应该能够计算每一步中的小度数 - 与你的8点例子相比小于45°。

从理论上讲,你可能能够象征性地解决公式( eps对0 ),这可能导致最优解......只是一个想法。

答案 2 :(得分:1)

障碍是如何表现的?它们是多边形吗?然后,您可以将多边形顶点用作节点。如果障碍物没有表示为多边形,则可以在它们周围生成某种凸包,并使用其顶点进行导航。编辑:我刚刚意识到,你提到你必须绕过相对较多的障碍。使用障碍物顶点对于许多障碍物可能是不可行的。

我不知道移动障碍物,我相信A *找不到移动障碍物的最佳路径。

你提到你的对象向后移动,第四个 - A *不应该这样做。 A *只访问每个运动点一次。这可能是在飞行中或从移动的障碍物产生运动点的人为因素。

答案 3 :(得分:1)

我记得在大学时遇到过这个问题,但我们没有使用A *搜索。我不记得数学的具体细节,但我可以给你基本的想法。也许其他人可以更详细。

我们将在你的游戏区域创建一个对象可以跟随的潜在场。

  1. 带上你的比赛场地并倾斜或扭曲它,使起点位于最高点,目标位于最低点。

  2. 将一个潜在的井向下挖到目标,以强化它是一个目的地。

  3. 对于每一个障碍,创造一个潜在的山丘。对于你自己的非点障碍物,潜在场可以在障碍物的边缘渐近增加。
  4. 现在想象你的物体是大理石。如果你把它放在起点上,它应该在比赛场地,障碍物周围滚动,然后落入目标。

    困难的部分,我不记得的数学,是代表这些颠簸和井中的每一个的方程式。如果你想出来,将它们加在一起得到你的最终场,然后做一些向量微积分来找到渐变(就像towi所说的那样),这就是你想要在任何一步走的方向。希望这种方法足够快,你可以在每一步重新计算它,因为你的障碍物会移动。

答案 4 :(得分:1)

听起来你正在实施基于Norvig和Russel在Artifical Intelligence: A Modern Approach中讨论A *的Wumpus游戏,或类似的东西。

如果是这样,您可能需要将障碍物检测作为启发式功能的一部分(因此您需要使用传感器来提醒您的代理人注意障碍物的迹象,如here所示)。

要解决来回问题,您可能需要存储行进路径,这样您就可以判断您是否已经去过某个地点并且让heurisitic函数检查过去的N次移动(比如4)并使用那是一个打破平局(即如果我可以从这里向北和向东走,我最后的4次移动是东西,东,西,这次是北方)