几天前我问过一个关于如何将大学课程调度问题转化为布尔可满足性问题的问题。
(Class Scheduling to Boolean satisfiability [Polynomial-time reduction])
@Amit得到了一个非常优雅且易于编码的答案。 基本上,他的答案是这样的:他没有考虑课程,而是考虑了时间间隔。
因此,对于第i个课程,他只是起诉了该课程的所有可能的时间间隔。当每个路线至少有1个真实间隔并且没有间隔与其他路线重叠时,我们就会得到一个解决方案。
当我们只考虑课程而没有别的时候,这种方法非常有效。我通过编码间隔内的房间来概括它。
例如,而不是[8-10]说一个课程可能发生在上午8点到上午10点之间。我使用[0.00801 - 0.01001]说在1号房间上午8点到10点之间可能会发生一个课程。
我确信你现在正在徘徊“为什么要使用双倍?”好吧,因为这里出现了我的问题:
为了继续概括这个方法,我还编码了这段时间内教师的n°。
我用[1.00801 - 1.01001]说课程可以在1号房间的早上8点到10点之间进行,并由老师n°1教授。
以下是我现在所得到的:
问题是:使用这种方法我无法保证XX和YY会有所不同并且YY将可用,因为[1.008XX - 1.010XX]不重叠[2.008XX - 2.010XX],所以现在,求解者认为这是可能的。
通过使用这种间隔方法,我仍然没有任何关于如何确保这一点的线索...... 我需要一种方法来编码{Interval,room和teacher-id}以便:
先谢谢你的帮助, 最好的祝福 !
跟进问题: Class Scheduling to Boolean satisfiability [Polynomial-time reduction] Final Part
答案 0 :(得分:2)
这个答案是Part 1's answe r的扩展,并在可能的情况下使用相同的符号。
好的,假设每个间隔都分配给一位教师(如果多个教师可以使用该间隔,只有多个实例,每个实例使用不同的教师),所以要指示教师t
教授课堂p
在x
到y
时,我们可以使用此类给出的旧变量 - V_{i,j}
- 用于课程和时间间隔。
对于每位教师t
,以及教师可以参加的课程(a,b)中每对c=(x1,y1)
,d=(x2,y2)
的{{1}}添加条款:
Q_{t,i,j} = Not(V_ac) OR Not(V_bd) OR Smaller(y1,x2) OR Smaller(y2,x1)
直观地说,上述条款保证了教师不能在两个地方同时进行 - 没有相同教师分配给他们的间隔重叠。
通过将每个教师(i,j)
与每个教师t
用AND链接到原始公式,它满足您的第一个约束 - a teacher cannot be in 2 places in the same interval.
- 因为每个教师不能同时在两个地方时间。
你的第二个约束there cannot be 2 teachers in the same room for the same interval.
也因为不能有两个与时间和类重叠的类而得到满足。
there is a least 1 interval true by course.
条款满足第3个约束F1
,因为每个课程必须至少选择一个区间(分配一个教师)。