具有Chebyshev距离的Dijkstra算法

时间:2017-04-19 15:24:39

标签: algorithm graph-algorithm shortest-path dijkstra a-star

我一直在使用Dijkstra算法来查找普林斯顿大学算法第2部分给出的图谱API中的最短路径,并且我已经找到了如何找到切比雪夫距离的路径。

尽管Chebyshev可以以仅1的成本移动到节点的任何一侧,但是对总成本没有影响,但是根据图表,红色圆圈,为什么路径查找线在没有移动的情况下移动锯齿形直行?

如果我使用A *算法会重复同样的事情吗?

Red Line should be the theoretically path but the line is going zigzag

2 个答案:

答案 0 :(得分:5)

如果你想优先考虑"直线"你应该考虑上一步的方向。一种可能的方法是创建图G'(V', E'),其中V'由所有邻居顶点对组成。例如,顶点v = (v_prev, v_cur)将在路径中定义一个顶点,其中v_cur是路径的最后一个顶点,v_prev是前一个顶点。然后在"更新距离"最短路径算法的步骤,您可以选择最佳(不变)方向的最佳距离。

此外,我们可以添加额外属性到等于改变方向的距离,并找到最小距离方式,方法更改次数最少。

答案 1 :(得分:2)

根据Dijkstra或A *的说法,它不应该特别直接,因为你说它对总费用没有影响。顺便说一下,我假设你想要特别防止无用的锯齿形,并且对于与前一步行方向相同的移动一般没有特别的偏好。

Dijkstra和A *没有内心的不喜欢"奇怪的路径",他们只是明确地关心成本,隐含地意味着他们也关心你如何处理同等成本。您可以采取以下措施:

  1. 当两个节点具有相同的成本时,使用打破平局使他们更喜欢直接移动(G或F,取决于您是否正在做Dijkstra或A *)。这给障碍带来了一些麻烦,因为最终导致等长路径的两个选择不一定具有相同的F分数,因此它们可能不会被打破。它永远不会给你一个次优路径。
  2. 稍微增加你的对角线成本,它不一定要很多,比如10表示直线,11表示对角线。这将避免任何不是快捷方式的对角线移动。但显然:如果这与实际成本不匹配,您现在可以找到次优路径。成本差异越大,发生的越多。在实践中它是相对罕见的,并且路径必须足够长(累积足够的成本差异,它变得值得一整个额外的移动)才会发生。