微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 将所有可能的点组合分组,分为m组

我想将所有可能的点组合分组为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组.

请提供我的算法.

另请注意,当点数增加时,如果我们想要超过2组,可能的组合也会增加.

解决方法

这是一个棘手的问题!我实施了一个天真的蛮力解决方案.这可能太慢了,但这是一个起点.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