我正在寻找一种有效的方法来从大小为 N 的集合 S 中生成许多 M 大小的子集。
理想情况下,我想生成所有这些,但是因为我将它们用于其他计算,所以这变得不可行。
相反,我想生成 S 的 K 个不同的子集,以便 K 个选择的子集最小化 K 个子集之间所有成对交集的大小之和。
换句话说,如果我有 K 个子集并且我取所有这些子集的成对交集。然后我将所有这些集合的大小相加。我得到尽可能低的数字。
基本上,我希望这些子集尽可能“远离”彼此。我一直在想我将如何去做这件事,但我正在画一个空白。
同时为了模拟它,我编写了这个函数
def subset_split(full_set, M, K):
np.random.seed(0) # repeatibility
seen = set([])
subset_list = []
for kx in xrange(K):
np.random.shuffle(full_set)
failsafe = 0
while True:
np.random.shuffle(full_set)
subset = tuple(full_set[0:M])
if not subset in seen:
seen.add(subset)
subset_list.append(subset)
break
failsafe += 1
if failsafe > 100:
break
return subset_list
它只生成以前从未见过的 K 个随机子集。但这并不是我想要的,因为我希望那些 K 个子集是可重复的,并且如果它们不需要的话,它们不会意外地接近每个子集。