前几天我问了一个关于如何将大学排课问题转化为布尔可满足性问题的问题。
我得到了@Amit 的回答,他非常优雅且易于编码。基本上,他的回答是这样的:他没有考虑课程,而是考虑了时间间隔。
因此,对于第 i 个课程,他只是指出了该课程的所有可能间隔。当每门课程至少有 1 个真实区间并且没有区间重叠时,我们得到了一个解。
当我们只考虑课程而不考虑其他内容时,这种方法非常有效。我通过对区间内的房间进行编码来概括它。
例如,而不是 [8-10] 说课程可以在上午 8 点到 10 点之间进行。
我用 [0.00801 - 0.01001] 表示课程可以在上午 8 点到 10 点之间在房间 1 进行。
我确定您目前正在徘徊“为什么要使用 double ?” 好吧,因为我的问题来了:
为了继续推广这种方法,我还在这个区间内编码了教师的 n°。
我用 [1.00801 - 1.01001] 表示课程可以在上午 8 点到 10 点之间在 1 号房间进行,由 n°1 老师教授。
这是我现在得到的:
像这样 [1.008XX - 1.010XX] 可以与 [2.008YY - 2.010YY] 同时发生,这是真的,如果老师 1 在上午 8 点到 10 点之间在房间 X 教学,那么老师 2 也可以在Y 上午 8 点到 10 点之间,当且仅当房间可用时。
问题是:使用这种方法,我不能保证 XX 和 YY 会不同并且 YY 将可用,因为 [1.008XX - 1.010XX] 不重叠 [2.008XX - 2.010XX],所以现在,求解器考虑这可能。
而且我仍然不知道如何通过使用这种间隔方法来确保这一点......我需要一种编码 {Interval, room and teacher-id} 的方法,以便:
- 一个老师不能在同一个区间的两个地方。
- 同一房间不能有 2 位教师在同一时间间隔内。
- 当然,至少有 1 个区间为真。
提前感谢您的帮助,最好的问候!
后续问题: Class Scheduling to Boolean satisfiability [Polynomial-time reduction] Final Part