我想将 m 中所有可能的点组合分组到 r 组中。
积分= [A,B,C,D ........]总 n 积分
一次 m 这些点的组合将是一个列表 l
l = list(itertools.combinations(points,m))
如何进一步将其分组为r组,使得每组的第i 元素没有相似的点。
例如,
点= [A,B,C,D] m = 2且r = 2
l = [[A,B],[A,C],[A,D],[B,C],[B,D],[C,D]]
所以小组将是
第1组= [[A,B],[A,C],[A,D]]并对应第2组= [[C,d],[B,d],[B,C]]
注意:组1和组2的第i 索引中的点没有类似的点。
我想这样做 n 一次 m 的点数并将其分组为r组。
请提供算法。
另请注意,当点数增加时,如果我们想要超过2组,可能的组合也会增加。
答案 0 :(得分:1)
这是一个棘手的问题!我实施了一个天真的蛮力解决方案。这可能太慢了,但这是一个起点。
from itertools import combinations, permutations
points = 'ABCDEF'
r = 3
m = len(points) // r
all_combinations = list(combinations(points, m))
group_length = len(all_combinations) // r
assert r * group_length == len(all_combinations)
found = set()
for combinations_permutation in permutations(all_combinations):
groups = [combinations_permutation[group_length * i: group_length * (i + 1)]
for i in range(r)]
transpose = zip(*groups)
# Avoid very similar-looking solutions
canonical = frozenset(map(frozenset, transpose))
if (canonical not in found and
all(len(col) == len(set(col))
for col in (sum(column, ()) for column in transpose))):
found.add(canonical)
for group in groups:
print ', '.join(map(''.join, group))
print '----'
这是输出的开始:
AB, AC, AD, AE, AF
CD, BE, BF, BD, BC
EF, DF, CE, CF, DE
----
AB, AC, AD, AE, AF
CD, BF, BE, BC, BD
EF, DE, CF, DF, CE
----
AB, AC, AD, AE, AF
CE, BD, BE, BF, BC
DF, EF, CF, CD, DE
----
AB, AC, AD, AE, AF
CE, BF, BC, BD, BE
DF, DE, EF, CF, CD