我想将所有可能的点组合分组为r组.
Points = [A,B,C,D……..] Total n points
一次取m的这些点的组合将是列表l
l = list(itertools.combinations(points,m))
如何进一步将其分组为r组,使得每组的第i个元素没有相似的点.
例如,
Points = [A,D] m = 2 and r = 2
l = [[A,B],[A,C],D],[B,[C,D]]
所以小组会
Group 1 = [[A,D]] and corresponding to it Group 2 =
[[C,C]]
注意:组1和组2的第i个索引中的点没有相似的点.
我希望一次获取m个点并将其分组为r组.
请提供我的算法.
解决方法
这是一个棘手的问题!我实施了一个天真的蛮力解决方案.这可能太慢了,但这是一个起点.
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,BC,BD EF,DE,CE ---- AB,AF CE,BC DF,EF,CD,BE DF,CD