【问题标题】:A* manhattan distanceA* 曼哈顿距离
【发布时间】:2012-06-18 06:52:08
【问题描述】:

我搜索了 A* 的算法/伪代码,我按照它进行了编码。我使用曼哈顿距离作为 h(n)。 ( f(n) = g(n) + h(n) ) 这就是结果,

当没有墙挡路时,总是会发生这种情况,但是当我放置很多墙时,它似乎走的是最短路径。这是最短路径吗?我的意思是为什么它不像下面这个?

这个也是 A* 曼哈顿,它们的尺寸相同 (19x19)。这是来自http://qiao.github.com/PathFinding.js/visual/

【问题讨论】:

  • 嗯,同样的距离,33 个立方体……除非我数错了。
  • 因为你不能走对角线,所以你不会比第一个例子更短。您可以获得许多其他方式(例如第二种方式),它们具有相同的距离并且看起来更短,但事实并非如此。您始终必须向右传递 16 个块,向下传递 16 个块(对于您给出的示例)。
  • 啊,还有其他最短路径。
  • 我的意思是,第一个也是最短路径,但第二个看起来更短,因为路径直接通往目标。 :)
  • 这是最佳距离,因为您不使用对角线。如果您为每个单元格取 8 个邻居,则您的案例中的路径将是从头到尾的对角线。

标签: distance path-finding shortest-path a-star heuristics


【解决方案1】:

两条路径的曼哈顿距离相同。因此,选择哪条路径取决于实现。要说明为什么选择这个特定部分,我们必须查看这个特定 A* 实现的代码。

提示:从源单元到目标单元的每条路径仅使用Von Neumann neighborhood(即,不沿对角线行走)并且不向“错误”方向迈出一步(即,永远不会在您的例如)具有相同的曼哈顿距离。因此,如果您在纽约,无论您选择哪个十字路口到达曼哈顿的某个地方 :)

【讨论】:

  • 那么第一个仍然是最短路径之一?
【解决方案2】:

对于曼哈顿距离,第一个是最短路径。它只是计算所采取的水平和垂直步数。如果您想要看起来更像欧几里得距离中最短路径的东西,您可以尝试更改您的算法,以便当它可以选择在某一点水平或垂直移动时,如果水平距离大于垂直距离,它会选择水平距离一个,反之亦然。

【讨论】:

    【解决方案3】:

    您需要从起点到每个点(曼哈顿/A* 结果)投射一条视线(毕达哥拉斯/欧几里得),直到完成。如果将一条线投射到某个点被障碍物阻挡/隐藏,则使用前一个投射点并从该阻挡点开始投射另一条线,然后向前直到完成。 阻塞点是指点被线段/线的初始点的视线所隐藏。 所以它就像:

    第一行:开始------>S+N(阻塞点之前)

    Second/Middle Line/s:Blocked Point---------->S+N(在另一个阻塞点之前)再次重复(新线/段)直到它建立视线目标。

    Last Line:Blocked Point------------->进球

    连接所有线路,您将获得更短的最短路径。 您可以再次执行,但反向执行以增加另一个精度,因此视线将在目标处开始直到开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      相关资源
      最近更新 更多