假设我随机列出了 160 名学生的名单,他们必须选择一门课程(从课程 1-7 中),每门课程的最大学生人数有不同的限制,例如
课程 1:最多 30 名学生
课程 2:最多 23 名学生
课程 3:最多 29 名学生
课程 4:最多 24 名学生,
课程 5:最多 25 名学生
课程 6:最多 23 名学生
课程 7:最多 22 名学生
每个学生列出他们的两个“第一”选择和两个“备用”选择。
两个首选的权重相同,两个备用选择的权重相同。
目的是在不超过每门课程的最大学生人数的情况下,将学生分配到他们的两个首选之一。否则,学生将被分配到他们保留的选择之一。
在图像(还包括文件)中,我正在寻找黄色单元格中的结果。学生的选择在 B-H 列中(1 代表两个“第一”选择之一,R 代表两个“保留”选择之一)。我需要在 J 列中获取分配的课程(我添加了一些作为示例),并在 K 列中获取选择(1 或 R)。考虑到 O 列中的限制,我还需要获取每门课程的学生人数(N 列)。
你们是否做过类似的事情并且对使用什么公式有任何想法?
我尝试以类似于下面的方式使用 IF、COUNTIF、XLOOKUP 函数(列号不同,“第一选择”标记为 1 和 2)。这确实给了学生前两个选择之一,但我无法控制每门课程的学生人数,而且这个公式实际上并没有考虑保留选择。
=IF(COUNTIF($U$1:$U1,XLOOKUP(1,$M2:$S2,$M$1:$S$1))<24,XLOOKUP(1,$M2:$S2,$M$1:$S$1),XLOOKUP(2,$M2:$S2,$M$1:$S$1))
这是一个尝试 - 很快就会添加对步骤的解释:
=LET(
avaliable, TRANSPOSE(Y2:Y8),
student_choices, B2:H161,
classes, SEQUENCE(, 7),
reduce_count, LAMBDA(i, arr, arr + -1 * (i = classes)),
assign_class, LAMBDA(acc, r,
LET(
avaliable, DROP(TAKE(acc, -1), , 2),
assign, LAMBDA(chosen_pair,
LET(
i, INDEX(chosen_pair, 1, 1),
j, INDEX(chosen_pair, 1, 2),
c_1, INDEX(avaliable, 1, i),
c_2, INDEX(avaliable, 1, j),
IFS(AND(c_1, c_2), IF(c_1 > c_2, i, j), c_1, i, c_2, j, TRUE, 0)
)
),
choices, INDEX(student_choices, r, ),
first, assign(FILTER(classes, choices = 1)),
second, assign(FILTER(classes, choices = "R")),
course_choice, IFS(first, HSTACK(first, 1), second, HSTACK(second, "R"), TRUE, {"-", "-"}),
updated_count, IFS(
first,
reduce_count(first, avaliable),
second,
reduce_count(second, avaliable),
TRUE,
avaliable
),
VSTACK(acc, HSTACK(course_choice, updated_count))
)
),
assigned, REDUCE(HSTACK(0, 0, avaliable), SEQUENCE(ROWS(student_choices)), assign_class),
VSTACK(HSTACK("Assigned course", "Choice", "Count " & SEQUENCE(, 7)), DROP(assigned, 1))
)