我们在大学的硕士课程中遇到了实际问题,学生必须被分配到实验室。所涉及的数字不是很大,所以我不是在寻找一个快速的解决方案,而是一个易于理解的解决方案,这样学生和小组组长都可以为拟议的配对提供理由。
给出2个列表
S1 Li,Lj,Lk
S2 Lu,Lv,Lw
.
Sn
每个学生S按优先顺序列出了他们的前3个实验室。所以学生S1最好是在实验室里。如果那个实验室不想要他,那么他就想进入Lab j等等。
和
L1 Si,Sj,Sk
L2 Su,Sv,Sw,Sx,Sy
.
Lm
每个实验室都会在实验室中列出他们想要的学生。所以在这里实验室1首先想要学生我是否选择了这个实验室(在他的前三个选择之一)。请注意,实验室可以选择尽可能多的学生。
约束是每个学生只能在一个实验室,但每个实验室可能有0或更多学生。
目标是制作一个匹配(Si,Lj),其中所有学生都被分配到实验室,配对导致最大的满意度。
满意度分数定义为
Z=sum_{i=1..n}( sum_{j=1...m} (abs( i-j))
直观地说,这会尝试将尽可能多的学生和实验室配对。
因此,我寻求一种优化算法的算法,该算法寻求最小化Z的解决方案。
可能的部分解决方案如下:
定义一个名为Assigned of length L的数组并将其初始化为所有false
首先,匹配第一个选项并丢弃这些学生
for each s in {S1,..,Sn}:
Assigned[s]=False
Assigned[s]=j
repeat until all(Assigned)==True:
for each s in S:
if RANK(Lj,s)==1:
Assigned[s]=j # i.e. pair student s with lab Lj
del(S,s) # delete s from the list S
函数RANK(Lj,s)返回Lab j中学生首选列表中的位置。如果学生不在实验室j的所需学生名单中,则返回无限。
我不确定如何从这里开始,或者这种方法是否最小化得分Z。
非常感谢任何帮助。
答案 0 :(得分:1)
在我看来,你正在尝试解决https://en.wikipedia.org/wiki/Assignment_problem的一个实例,因此可以通过例如https://en.wikipedia.org/wiki/Hungarian_algorithm。分配问题就代理和任务而言。在这里,代理可能是学生,任务是实验室中的免费插槽。如果您有比学生更多的免费插槽,那么您可以创建虚拟学生,其中将任何虚拟学生分配到任何空闲插槽的成本始终相同。
您可能希望查看https://en.wikipedia.org/wiki/Stable_marriage_problem以及它指出的医院/居民问题。这看起来似乎正试图解决您正在考虑的那类问题,但它可能并没有使用您的特定满意度分数。这些解决方案已经足够长,可以针对您不提及的潜在政治问题进行测试。是否有人鼓励人们对自己的偏好撒谎?该解决方案是否会导致两名学生同意他们想在作业后交换指定的插槽?