从一张单数学生名单开始,假设总共21人:
cohort = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
我想使用Python编写一个函数,为每天使用不同配对的组项目分配配对。由于我们的学生人数为奇数,我不希望任何人单独工作,因此我们需要9组2人和1组3人。他们每天都会换搭档。例如,在第1天和第2天,各组的外观如下:
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11), (12, 13), (14, 15), (16, 17), (18, 19, 20)]
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16), (17, 18), (19, 20, 0)]
等等。对的顺序不重要,所以(0, 1) = (1, 0)
和(0, 1, 2) = (2, 1, 0) = (1, 2, 0), etc
如何用Python编写函数来打印类对的所有可能配置?我想看看每天的所有清单,知道每个人至少要花多长时间才能一起工作一次
我研究了round robin scheduling algorithms和itertools.combinations
,但还没有找到一个优雅的解决方案来解释由奇数组号创建的最终3元组。我开始编写下面的函数,以从下面的列表中获取所有可能的两人配对,但我知道这并没有朝着正确的方向发展,但我不确定如何继续为每天创建组列表(也许它们需要无序集?)
def all_pairs(cohort):
result = []
for person1 in range(len(cohort)):
for person2 in range(person1+1,len(cohort)):
result.append([cohort[person1],cohort[person2]])
return result
pairings = all_pairs(cohort)
num_pairs = len(pairings)
print(f"{num_pairs} pairings")
for pair in pairings:
print(pair)
循环算法在这方面做得相当好。对于一个奇数的参与者,你必须考虑他们中的一个每天都坐在外面。p>
输出:
每个学生与其他学生配对超过21天。每个学生都只坐过一次
如果你不是每天让一个学生坐在外面,而是组成一个3人的小组,你将每天做12对(即9对加上3对,每组3对)。即使你能神奇地避免在前17天重新配对学生,你也会在最后一天有一个奇怪的日子,你需要组成6对,把9个学生排除在外,这可能对他们不公平。每天静坐一次的方法更容易管理(也更公平)
这是一个边缘要求一个程序的实施,但我会回答无论如何。只需假设列表中的最后3人将组成3人小组,然后每天轮换学生列表:
当然,这可以进行大量优化,但这是一个直观的实现
首先,让我们讨论这个问题的理论最小值。你有N个学生,你想知道在所有可能的配对中循环需要多长时间。这是“简单”代数
有
N*(N-1) / 2
对;这是一个众所周知的公式每天都有
(N-1)/2
对,加上三元组,即3对:AB、AC、BC。这是每天总共(N-1)/2 + 3
对因此,您所需的天数为
一个快速的估计就足以说明这一点。大多数时候,一个学生和另一个人一起工作,除了“三胞胎”时期,他们和两个人一起工作。因此,他们应该花不到
N-1
天的时间与N-1
其他学生一起工作至于算法,这里是您探索的起点:对奇数个团队(其中BYE是稳定元素)使用标准RR(循环)调度,然后将空闲团队(学生)添加到相邻的配对中,以形成三元组。例如,对于7名学生,您的轮换如下所示:
现在。。。如何才能最好地将孤子元素分配给一对,从而充分利用这三重态组?应用这个公式,我们至少有
你能找到方法让它发生在上面的自行车吗
如果没有,您是否可以使用未列出的3个循环中的一个或两个使其工作?(提示:将上述第2或第3个循环替换为第6个循环)
我会让你从这里拿走的。:-)
相关问题 更多 >
编程相关推荐