基于Pulp的整数规划:扩展连续时段调度约束
嘿,我来帮你搞定这个紧接时段的约束添加!看起来你已经有了一个基于Pulp的整数规划模型,用来给教师和学生调度时段,现在需要确保同一教师和学生的调度是紧接的后续时段对吧?
首先,我们得先理清楚slot的结构:(time, course, instructor, student, grade),所以我们要关注的是每个slot里的教师(第3个元素)和学生(第4个元素),以及时间(第1个元素)。
实现思路
- 先整理所有的时间点,建立一个“当前时间→下一个紧接时间”的映射,这样我们能快速找到每个时间的后续时段。
- 遍历所有唯一的教师-学生对,针对每一对的所有时段,添加约束:如果他们被安排在某个时间点的slot,那么必须被安排在紧接的下一个时间点的slot。
具体代码实现
首先,先处理时间映射:
# 提取所有唯一的时间点并排序 times = sorted({slot[0] for slot in slots}) # 创建当前时间到下一个紧接时间的字典 next_time = {times[i]: times[i+1] for i in range(len(times)-1)}
然后,添加紧接时段的约束(放在你原有约束代码的后面即可):
# 获取所有唯一的教师-学生对 inst_stud_pairs = {(slot[2], slot[3]) for slot in slots} for inst, stud in inst_stud_pairs: # 筛选出该教师-学生对的所有slot,并按时间排序 pair_slots = sorted( [slot for slot in slots if slot[2] == inst and slot[3] == stud], key=lambda s: s[0] ) # 遍历每个slot(除了最后一个时间的slot) for i in range(len(pair_slots) - 1): curr_slot = pair_slots[i] next_slot = pair_slots[i+1] # 检查当前slot的时间是否紧接下一个slot的时间 if next_time.get(curr_slot[0]) == next_slot[0]: # 添加约束:如果选中当前slot,必须选中下一个紧接的slot sked_model += x[curr_slot] <= x[next_slot], \ f"Consecutive_Slot_{inst}_{stud}_{curr_slot[0]}"
约束说明
这个约束的逻辑是:如果某个教师和学生被分配到了时间t的时段,那么他们必须也被分配到紧接的t+1时段。这样就保证了同一教师和学生的调度不会出现孤立的、不连续的时段,完全符合你需要的“紧接后续时段”要求。
如果你需要的是双向约束(比如如果分配了t+1,必须分配t)——适用于要求调度必须从某个起始时间连续开始、不能中间插入的场景,只需要再添加一行:
sked_model += x[next_slot] <= x[curr_slot], \ f"Reverse_Consecutive_Slot_{inst}_{stud}_{next_slot[0]}"
你可以根据实际需求选择是否添加这部分。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

