【问题标题】:Find the most reliable path - Dijkstra’s algorithm [closed]找到最可靠的路径 - Dijkstra 算法 [关闭]
【发布时间】:2021-03-07 13:21:27
【问题描述】:

给定一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 都有一个关联 值 r(u, v),它是 0 ≤ r(u, v) ≤ 1 范围内的实数,表示从顶点 u 到顶点 v 的通信通道的可靠性。我们将 r(u, v) 解释为这 从 u 到的通道不会失败的概率,我们假设这些概率 是独立的。给出一个有效的算法来找到两个给定之间最可靠的路径 顶点。

     a
    / \
   b<--c         a directed to c; c directed to b; b directed to a 

假设这是图 G = (V, E);顶点a是根,边之一是a到c。 a = u & c = v 所以边是 (u, v)。我想使用 Dijkstra 的算法来解决这个问题,但不知道如何。

     a
      \
   b<--c          path c: a -> c   &    b: a -> c -> b

有人能以最简单的方式解释最可靠的路径吗?

这个问题来自Introduction to Algorithms, 3rd edition, chp 24.3

提前致谢!

【问题讨论】:

  • 我投票结束这个问题,因为它不是一个实际的编程问题。

标签: algorithm data-structures graph computer-science dijkstra


【解决方案1】:

我们将 r(u, v) 解释为从 u 到 不会失败,我们假设这些概率是独立的。

由此可以推断,给定路径不会失败的概率等于构成路径的所有边 (u,v)r(u,v) 的乘积。

您想最大化该产品。

这与最短路径问题完全一样,您肯定知道算法,但您不是要最小化总和,而是要最大化乘积。

有一个很酷的工具可以从乘积到求和:它是对数。对数是一个递增函数,因此最大化一个乘积与最大化该乘积的对数相同。但是对数还有一个很酷的特性,即乘积的对数等于对数之和:

log(a * b * c * d * ...) = log(a) + log(b) + log(c) + log(d) + ...

因此,最大化可靠性的乘积 r(u,v) 与最大化对数可靠性的总和 log(r(u,v)) 相同。

由于可靠性是边的概率,它们的值介于 0(不包括)和 1(包括)之间。您可以排除 0,因为如果一条边的可靠性为 0,您可以从图中删除该边。由于0 &lt; r(u,v) &lt;= 1,因此log(r(u,v)) 为负数或0。

所以你试图最大化负值的总和。这与最小化相反值的总和完全相同。

因此:应用您的最短路径算法,使用 -log(r(u,v)) 作为边的长度。

【讨论】:

  • 这个算法的运行时间是多少? O(log V) ?
  • @Sam 你的书中没有解释吗?提示:O(log V) 是非常乐观的,因为这意味着算法没有时间查看非常少的节点。
猜你喜欢
  • 2011-02-18
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多