algorithm - 寻找最可靠的路径——Dijkstra算法

标签 algorithm data-structures graph computer-science dijkstra

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

     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

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

此问题来自《算法导论》,第 3 版,第 24.3 章

提前致谢!

最佳答案

We interpret r(u, v) as the probability that the channel from u to will not fail, and we assume that these probabilities are independent.

由此您可以推断出给定路径不会失败的概率等于r(u,v)的乘积。所有边缘 (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 < r(u,v) <= 1 ,由此可见 log(r(u,v))为负数或 0。

因此,您正在尝试最大化负值的总和。这与最小化相反值的总和完全相同。

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

关于algorithm - 寻找最可靠的路径——Dijkstra算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64991937/

相关文章:

c++ - 带符号指标的 KNN 搜索

sql - 在表中查找重复项

C# 优先级列表

data-structures - 非重叠整数范围的数据结构?

algorithm - 矩形覆盖

php - 标记未排序数组的前 N ​​个元素

algorithm - 在特定时刻找到无限数字流中特定数字的计数

java - 如何通过删除边缘将一棵树切成两半?

java - 图形和缩放功能

algorithm - 部分所有对最短路径