Python 分布式电源组

Python 分布式电源组,python,algorithm,distributed,powerset,Python,Algorithm,Distributed,Powerset,考虑到powerset操作(生成给定集合的所有可能子集)及其庞大性(时间复杂度为O(n*2^n)),我尝试横向扩展它(分布式解决方案)。我不知道这是否容易实现(因此这个问题),但我会尝试将问题分解并尽可能清楚地说明 考虑以下使用python的示例: import itertools s = [1, 2, 3, 4, 5] for l in range(1, len(s)+1): # this can be distributed for subset in itertools.

考虑到powerset操作(生成给定集合的所有可能子集)及其庞大性(时间复杂度为O(n*2^n)),我尝试横向扩展它(分布式解决方案)。我不知道这是否容易实现(因此这个问题),但我会尝试将问题分解并尽可能清楚地说明

考虑以下使用python的示例:

import itertools

s = [1, 2, 3, 4, 5]

for l in range(1, len(s)+1):   # this can be distributed

    for subset in itertools.combinations(s, l):
        print(subset)
可以(并且很容易)根据子集长度分配工作负载。例如,如果我们有一个长度为5的集合,我们可以让每个worker计算长度N的所有子集-在这种情况下,我们将有5个worker。 这对我没有吸引力的原因很明显——工作负载分布根本不平衡。一组长度为20的数据将生成长度为10的184756个子集,而长度为1的数据集仅为20个子集(这意味着中间工作者总是有更多的处理要做)

问题


在这种情况下,是否有一种线性分配工作负载的方法,以及如何分配?重新表述问题-对于一组长度L,我是否可以使用N个平衡良好的worker分配计算功率集的功?

首先,这不是解决问题的好方法。指数增长意味着所需机器的数量也将呈指数增长。在几乎所有情况下,正确的答案都是“找出不计算幂集的方法。”

这就是说,这是打破现状的最简单方法。取第一个“x”元素,计算这些元素的所有子集。这将为您提供“2^x”个工作。将这些作业相对均匀地分配到
y
机器。每台机器完成计算每个作业的子集并生成输出

作为进一步优化,在工人完成时分配作业。这样,如果一些工人跑得很慢,你会让每个人一直工作到你完成为止


(还有更平衡的方法,但它们涉及到担心您的powerset算法是什么。)

如果您使用整数的n位来表示n个项的子集中的项,您可以从0开始变量,然后将其递增到下一个子集。因此,为了在k个处理器之间平均分配工作,您只需让处理器#i从i开始它的整数变量,并在每一步上向其添加k。每个子集将由一个处理器处理


请记住,这对解决大问题没有多大帮助。如果你能在一台计算机上解决一个x大小的问题(我估计有20个好点,使用n位生成功率集非常简单,而且可以轻松地进行分割/平衡!(我会等待更多答案,如果没有更好的答案,我会接受这个答案),这就是“更平衡的方法”我建议的版本。请注意,当您在云上分发时,不同的机器将根据该机器正在执行的其他操作具有不可预测的不同性能。因此,创建比机器更多的作业并为每台机器提供尽可能多的作业可能是有意义的。不幸的是,我无法避免计算因为它是我正在解决的问题中的一个核心部分,所以我建议您将此问题分成两半。计算前半部分元素的功率集和后半部分的功率集。然后让作业通过每个c发送一个特定的前半部分功率集来创建功率集的块下半部分的组合。因为您只是组合,现在发电机组上没有逻辑。