You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:18:15