找到将两个集合划分为n个大小为m的bin的所有方法,其中必须包括第一个集合(而不是第二个)中的所有项目



我遇到的这个问题的具体例子-找到所有长度s的球员的组合,这些球员可以适合n球场(每个球场都包含m球员)。

然而,还有一个额外的限制:一些的球员必须至少在一个球场上。让它们成为"Set_A"。球场上剩余的名额由"Set_B"中的球员填补。

具有所需输出的玩具示例:

Set_A = {0, 1, 2}
Set_B = {3, 4}
def func(set_a, set_b, courts, court_size):
#insert code here
return answer
>>>func(Set_A, Set_B, 2, 2)
(((0,1),(2,3)),((0,1),(2,4)),((0,2),(1,3)),((0,2),(1,4)),((0,3),(1,2)),((0,4),(1,2)))

在一个真实的例子中,可能有3个球场,每个球场可容纳4名球员。"集合A"中有10名玩家,"集合B"中有12名玩家。我想找到所有的组合,包括"集合_A"中的所有10名玩家和"集合_B"中正好2名玩家。

当球场上的空格等于"Set_A"中的玩家数量时,以下代码(我在这里找到的)足以找到所有组合,例如通过调用list(partitions(range(12), 4)):

def partitions(s, r):
"""
Generate partitions of the iterable `s` into subsets of size `r`.
>>> list(partitions(set(range(4)), 2))
[((0, 1), (2, 3)), ((0, 2), (1, 3)), ((0, 3), (1, 2))]
"""
s = set(s)
assert(len(s) % r == 0)
if len(s) == 0:
yield ()
return
first = next(iter(s))
rest = s.difference((first,))
for c in combinations(rest, r - 1):
first_subset = (first,) + c
for p in partitions(rest.difference(c), r):
yield (first_subset,) + p

然而,这对我来说是不够的。

另一个问题是速度和内存partitions(16.4)'每次运行大约需要14秒,而partitions(20.4)'返回MemoryError。组合爆炸很可能意味着对于我想要处理的一些值来说,它是难以处理的。(然而,我认为大多数时候这是合理的,尤其是如果这些计算被缓存以供以后查找)。

您错误地看待了您的问题,并试图提前进行优化以启动。

你不会试图在12个老虎机中看到20个玩家的所有组合。组合不在乎顺序,所以你有两套。A组刚好占据了空位,所以你真的只想在剩下的2个空位上看到12个B组球员的组合。

如果你想看看这些球员在三个球场上的表现方式,那就在你弄清楚谁可能会上场之后再做。它仍然不是组合,因为组合不按顺序。我也不确定排列是否适用,因为这两个集合很复杂。

弄清楚你关心的每个球场的细节级别——如果只是每个球场有哪四名球员,那么三场比赛中的20名球员会给你45个组合(A组+B组中的2组),让你进入第一场,然后是22275组没有进入第一场的球员,看看谁进入第二场,谁进入第三场。这基本上给了你150万种不同的可能性,让你知道谁在每个法庭上。但如果你关心谁将对阵谁,或者谁在球场上的每个空间,那么。。。我所能做的就是祝你好运,晚安。

相关内容

最新更新