给定一组M个未同步的副本,我们如何找到给定大小N的子集,以最小化在可靠的多播环境中同步其消息状态所需的消息重传次数(即 - 所有副本可靠地接收所有其他副本&# 39;消息)?
复制品的消息状态包括它们各自具有来自相同D源的消息(D> = M)。对于每个源,副本具有来自该源的所有消息,直到某些最高序数(即 - FIFO,没有孔,从零开始)。因此,复制品的消息状态可以表示为序数的向量,每个元素对应于一个源。或者,如果您愿意,可以将副本的消息状态视为D维空间中的一个点。
假设所有M个副本已经交换了它们的消息状态向量,因此它们都具有所有消息状态的M行×D列的矩阵。所以,鉴于矩阵,这现在纯粹是一个集中的计算问题。
给出最佳答案的强力方法是检查所有(M选择N)子集并选择需要同步该子集所需的最小重传次数的子集。问题是这种方法在M中至少具有因子渐近复杂性。
我想知道是否有人知道或者可能会想到一个具有更好渐近界限的最优算法?
最初,我正在考虑将其作为复制品的图论理论问题解决。消息状态是完全连接图中的顶点,其中边权重是两个端点之间的曼哈顿距离。消息状态向量。然后使用Prim算法,然后使用Kruskal算法进行min-link凝聚层次聚类,我们在任何聚类的大小等于或超过N时停止。
这可以在O(M ^ 2)时间内运行,但我可以构建反例,它不会立即产生最佳答案。例如,为简单起见,D = 1,让M = 7个副本'序数为{0,2,4,14,15,16,19},N = 5.Kruskal算法将聚类{14,15,16,19}和{0,2,4}然后加入这两个集群在最后一步。但我们想要的实际答案是将副本与状态{2,4,14,15,16}同步。也许我们可以在第一个合并的集群超过N然后尝试修剪它时停止?但是在这个例子中,我们又回来再次问原始问题,因为我们停止的集群实际上包含了所有M个副本!当然,当D>时,这个问题几乎不那么简单。 1,它总是(D> = M)。
上述方法的另一个问题是,如果算法选择将两个副本群集同步到一个更大的群集中,那么这不仅会影响其他群集与新合并群集之间的距离(例如 - 就像正常的凝聚层次结构一样)群集)以及所有其他群集之间的距离也是因为它们都听到并且可以从发送的任何重传中受益。因此,所有群集之间的所有距离都可以在每个合并步骤之后以非常简单的方式改变,如果您允许副本受益于此处接收的消息而不是FIFO,无孔顺序。例如,副本A具有从源D1到序号X的消息。算法选择同步两个副本群集,既不包括A,也需要从X + 5到X + 10的源D1重传消息。一个最优算法将意识到A可能从这些重传中受益,即使它们超出了他的FIFO,源D1的无孔序数,消息间隔为X + 1到X + 4.
我想到解决它的另一种方式是将其视为M复制品的几何问题。状态表示D维L1空间中的点。然后我们想找到最小的"体积"凸包含至少N个点。这实际上可能不是一个好的方法,但几何上考虑它自然地捕获了所有复制品可以从任何两组复制品同步中受益的想法。它们的大部分距离将缩小到由两个组合并创建的新对象的表面(不是顶点!)。的状态。
编辑 - 我想到的另一种方式来自我给出的例子。对于每个源DX,找到N个副本的子集,这些副本需要在该源上同步的最小重传次数。这很容易。那么问题是你必须比较和修改这些D子集以使它们全部覆盖相同的N个副本。它不是一个完全形成的想法,因为每个维度DX中的最小N是全局空间中的局部最小值,可能在错误区域中作为该维度的全局最优答案。无论如何,这是另一个想法。
EDIT2 - 回到Prim的+ Kruskal算法并忽略每个合并更新所有集群之间的相对距离,当我们发现大小等于或超过的第一个集群时,这是真的吗? N,那么最佳答案必须是该集群的某个子集?如果群集的大小等于N,那么我们就完成了。如果群集的大小超过N,那么我们可以做一些像计算群集质心并选择N个最接近质心的副本吗?这会产生最佳答案吗?这似乎仍然不正确,因为它没有考虑方向性"距离质心的各种距离。也就是说,它并没有区分D维空间中彼此接近的两个复制品(它应该支持),而不是两个复制品,它们位于"相反的#34;相对于质心彼此的方向。也许我们可以改为查看群集中副本的最小生成树,并以某种方式有效地修剪它以找到保持连接的最小权重子集?
非常感谢任何有关算法的想法或指示!
答案 0 :(得分:-1)
您可以将您的环境表示为图表。之后,您可以使用最小生成树连接环境中的所有节点,而无需重复连接。然后,通过最小生成树发送一条消息,即可到达环境中的所有节点。不需要重传消息。