安排最多 S 名学生的 T 位老师分配到 S 个时段

huangapple go评论59阅读模式
英文:

Scheduling T teacher having max S students into S slots

问题

这是您提供的文本的中文翻译:

有T名教师,每名教师最多可以有S名学生。每名学生最多可以有S名教师。有S个时间段供学生和教师会面。

在每个时间段内,一名教师将教授其中一名学生,然后教师会得到另一名学生,而学生则会去找另一名教师。

对于S = 3

输入:

教师1 - 学生1,学生2

教师2 - 学生2,学生3

教师3 - 学生1,学生3

教师4 - 学生1,学生3,学生2

解决方案:

安排最多 S 名学生的 T 位老师分配到 S 个时段

尝试过这个,但它是针对单个教师和其学生的,可用于检查是否可以将学生分配给当前教师,否则它不提供未来无冲突调度的最佳方式。

英文:

There are T teachers who can each have a maximum of S students. Each student can have a maximum of S teachers. There are S time slots for the student and teacher to meet.

In each slot a teacher will teach one of its student and then teacher gets another student while the student goes to another teacher.

For S = 3

Input:

Teacher 1 - Student 1, Student 2

Teacher 2 - Student 2, Student 3

Teacher 3 - Student 1, Student 3

Teacher 4 - Student 1, Student 3, Student 2

Solution:

安排最多 S 名学生的 T 位老师分配到 S 个时段

Tried this, but it's for a single Teacher and its mentee and can be used to check if it's possible to assign the students to the current teacher or not, but otherwise it doesnt provide the optimal way of scheduling so that there is no conflict in the future.

答案1

得分: 2

这个问题也可以通过整数线性规划高效解决。一个开源求解器CBC的Python接口可以在Python包PuLP中找到。PuLP还附带了一个求解器二进制文件,因此不需要额外的安装步骤。

我们定义了决策变量并向优化模型添加相关约束:

from pulp import *

def parse_constraints(constraints_string):
    constraints = {}
    lines = constraints_string.split("\n")
    for line in lines:
        line = line.strip()
        if line:
            teacher, students = line.split("-")
            teacher = int(teacher.strip().split()[1])
            students = [int(s.strip().split()[1]) for s in students.split(",")]
            constraints[teacher] = students

    return constraints

def get_teacher_student_pairings(constraints):
    pairings = []

    for teacher, students in constraints.items():
        for student in students:
            pairings.append((teacher, student))

    return pairings

def optimize_schedule(teachers, students, time_slots, pairings):
    prob = LpProblem("Teacher-Student Schedule Optimization", LpMinimize)

    # 决策变量
    x = LpVariable.dicts("x", [(t, s, ts) for t in teachers for s in students for ts in time_slots], cat="Binary")

    # 每个学生只能与其指定的老师配对一次
    for t, s in pairings:
        prob += lpSum([x[t, s, ts] for ts in time_slots]) == 1

    # 每个老师一次只能教授一个学生
    for t in teachers:
        for ts in time_slots:
            prob += lpSum([x[t, s, ts] for s in students]) <= 1

    # 每个学生一次只能被一个老师教授
    for s in students:
        for ts in time_slots:
            prob += lpSum([x[t, s, ts] for t in teachers]) <= 1
    prob.solve()

    # 提取解决方案
    schedule = []
    for ts in time_slots:
        line = f'Slot {ts} - '
        for t in teachers:
            for s in students:
                if value(x[t, s, ts]) == 1:
                    line += f'T{t}-S{s} '
                    break
            else:
                line += '      '
        schedule.append(line)
    return schedule

这将生成所需的时间表:

teachers = [1, 2, 3, 4]
students = [1, 2, 3]
time_slots = [1, 2, 3]

constraints_string = """
Teacher 1 - Student 1, Student 2
Teacher 2 - Student 2, Student 3
Teacher 3 - Student 1, Student 3
Teacher 4 - Student 1, Student 3, Student 2
"""

assignments = parse_constraints(constraints_string)
pairings = get_teacher_student_pairings(assignments)
schedule = optimize_schedule(teachers, students, time_slots, pairings)
for time_slot in schedule:
    print(time_slot)

