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

问题描述 投票:0回答:3

我代表老师从事一些功能的研究,将学生分成小组。为此,我正在寻求帮助,以确定一种有效的方法来生成满足以下条件的所有可能的团队组合:

  1. [所有学生代表一个团队,每个学生仅出现一次
  2. 团队有最大和最小大小
  3. 最大团队数

示例输入:

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.combinations] 1,但是我还没有找到适合自己的魔法情况(考虑到我的python新手并具有理论知识)。我也遇到过类似的情况头顶examples,它使我接近,但与我所追求的不完全相同:

python arrays set grouping combinatorics
3个回答
0
投票

在我看来,这是一个置换问题,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')

当您浏览列表并抓取一个团队时,将其排序以使所有玩家都处于相同的顺序,然后确保它是唯一的组合。如果它是唯一的组合,则将其存储在字典中。只是一个主意。我希望这会有所帮助。


0
投票

不是最有效的方法,但是您可以使用上面链接到Set partitions in Python的示例或另一种首选方法来生成学生团队的所有可能组合,然后在另一个列表中仅添加符合条件的团队。示例:

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)

0
投票

学生分组被证明是一个NP难题。产生所有可能的团队组合不是很可行。据我了解,您需要所有可能的团队组合来选择最好的,对吧?为此,您需要一种优化算法来优化标准。

[在最近的研究中,实施了PSO对4至6组未知数下的学生进行分类。与GA相比,PSO的功能有所提高。我认为您只需要进行具体研究即可。

[论文是:使用粒子群算法为有区别的教学应用形成学习者的自动分组

也许研究人员可以指导您完成研究门:https://www.researchgate.net/publication/338078753

您可以在这里找到论文:https://doi.org/10.1002/cae.22191

希望我有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.