我有一个经典的时间表问题,由变量 classes(~100)、rooms(20)、terms(8) 和 weekdays(5) 组成。
为了简化问题,以下是减少的约束。
一天是9个小时。
有些课程是学生必修课,1、3、5、7(以及 2、4、6、8)的必修课不得相互重叠。
课程在小时数方面有不同的权重,有些是 2 小时,有些是 3 小时。
有些课程应该在特定的房间。
同一堂课不能同时开两节课。
我将使用 logilabs python 约束模块。而且我知道明智地选择变量和域将减少解决问题的时间。问题是我以前从未做过约束编程,并且很难建立问题来找出从哪里开始以及从什么开始。例如:
我可以设置一个约束,例如“同一个房间没有两个班级,同一天可以重叠彼此的时间段”。或者从“没有房间可以在同一天预订超过 9 小时”开始,然后继续减少解决方案域。我估计(没有尝试)第一个约束将比另一个约束需要更长的时间来解决。但它也需要(我猜)改变变量和解决方案域或重建一个较小的问题。我已经对变量、域、间隔、实现等有点迷失了。
长话短说,我需要一些指针来构建问题、解决方案域、明智地选择变量等。
谢谢
更新
使用 logilab-constraint 包,我制作了一个基本应用程序并将其上传到github