如何计算网络中节点值的平均值(或总和)?

时间:2015-06-25 15:42:31

标签: graph distributed distributed-computing

考虑N个节点的网络(图形)并且每个节点都保持一个值,如何设计程序/算法(针对每个节点),允许每个节点计算所有节点值的平均值(或总和)在网络中?

假设是:

  1. 节点之间的直接通信受图形拓扑的约束,而图形拓扑不是完整的图形。如果您的算法有必要,任何其他假设都是允许的。我假设最弱的一个是图中包含所有节点的循环。
  2. N是有限的。
  3. N足够大,因此您无法存储所有值,然后计算其平均值(或总和)。出于同样的原因,你不能记得"您已收到的价值(因此您无法重新分发您已收到的值,并将您未见到的值添加到缓冲区并获得结果)。
  4. (标签可能不对,因为我不知道这类问题属于哪个领域,如果它是某种普遍问题。)

1 个答案:

答案 0 :(得分:0)

在我提出部分解决方案之前,这是一个有趣的问题,在这里我做了一些假设:

  1. 连接图表(在有向图的情况下,强连接)
  2. 节点仅与其直接邻居进行通信
  3. 可以保留并发送所有数字的总和,这意味着总和不会超过long,或者您的数据结构足够大,不会超过
  4. 我会选择深度优先搜索。节点N0将启动算法并将其值+计数发送给第一个邻居(N0.1)。 N0.1会添加自己的值+ count并将消息转发给下一个邻居(N0.1.1)。如果消息返回N0N0.1,他们只需将其转发给他们的另一个邻居。 (N0.2N0.1.2)。

    现在的问题是要知道何时终止算法。您希望在到达所有节点后立即终止它,然后只播放最终消息。如果您知道图中有多少个节点,只需继续将其转发到下一个节点,直到最终到达每个节点。最后一个节点将知道已到达(它可以将计数变量与图中的节点数进行比较)并广播该消息。

    如果您不知道有多少个节点,以及它和无向图,那么它将只是图中深度优先实现。这意味着,如果N0.1收到来自N0.1.1之外的任何人的消息,它只会将消息退回,因为您在执行深度优先搜索时无法向父级发送消息。如果它是一个有向图并且你不知道节点的数量,那么你要么想出一个数学模型来证明算法何时完成,要么你知道节点的数量。

    我在这里找到了一篇论文,提出了一个基于八卦的算法来计算动态网络中的节点数量:https://gnunet.org/sites/default/files/Gossipico.pdf这可能会有所帮助。也许你甚至可以用它来总结节点。