保留直接连接的最短路径算法?

时间:2013-12-11 20:55:16

标签: algorithm scipy dijkstra

我想估计图中没有直接连接的顶点之间的距离。

是否存在类似Dijkstra的算法,但保留现有的直接连接除外?

假设以下示例:

   (A)
 1/   \
(B)    |
1|     |5
(C)    |
 1\   /
   (D)

Dijkstra算法将节点(A)和(D)之间的距离设置为3,而我希望现有的直接连接得到尊重,距离为5.我试图使用未加权的距离在scipy的实施中没有任何运气。问题是,在距离较短和跳跃较多的路径上选择跳跃较少但总距离较长的路径:

   (A)
 1/   \5
(B)    |
1|    (E)
(C)    |
 1\   /5
   (D) 

在这种情况下,我想要(A) - > (B) - > (C) - > (D)使用,但未加权的Dijkstra更喜欢(A) - > (E) - > (d)。

2 个答案:

答案 0 :(得分:3)

你可以用Dijkstra做到这一点。您只需要修改成本函数。您可以定义自己的组合,而不是单个距离或跳跃度量。

到目前为止,当您选择节点作为最佳路径候选时,您可以存储到达它的跃点数。这很简单,因为您知道从您到达的节点上存储了多少跳。

成本函数由您决定。您可能希望每个跃点都会产生2的惩罚。因此,您可以说从节点Q到达节点P的成本是:

Cost(P,Q) = (Hops(P)+1) * 2 + Dist(P,Q)

Tim在评论中指出,这实际上相当于在所有路径权重上加2,而不需要任何额外的编码。

答案 1 :(得分:0)

我是否正确理解您正在尝试做的是估计尚未直接连接的地点之间的距离。对于已连接的地方,请使用给定的距离?

如果是这样,您可以使用未经修改的Dijkstra来实现此目的。 Dijkstra选择源节点s和矩阵D作为输入,其中D [i,j]是从i到j的距离,作为输出,它给出数组Ps,其中Ps [i]是最短路径的长度从节点s到节点i。从Ps和D,有一种方法可以获得实际的最短路径。

现在,您要做的是填写D的条目并估算距离。 D [i,j]的合理估计是从i到j的最短路径的长度(通过现有边缘)。

所以我建议的是以下算法:

foreach node i:
  if D[i,j] is filled in for all j, move on to the next i
  run Dijkstra from i, resulting in the array Pi.
  for every j s.t. D[i,j] is not yet filled, set D[i,j] := Pi[j]
你去吧!对于你的第一个例子,这将设置d [A,D] = 5(如你所料), 对于第二个例子,它将正确设置d [A,D] = 3。