输出:

Result - Optimal solution found
Objective value:                0.00000000
Enumerated nodes:               0
Total iterations:               0
Time (CPU seconds):             0.00
Time (Wallclock seconds):       0.02
Option for printingOptions changed from normal to all
Total time (CPU seconds):       0.01   (Wallclock seconds):       0.03
Slot 1 -       T2-S2 T3-S1 T4-S3 
Slot 2 - T1-S1       T3-S3 T4-S2 
Slot 3 - T1-S2 T2-S3       T4-S1 
英文:

This problem can also be solved efficiently with Integer Linear Programming. An out-of-the-box python interface to the open-source solver CBC can be found in the python package PuLP. PuLP also ships with a solver binary so no additional installation steps are required.

We define our decision variables and add the relevant constraints to the optimization model:

from pulp import *
def parse_constraints(constraints_string):
constraints = {}
lines = constraints_string.split(&quot;\n&quot;)
for line in lines:
line = line.strip()
if line:
teacher, students = line.split(&quot;-&quot;)
teacher = int(teacher.strip().split()[1])
students = [int(s.strip().split()[1]) for s in students.split(&quot;,&quot;)]
constraints[teacher] = students
return constraints
def get_teacher_student_pairings(constraints):
pairings = []
for teacher, students in constraints.items():
for student in students:
pairings.append((teacher, student))
return pairings
def optimize_schedule(teachers, students, time_slots,pairings):
prob = LpProblem(&quot;Teacher-Student Schedule Optimization&quot;, LpMinimize)
# Decision variables
x = LpVariable.dicts(&quot;x&quot;, [(t, s, ts) for t in teachers for s in students for ts in time_slots], cat=&quot;Binary&quot;)
# Eeach student is paired with each of their assigned teacher exactly once
for t,s in pairings:
prob += lpSum([x[t, s, ts] for ts in time_slots]) == 1
# Each teacher can only teach 1 student at a time
for t in teachers:
for ts in time_slots:
prob += lpSum([x[t, s, ts] for s in students]) &lt;= 1
# Each student can only be taught by  1 teacher at a time
for s in students:
for ts in time_slots:
prob += lpSum([x[t, s, ts] for t in teachers]) &lt;= 1
prob.solve()
# Extract solution
schedule = []
for ts in time_slots:
line=f&#39;Slot {ts} - &#39;
for t in teachers:
for s in students:
if value(x[t, s, ts]) == 1:
line+=f&#39;T{t}-S{s} &#39;
break
else:
line+=f&#39;      &#39;
schedule.append(line)
return schedule

This produces the desired schedule:

teachers = [1, 2, 3, 4]
students = [1, 2, 3]
time_slots = [1, 2, 3]
constraints_string = &quot;&quot;&quot;
Teacher 1 - Student 1, Student 2
Teacher 2 - Student 2, Student 3
Teacher 3 - Student 1, Student 3
Teacher 4 - Student 1, Student 3, Student 2
&quot;&quot;&quot;
assignments = parse_constraints(constraints_string)
pairings = get_teacher_student_pairings(assignments)
schedule = optimize_schedule(teachers, students, time_slots,pairings)
for time_slot in schedule:
print(time_slot)

Output:

Result - Optimal solution found
Objective value:                0.00000000
Enumerated nodes:               0
Total iterations:               0
Time (CPU seconds):             0.00
Time (Wallclock seconds):       0.02
Option for printingOptions changed from normal to all
Total time (CPU seconds):       0.01   (Wallclock seconds):       0.03
Slot 1 -       T2-S2 T3-S1 T4-S3 
Slot 2 - T1-S1       T3-S3 T4-S2 
Slot 3 - T1-S2 T2-S3       T4-S1 

答案2

得分: 0

使用Hopcroft算法,优先考虑具有最大度数的顶点将解决这个问题。

英文:

Hopcroft craft with priority to maximum degree vertices will solve this

huangapple
  • 本文由 发表于 2023年6月15日 01:11:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/76476034.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定