图值传播算法

时间:2017-09-10 21:15:19

标签: algorithm graph-algorithm directed-graph

我有一个有向图(N, A),其中每个节点n[i]的值为v[i],阈值为t[i]。对于每个箭头(n[i], n[j]),不变v[i] <= v[j]成立。我需要有效地实施以下操作:

  • increaseThreshold(i, x):设置t[i] = max(t[i], x)。这是微不足道的,只是为了完整性。
  • increaseValue(i, x):设置v[i] = max(v[i], x)并根据需要增加其他值,以便保持上述不变量。
  • evaluate(i):如果v[i] < t[i]
  • ,则返回true

最直接的实现将存储v[i]t[i]以及每个节点的传出箭头。在increaseValue(i, x)上,它会沿着所有传出箭头传播值(使用一组&#34; open&#34;节点,就像许多其他图算法一样)。每个节点都存储v[i]evaluate(i)是微不足道的。

由于increaseValue比其他操作更频繁,这种急切的方法似乎是浪费。所以我想知道,如果根据需要重新计算v[i]的某些延迟传播可能会更有效。为此,我w[i]保留x作为increaseValue(i, x)的所有v[j]的最大值,并在evaluate(j)需要时动态计算w[i]n[i]它可以计算为n[j]v[j] >= t[j]的所有节点v[j]上的最大值increaseValue。实际上,一旦我知道evaluate, 确切的值var Hapi = require('hapi'); var server = new Hapi.Server(80); var httpsServer = new Hapi.Server(443, { tls: { // your certificates here} }); 并不重要,我可以停止计算。

不幸的是,这种懒惰的算法效率很低,所以即使server.register({ register: require('hapi-gate'), options: {https: true} // will force https on all requests }); 的频率比node更频繁,它也不会有效。

我想,有些&#34;部分懒惰&#34;算法可能会更好,但这只是我的直觉而我无法取得任何进展。

这是一个众所周知的问题吗?还有其他想法吗?

2 个答案:

答案 0 :(得分:3)

在需要评估之前,如何阻止增量的传播? increaseValue只会更新值,将节点标记为脏并将其添加到一组脏节点。

当您需要评估时,传播所有已更改节点的增量,从最大的新值开始。这应该为同一节点和路径上的潜在节点保存传播的多个增量(可能会在旅途中得到验证)?

答案 1 :(得分:0)

我对“部分懒惰”算法有一个简单的想法(没有解决方案,只是一个想法)。

让我们从告诉算法的问题中调用“最直接的实现”,因为每个节点告诉其后继者要做什么。让我们将“懒惰算法”重命名为询问算法,因为每个节点都询问其前任是否有事可做。

箭头可以划分为告诉询问。所有告知箭头在increase之后处理,而请求箭头等到evaluate。我猜,这个分区不能是任意的:对于任何两个箭头(n[i], n[j])(n[j], n[k]),我无法想象当前者询问后者如何处理而后者正在告诉时,所以这种情况必须被禁止。

当有许多节点只有传入的箭头很少得到evaluate时,这可能会有很大的帮助,这似乎就是这种情况。

它可能与其他答案中的想法相结合。