有啥好的算法可以在加权图中找到如下定义的“最佳”路径?
Posted
技术标签:
【中文标题】有啥好的算法可以在加权图中找到如下定义的“最佳”路径?【英文标题】:Any good algorithm to find a "best" path as defined below in a weighted graph?有什么好的算法可以在加权图中找到如下定义的“最佳”路径? 【发布时间】:2016-04-02 05:43:54 【问题描述】:目前我正在学习图论,在此期间我陷入了以下与图相关的问题。让我们从一个例子开始。这听起来像是一个纯粹的数学问题。
例如:要实现的加权图:
上面显示了一个简化图(它是从更复杂的网络中提取的)。
有 5 条简单路径,14 条具有各自权重的边,以及 11 个节点(不同路径中的蓝色节点可以相同,但在单个路径中节点完全不同)。我正在尝试找到节点 s 和节点 t (均着色为黑色)之间的最佳路径满足以下条件:
-
路径应尽可能短;
路径上每条边的权重应尽可能大。
或者我什至可以根据一些方法对所有简单路径进行排名?
更具体地说,让我们将节点视为社交网络中的用户,而将边视为每对用户之间的关联。权重与关联的可靠性成比例(10 是最可靠的,1 是最不可靠的)。
那么,有没有一种好的方法来定义和计算间接关联的权重(节点 s 和节点 t 之间的路径em> 在示例中)?正如我们所知,单条路径在 s 和 t 之间的连接(边)越多,它的可靠性趋于下降;而且,这条单一路径的每个连接的可靠性下降也会导致其可靠性的下降。这就是为什么上述条件需要更短的路径,并且在路径的每个边缘具有更大的权重。
谢谢你们的时间,伙计们!
【问题讨论】:
这不是简单的倒序关系的Dijkstra吗? @Maikel 这有点不清楚,因为我没有看到优先级之间的定义优先级,但你不能只是反转 Djikstra 的算法并突然找到最长的路径。 (Djikstra 的逻辑依赖于路径只会在您向它们添加更多边时变得“更糟”;如果探索看不见的边可以得到更好的结果,那么 Djikstra 会失败。) 啊,由于未来路径增加的权重可以使另一条路径更好,它失败了。我明白了。 请澄清 - 1)路径的长度(要最小化)是路径中的边数(蓝色节点+1)吗? 2)你的意思是沿着路径的权重总和应该最大化吗?如果是这样,一个“节点”值多少钱?例如,哪个“更好”,一条只有 2 段且总权重为 15 的路径,还是一条有 4 段且总权重为 36 的路径?也许您想最大化平均段权重?在示例中,第一条路径的平均权重为 7.5,而第二条路径的平均权重为 9,因此第二条路径会“更好”。 @amdn 1) 是的。 2)不是真的。考虑到第二个条件,权重之和应该更大,但是权重之和达到最大值的情况并不一定表示最佳路径,因为很可能无法满足第一个条件。让我换一种说法。我已经在主帖中更新了它。你可以检查一下。谢谢。 :) 【参考方案1】:由于该问题仅模糊地定义了每条可能的路径有多有利,因此该问题的答案应首先定义这样的顺序。
根据您的问题定义,更具体地说,从您关于社交网络关系的示例中,我认为我们可以推导出支持和反对路径的因素。
我们知道,在这种情况下,每条边都有利于路径的可靠性,其数量与其成本或价值成正比。直观地说,似乎有一个因素有利于路径的可靠性,它与路径上边缘的平均成本成正比。您还提到长度是影响事物的第二个因素,但这次是在另一个方向。 (即反对路径的可靠性)
考虑到这两个因素,可以推导出如下公式,用于对每条路径的可靠性进行排序。
如您所见,有一个求和表达式,其中 cei 表示每条边的成本 ei 在路径上。 n 表示路径上的边数。整个总和除以 n 基本上是我上面提到的第一个因素。 (即路径上边的平均成本)而分母中表达式 n2 中的第二个 n 是第二个因素,即路径的长度,这与边的可靠性相反。
我还介绍了 3 个常量,以便您可以根据您打算如何使用它来更新此公式。 C2 表示有利于路径长度如何有效降低整个路径的可靠性的额外因素。类似地,C1 是一个因素,表明增加平均边缘成本在使该路径更可靠方面的效果如何。最后,C3 可以是一个可选因子,它可以等于路径上的最小或最大边成本。
虽然 C1 和 C2 相对更易于理解,但这里有一个 C3 可能会派上用场的示例。假设您的路径 A 和 B 的边成本分别为 [3, 7, 8] 和 [5, 6, 7]。由于它们的路径长度和边缘成本之和相同,因此无法确定此处哪个是更有利的路径。这就是为什么在这种情况下我们需要一个诸如 C3 之类的因子,并且根据您的需要,您可以认为它等于每条路径的最小边或最大边。如果您的问题定义选择前者并为 C3 分配每条路径的最小边成本,则认为路径 B 越好,因为它的最小边成本越高。但是,如果选择后者,则路径 A 更有利。
我知道在我的答案中不定义常量可能会在某种程度上让人觉得答案不完整。我相信下面给出的任务暂时应该有效。
C1 = 1 C2 = 1 C3 = min(cei)不过,我相信这个问题的不同变体可能需要这些常数的不同值,这就是为什么我没有说明这些值适用于问题的所有变体。
【讨论】:
感谢您的发帖。我认为大多数部分都是可行的,除了每个边缘的足够大成本的问题。我想介绍方差。如果每条边都足够大,则单个路径中成本的方差应该更小。因此,在您的示例中,具有边成本 [5, 6, 7] 的路径 B 是首选。 我认为选择 C_3 作为路径上的最小边可以帮助您实现这一目标,因为当您将其平均值作为一个因素时,您已经考虑了边成本的范围。但是一个可能更好的选择可能是为每条路径使用 1/(max-min) 作为其 C_3。 我认为这是可行的。 :) 无论如何,感谢您的方法,我将在更复杂的网络中尝试这两种方法。 @Hendrik 一旦你尝试过,请确保回到这个问题并选择最适合你的答案作为你的问题的答案。【参考方案2】:该图本质上是一个可靠性框图see wikipedia。
可靠性框图 (RBD) 是一种图解方法,用于显示 组件可靠性如何影响一个成功或失败 复杂的系统。 RBD 也称为依赖图 (DD)。
根据reliawiki.org,一个专门研究可靠性理论的维基:
...对于纯串联系统,系统可靠性为 等于其组成部分的可靠性的乘积 组件。reliawiki.org
OP 在两条路径的 cmets 中给出了示例,具有相等的边数和相等的权重/可靠性之和
路径 [8, 7] 比 路径 [6, 9]
更可靠
社交网络中的路径是一条依赖链,每条边代表两个人之间的关联——权重表示该关联的可靠性。一条链仅与最薄弱的链接一样可靠,这就是为什么在示例中 Path [6, 9] 不如 Path [8, 7] 可靠,它具有较弱的链接 - 可靠性为 6 的边缘,它为路径/链的可靠性设置了上限。这就是为什么 reliawiki.org 指出的链(系列系统)公式是各个可靠性的乘积,每个因素都是一个可靠性估计,R,使得 0
串联系统中组件可靠性的影响-- 在串联配置中,可靠性最低的组件 对系统的可靠性影响最大。有一种说法 一条链条的坚固程度取决于其最薄弱的环节。这是一个很好的 串联系统中组件的影响示例。在一个链条中, 所有的环都是串联的,如果任何一个环断裂,系统 失败。此外,链条中最薄弱的一环是 先断。最薄弱的环节决定了链条的强度 就像最弱的组件/子系统决定 串联系统的可靠性。因此,一个可靠性 串联系统总是小于最小的可靠性 可靠的组件。 reliawiki.org
可靠性表示为 0(完全不可靠)到 1(完全可靠)之间的数字。
第一个近似值是说路径的可靠性是权重除以最大权重 (10) 的乘积。这允许R = 1.0
,让我们试试吧。考虑这个例子
Weights[10,10,10] 的路径 A 和 Weights[1,1] 的路径 B, 路径 A 显然更可取。
举个例子
RA = 10/10 * 10/10 * 10/10
RA = 100%
RB = 1/10 * 1/10
RB = 1%
RA > RB 因此路径 A 比路径 B 更可靠。
我说这是第一个近似值,因为如果您添加第三条路径
Weights[10,10]
的路径 C
RC = 10/10 * 10/10
RC = 100%
RA = RC 但我们知道路径 C 更可靠(边缘更少)。结论:R < 1.0
是一个要求。让我们在分母上添加一个fudge factor,使其大于最大权重,10+1 = 11,这确保了R < 1.0
。现在你有
RA = 10/11 * 10/11 * 10/11
RA = 75%
RB = 1/11 * 1/11
RB = 0.83%
RC = 10/11 * 10/11
RC = 83%
最可靠的是路径 C,为 83%。
旁注
那篇***文章指出
为了评估 RBD,在 块或组件之间统计独立的情况。在里面 如果不满足统计独立性假设, 特定的形式和解决方案工具,例如动态 RBD,具有 可以考虑。
换句话说,仅当它们之间没有相关性时,总可靠性是单个可靠性乘积的系列可靠性的简单公式才有效。
2008 年的金融危机部分是由于an incorrect assumption 个人抵押贷款的违约风险与该国其他地区的其他抵押贷款的相关性不高...这种假设是错误的,正如他们所说休息就是历史。
【讨论】:
感谢您的回答。这种方法的结果与我对这些路径的初始评级相当。如果我有任何例外,我会告诉你:)。以上是关于有啥好的算法可以在加权图中找到如下定义的“最佳”路径?的主要内容,如果未能解决你的问题,请参考以下文章