我正在寻找一种算法,将 n个学生分配到 m个课程,每个学生定义三个优先级,每个课程都有 min 和最大计数以及介于最小值和最大值之间的最佳计数。
到目前为止我所拥有的是:
1)随机课程;洗牌学生
2)循环学生并暂时将他们分配到他们的第一选择中 如果他们的第一选择已满,比如10名学生,我们需要确定11名学生中的哪一名学生要放弃。 由于我们没有学生优先考虑的课程,以找到最弱的学生,我们希望找到一个优先2开放的学生
这可以重做优先级2和3,但最终它并不总能得到最好的结果..
答案 0 :(得分:0)
最接近的类似问题可能是stable marriage problem和hospital/resident matching problem。
您可能正在寻找一个最佳解决方案,这意味着,在给定分配的情况下,学生和课程都不会选择其他任务(student => course)。
答案 1 :(得分:0)
此问题与generalized assignment problem NP-hard优化问题非常相似。
答案 2 :(得分:0)
如果创建变量Xij,其中Xij = 1,如果学生i被分配到课程j,那么你可以将约束写为线性等式和不等式:0< = Xij< = 1,SUM_j Xij = 1 for all i - 每个学生只分配一门课程,min< = SUM_i Xij< = max - 每门课程都有最小和最大学生人数。学生幸福的总和是SUM_ij Xij Pij,其中Pij可能是3,2,1或0,这取决于课程j是学生我的1,2,3还是其他选择。
然后使用线性编程来最大化学生的快乐。如果您遵循https://en.wikipedia.org/wiki/Integer_programming#Using_total_unimodularity和https://en.wikipedia.org/wiki/Unimodular_matrix#Common_totally_unimodular_matrices,我认为您可以假设生成的解决方案将包含Xij的整数值,因此必须为0或1。
为了尝试找到每个球场接近其最佳尺寸的解决方案,我建议你也尝试找到减少每个球场的最大值和增加最小值的解决方案,使它们更接近最佳尺寸。例如,您可以在津贴上进行二元斩断,以找到有解决方案的最小值,并且为每门课程选择的最小和最大值都不会超过该课程的最佳大小。