Python 集合:给定一个列表(学生),我如何生成所有集合(团队)的最大值和最小值?

Python 集合:给定一个列表(学生),我如何生成所有集合(团队)的最大值和最小值?,python,arrays,set,grouping,combinatorics,Python,Arrays,Set,Grouping,Combinatorics,我代表一位教师开发了一些功能,将学生分成小组。为此,我正在寻求帮助,以确定生成所有可能的团队组合的有效方法,这些组合符合以下标准: 所有学生都代表一个团队,每个学生只出现一次 团队有最大和最小规模 团队数量最多 输入示例: students=['a','b','c','d','e','f','g','h','i','j'] max_team_size=5 min_team_size=2 max_team_count=4 某些所需输出的示例: [['a','b','c','d'],['e','f

我代表一位教师开发了一些功能,将学生分成小组。为此,我正在寻求帮助,以确定生成所有可能的团队组合的有效方法,这些组合符合以下标准:

  • 所有学生都代表一个团队,每个学生只出现一次
  • 团队有最大和最小规模
  • 团队数量最多
  • 输入示例:

    students=['a','b','c','d','e','f','g','h','i','j']
    max_team_size=5
    min_team_size=2
    max_team_count=4
    
    某些所需输出的示例:

    [['a','b','c','d'],['e','f','g'],['h','i','j']],
    [['a','b','c'],['d','e','f','g'],['h','i','j']],
    [['a','b','c'],['d','e','f'],['g','h','i','j']],
    [['a','b'],['c','d','e'],['f''g','h'],['i','j']],
    [['a','b','c','d','e'],['f''g','h','i','j']],
    ...
    
    还有一系列其他学生/教师偏好,将用于筛选 稍后的结果,但现在,需要一些帮助来生成所有可能的团队组合。 我尝试过使用
    [itertools.compositions
    ],但我还没有找到适合我的特殊需求的魔力 情境(考虑到我的python新手和集合论技能)。我也遇到过类似的情况,
    在我的头上,这让我很接近,但不是我想要的:

    在我看来,这似乎是一个排列问题,itertools可以处理

    from itertools import permutations
    
    players = ['a','b','c','d','e','f','g','h','i','j']
    allPossibleCombos = permutations(players)
    
    这将产生所有可能的球员安排。团队边界可以通过列表中的索引表示,例如,团队1从索引0到3,团队2是4-6…等等

    TEAM 1                TEAM 2           TEAM 3       
    ('b', 'h', 'a', 'g', | 'i', 'c', 'e', | 'j', 'f', 'd')
    
    ('b', 'h', 'a', 'g', | 'i', 'c', 'f', | 'd', 'e', 'j')
    
    ('b', 'h', 'a', 'g', | 'i', 'c', 'f', | 'd', 'j', 'e')
    
    当你通过列表抓取一支球队时,你对其进行排序,使所有球员的顺序相同,然后你确保它是唯一的组合。如果它是唯一的组合,则将其存储在字典中。
    只是个主意。我希望这会有所帮助。

    这不是最有效的方法,但您可以使用上面链接的示例或其他首选方法生成所有可能的学生团队组合,然后创建另一个列表,其中仅附加符合您标准的团队。例如:

    def partition(collection):
        # This function was taken from https://stackoverflow.com/questions/19368375/set-partitions-in-python/30134039#30134039
        if len(collection) == 1:
            yield [ collection ]
            return
    
        first = collection[0]
        for smaller in partition(collection[1:]):
            # insert `first` in each of the subpartition's subsets
            for n, subset in enumerate(smaller):
                yield smaller[:n] + [[ first ] + subset]  + smaller[n+1:]
            # put `first` in its own subset 
            yield [ [ first ] ] + smaller
    
    student_partitions = []
    for n, p in enumerate(partition(Students), 1):
        if len(sorted(p)) <= max_team_count:
            sublist_lengths = [len(x) for x in sorted(p)]
            if all((i <= max_team_size and i >= min_team_size) for i in sublist_lengths):
                student_partitions.append(sorted(p))
    
    for sp in student_partitions:
        print(sp)
    
    def分区(集合):
    #此函数取自https://stackoverflow.com/questions/19368375/set-partitions-in-python/30134039#30134039
    如果len(集合)==1:
    收益[集合]
    返回
    第一个=集合[0]
    对于分区中较小的(集合[1:]):
    #在每个子分区的子集中插入“first”
    对于n,枚举中的子集(较小):
    产生更小的[:n]+[[第一个]+子集]+更小的[n+1:]
    #将'first'放在它自己的子集中
    收益率[[第一]]+更小
    学生分区=[]
    对于枚举中的n,p(分区(学生),1):
    
    如果len(sorted(p))学生分组被证明是一个NP-hard问题。生成所有可能的团队组合并不十分可行。据我所知,你需要所有可能的团队组合来选择最好的,对吗? 为此,您需要一个优化算法来优化您的标准

    在最近的一项研究中,采用了粒子群优化算法,将学生分成4到6个未知数量的组。与遗传算法相比,粒子群优化算法表现出了更好的性能。我认为你所需要的只是具体的研究

    本文的研究内容是:基于粒子群优化的学习者自动分组在差异化教学中的应用

    也许研究人员可以引导您通过researchgate:

    你可以在这里找到报纸:


    我希望我能帮上忙

    团队是否始终按照原始列表的顺序排列,或者您是否也可以使用
    [a,h,i,j]
    ?变量和函数名称应遵循
    小写字母加下划线的样式。你设法解决了这个问题吗?你有什么要做的吗?如果它们可以按任何顺序排列,那么将有太多的组合来列出它们。顺序不重要,但显然我不希望重复结果调整过的变量名,如建议的Hanks!我开始朝这个方向努力,但似乎效率太低了。我希望有人有更好的办法。