我必须制作一个程序(而不是GUI),它可以将大约25名学生分成几个小组,只有3-4个成员。每次我分开小组,学生必须与不同的学生,他们最不合作。
例如,如果我有像s1,s2,s3,s4这样的学生.假设在第一节课中我们有s1,s2,s3作为一个组,在第二节,我们有s2,s3,s4作为一个组。当涉及到第三节课时,s2不能与s3一起分组,因为他们在前两节课中有那个学生。
这个项目背后的理念是让学生尽可能多地与不同的学生合作。如果我们有一个索引/字典或其他东西,让每个学生知道他们与其他学生一起工作的次数。然后分组标准应该是将他们与2-3的学生分组,他们满足的次数最少。
我不知道没有算法这是否可能。
我想知道你的建议和想法。
谢谢!
发布于 2022-08-16 09:39:07
你问题的一个特例是所谓的社交广场:我们有N组的N学生,我们希望每个学生都能和其他学生一起工作一次。在你的例子中,5个小组,每个5名学生,由于每个学生必须会见其他24个,并满足他们每次4,我们将有24/4=6,即N+1会话。
有一些已知的算法可以解决这个问题,但不幸的是,只有当N是素数时,它们才能工作。当N不是素数时,解决方案仍然存在,但是afaik您需要强制执行它。然而,由于您允许一些重复,您可能会使用标准algo的变化,以获得您需要的东西。
一种算法如下:
NxN矩阵Row1Col1,Row2Col1,.,Row5Col1;第三组是Row1Col1,Row2Col2,.,Row5Col5;注意第四组:Row1Col1,Row2Col3,Row3Col5,Row4Col2,Row5Col4;等等H 224f 225下面是一个示例实现:
def social_square(no_students):
roster = [[f'S{row}{col}' for col in range(no_students)] for row in range(no_students)]
sessions = []
#1st
sessions.append([[roster[row][col] for col in range(no_students)] for row in range(no_students)])
#following
for delta in range(no_students):
session = []
for step in range(no_students):
group = []
col = step
for row in range(no_students):
group.append(roster[row][col])
col = (col + delta) % no_students
session.append(group)
sessions.append(session)
for session in sessions:
for group in session:
print(group)
print()https://stackoverflow.com/questions/73370794
复制相似问题