用大量变量建立时间表问题

时间:2011-05-07 12:39:33

标签: python constraints timetable resource-scheduling constraint-satisfaction

我有一个经典的时间表问题,包括变量类(~100),房间(20),术语(8)和工作日(5)。

为了解决问题,以下是减少的约束。

一天是9小时。

有些课程对学生是强制性的,而术语1,3,5,7(和2,4,6,8)的强制性课程不得相互重叠。

课程的小时数不同,有些是2小时,有些是3小时。

有些课程应该在特定的房间。

同一课程不能同时进行两次讲座。

我要使用logilabs python约束模块。而且我知道明智地选择变量和域将导致解决问题的时间更短。问题是我以前从未做过约束编程,并且很难解决问题以找出问题的起点和起点。例如:

我可以设置一个约束,例如“没有两个同一个房间,同一天可以重叠彼此的时间段”。或者从“没有房间可以在同一天保留超过9小时”开始,然后继续使用简化的解决方案域。我估计(没试过)第一个约束要比另一个约束需要更长的时间来解决。但它也需要(我猜)改变变量和解决方案域或重建较小的问题。我已经在变量,域,间隔,实现等方面有点迷失。

长话短说,我需要一些建议问题的指针,解决方案领域,明智地选择变量等。

由于

更新

使用logilab-constraint软件包我已经创建了一个基本应用程序并将其上传到github

2 个答案:

答案 0 :(得分:1)

查看curriculum course example codeDrools Planner。这基本上是相同的,但术语略有不同:每个课程(=课程)有许多讲座,需要安排到一个房间(=房间)和期间(=每个工作日的每个学期是一个时期)。

诀窍是保持一个干净的域模型,并将其与约束规则分开。 由于您的课程在小时数方面有不同的权重,我建议Lecture只分配一个startingPeriod,因此将一个讲座移动到另一组句点并不是很多代码(只需重新分配第一组)时段)。

答案 1 :(得分:-1)

我最终得到的解决方案包括“明智地选择变量”和“在选择时减少域名”。以下是我正在做的基于django的时间表应用程序的片段:

class Course(models.Model):
    name = models.CharField(max_length=255, null=False, blank=False)
    duration = models.PositiveSmallIntegerField(blank=False)
    type = models.ForeignKey(CourseType, blank=False, null=False)
    mandatory = models.BooleanField(default=False)
    '''
        following are the basic constraints  
    '''
    days = models.ManyToManyField(Day, blank=True, null=True)
    terms = models.ManyToManyField(Term)
    rooms = models.ManyToManyField('ClassRoom', blank=True, null=True)


    def __unicode__(self):
        return u'%s' % self.name   

我已将基本约束嵌入到类中, 例如“本课程可能在星期一或星期二,在1或2或3中 在房间1或2或3或4或5“,这允许我直接应用这些 从选择课程开始时的基本约束 数据库。

一般约束,例如“在同一天的同一时间内,两个课程不能在同一个房间”,适用于来自数据库中所做选择的简化变量域。

似乎现在正在工作。