我正在寻找一种算法来解决以下问题:
有n
个软件组件可以通过多播进行通信。此外,还有一个包含 m
对象的池。每个 sw 组件都知道该池包含什么。
对象具有不同的值。根据我想将对象分发给 sw 组件的值。这意味着:必须优先选择具有较大值(value)的对象,必须忽略具有较低值(value)的对象(例如,当所有 sw 组件不能接受更多对象时)。
非常重要的一点是,任何对象都不会被分发超过一次。当一个对象分配给一个 sw 组件时,它不得分配给另一个 sw 组件。
此外,我想将整个事情实现为分布式算法,这意味着没有执行该分配的中央单元。
有什么想法吗?
最佳答案
- 一个解决方案是实现互斥算法(一个非常简单的算法是面包店算法),每个 sw 在轮到它时获取最高的对象。 (这就像写入文件的互斥)
- 另一个会涉及节点之间的大量通信。让我们假设 N>=M 的一般情况。假设每个 sw 采用 n/m 个组件,然后他采用最高值并将其余 x 个组件多播到 x sw,但附加值是这些组件 *cast 的最大值。然后,接收方将查看它们的值是否大于接收到的值,并将交换它并从列表中删除该值但插入它;旧值。然后它将计算出最大值的组件转换为相同的 x sw 组件。这个想法是 sw 的集合 X 将相互通信,直到每个节点都有不同的值。您将拥有一些这样的 X 套装。当然,必须改进该算法,使每个 sw 都有不同的值,并证明这会发生,这样您就可以确定。
但是您想要和想法,所以我给了您 2 个。希望对您有所帮助。 该算法的实现将在 OpenMPI 中(使用 C 或 C++)。至少我在 OpenMPI 中实现了我的分布式算法(和 Lam MPI,但现在它已经过时了)。
关于algorithm - 搜索分布式算法来分发一些对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11375879/