用于查找人员在组中查看/评估的算法

时间:2017-10-18 00:44:56

标签: python algorithm

我正在使用Python生成“同行评估”的学生列表。

这个想法是为一个队列中的每个学生分配固定数量的同伴进行评估。

规则:

  • 每个学生都无法评估自己
  • 每个学生需要评估N个学生
  • 因此,每个学生将被评估N次

我尝试失败,然后提出了一个简单的解决方案:

from collections import defaultdict
from random import shuffle
from pprint import pprint

student_raw = '''
Adam
Bob
Jordan
Tom
Edward
Alex
David
Alistar
JoshA
Yin
Keanu
JoshB
Liam
Jesse
Mike
Aaron
Nick
Daniel
'''

num = 3 # number of assessees per assessor

student_list = [s for s in student_raw.splitlines() if s != '']

shuffle(student_list)
assessors = student_list
assignment = defaultdict(list)
print(assessors)

for i, assessor in enumerate(assessors):
    if (i+1+num) < len(assessors):
        assignment[assessor] = assessors[i+1: i+1+num]
    else:
        assignment[assessor] = assessors[i+1: len(assessors)] + assessors[0: (i+1+num)%len(assessors)]

pprint(assignment)

我想知道是否有更好的算法?

结果:

['Daniel', 'Adam', 'Nick', 'Jordan', 'Alistar', 'Bob', 'Aaron', 'Alex', 'Edward', 'Jesse', 'David', 'Keanu', 'Mike', 'Tom', 'JoshB', 'Liam', 'Yin', 'JoshA']
defaultdict(<class 'list'>,
            {'Aaron': ['Alex', 'Edward', 'Jesse'],
             'Adam': ['Nick', 'Jordan', 'Alistar'],
             'Alex': ['Edward', 'Jesse', 'David'],
             'Alistar': ['Bob', 'Aaron', 'Alex'],
             'Bob': ['Aaron', 'Alex', 'Edward'],
             'Daniel': ['Adam', 'Nick', 'Jordan'],
             'David': ['Keanu', 'Mike', 'Tom'],
             'Edward': ['Jesse', 'David', 'Keanu'],
             'Jesse': ['David', 'Keanu', 'Mike'],
             'Jordan': ['Alistar', 'Bob', 'Aaron'],
             'JoshA': ['Daniel', 'Adam', 'Nick'],
             'JoshB': ['Liam', 'Yin', 'JoshA'],
             'Keanu': ['Mike', 'Tom', 'JoshB'],
             'Liam': ['Yin', 'JoshA', 'Daniel'],
             'Mike': ['Tom', 'JoshB', 'Liam'],
             'Nick': ['Jordan', 'Alistar', 'Bob'],
             'Tom': ['JoshB', 'Liam', 'Yin'],
             'Yin': ['JoshA', 'Daniel', 'Adam']})

0 个答案:

没有答案