根据两个第一选择和两个备用选择为学生分配课程,并且每门课程的学生人数有限制

问题描述 投票:0回答:1

假设我随机列出了 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 列)。

你们是否做过类似的事情并且对使用什么公式有任何想法?

工作 Excel 文件的图像 工作 Excel 文件

我尝试以类似于下面的方式使用 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))

excel excel-formula
1个回答
0
投票

这是一个尝试 - 很快就会添加对步骤的解释:

=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))
)

Result

© www.soinside.com 2019 - 2024. All rights reserved.