在基于八卦的协议中,我们如何保证所有节点都被消息感染?
如果我们选择了一个随机数量的节点并向这些节点发送消息,并且这些节点也是如此,则某些节点可能无法接收该消息。
虽然我无法计算它,但它似乎很小。但是,如果系统运行了很长时间,那么在某个时刻,一个节点将是不幸的并且将是剩余的。
答案 0 :(得分:1)
由于两个原因,它有点难以回答:
基本上没有 基于八卦的协议。最多,有基于八卦的算法的系列。
算法实际上仅在特定假设下保证感染。例如,如果你把它作为"系统运行了很长时间"任何给定的链接在某个指数过程(一个非常可能的场景)下永久失败,然后以概率1,一个节点将完全隔离,没有协议可以克服这个。
然而,IIUC,您正在询问具有以下假设的协议:
在这些条件下,您提出的问题概率为0.
如果 i 节点被感染,您可以将感染视为系统处于 i 状态的Markov Chain。假设某些变化起源于某些s∈V,因此系统从状态 i 开始。
根据属性1.,有一个从 i 受感染节点到其中一个 n - i 的链接。
根据属性2.,选择此链接的概率至少为 1 / n 。这是因为链接碰巧穿过切口的节点最多只有 n 个邻居,但切割中至少有一个邻居。即使它的选择完全是无国籍且不知情,也就是选择这个邻居的可能性。
因此, j 步骤中 EM>。使用Union Bound,任何状态 i 的概率最多为 n(1 - 1 / n) j 。取 j = n 2 ,这就变成 n e - n ;取 j = n 3 ,这就变成 n e - n 2 。等等。
(当然,八卦算法感染发生的时间要快得多;这是最坏情况的上限。)
因此,如果系统运行的时间足够长,某个节点不会被感染的概率会降低到0(非常快)。对于Anti-Entropy Gossip Protocols,这就足够了。对于其他一些协议,正如您所怀疑的那样,某些节点可能会因某些更新而丢失。
答案 1 :(得分:0)
我们无法提供答案,因为您不了解您的问题(因此问题含糊不清)
假设给定节点连接到所有其他节点(即拓扑),并且每个节点在收到消息时执行相同的操作。
你可以将你的问题简化为更小的子问题(这就是除了et-impera方法):想象任何节点只执行一次尝试(即i = 1
)。
由于任何节点都是随机选择接收器,并且由于此操作无限次完成,因此最终所有节点都将接收消息。达到给定置信度所需的迭代次数(接收消息的节点的比率/所有节点的数量)取决于您。
一旦你得到这个,包括重复尝试i
很简单。
答案 2 :(得分:0)
我对你正在尝试做的事情进行了一些模拟。 http://jsfiddle.net/ut78sega/
function gossip(nodes, tries, startNode, reached) {
var stack = [startNode, tries];
while(stack.length > 0) {
var ttl = stack.pop();
var n = stack.pop();
reached[n] = 1;
if(ttl <= 0) { continue; }
for(var i=0; i < ttl; i++) {
stack.push(Math.floor(Math.random() * nodes), ttl - 1);
}
}
return reached;
}
在递归的每个级别,尝试次数减少一次。需要大约9次尝试才能获得65536(2 ^ 16)个节点的100%覆盖率。