A *用于寻找最短路径并避免线路作为障碍物

时间:2011-07-22 11:57:48

标签: algorithm a-star

我必须得到2D中两点之间的(最短)/(最佳)距离。我必须避免可能连接在一起的线条形状。关于如何表示我可以旅行的节点的任何建议?我曾想过制作一个网格,但这听起来不太准确或优雅。如果一条线的任何一点在一个正方形内(节点是正方形的中心),我会认为一个节点是不可行的。

enter image description here

一个例子是从A点到B。

网格是推荐的解决方法吗?非常感谢!

3 个答案:

答案 0 :(得分:5)

我认为这实际上是Larsmans的回答更多的算法:

图表的节点是障碍物顶点。每个内部顶点实际上代表两个节点:凹面和凸面。

  1. 将起始节点推送到具有欧几里德启发距离的优先级队列。
  2. 从优先级队列中弹出顶级节点。
  3. 从节点到目标进行线路交叉测试(可能使用光线跟踪数据结构技术进行加速)。如果失败,
  4. 考虑从当前节点到每个其他顶点的光线。如果当前节点与正在考虑的顶点之间没有交叉点,并且顶点从当前节点的角度看是凸的,则将顶点添加到优先级队列,使用当前节点中的累积距离加上与当前节点的距离进行排序节点到顶点加上启发式距离。
  5. 返回2。
  6. 如果在障碍物中有“T”交汇点之类的东西,你必须做额外的预处理工作,我不会惊讶地发现它在许多情况下会中断。您可以通过仅考虑位于当前节点和目标之间的连接组件的顶点来使事情变得更快。

    因此,在您的示例中,在首次尝试 A,B 之后,您将推送 A,8 A,5 A,1 A,11 A,2 。考虑的第一个节点是 A,8 A,1 A,5 ,但它们无法离开并且他们可以到达的节点已经被推入队列,累积距离更短。 A,2 A,11 将被考虑,事情将从那里开始。

    Modified image.

答案 1 :(得分:4)

我认为您可以通过定义为:

的图表上的A *搜索来解决此问题
  • 顶点:障碍物边缘的原点,目的地和所有终点。
  • 边缘(后继函数):前面的任何一对,其中相应的线不穿过任何障碍物的边缘。一个简单的实现只会检查潜在边缘和所有障碍边缘之间的交叉点。更快的实现可能会使用某种2-d ray tracing算法。

即,没有必要将平面离散化为网格,但没有它,后继功能就很难定义。

答案 2 :(得分:2)

一个网格,通过它的A *是要走的路。我所知道的所有游戏都使用A *或者它适用于全球路线,并通过转向行为来补充本地准确性。也许您并不知道使用转向行为会解决您对准确性的所有顾虑(搜索引擎)。

编辑:我只记得一个使用流场的策略游戏。但它不是主流。

BTW:要了解转向行为对您的对象的影响,请查看有关它的许多YouTube视频。他们中的一些人在更广泛的意义上使用术语路径寻找:包括全局算法(A *)以及碰撞避免,路径平滑和转向行为中涉及的物体惯性。