教师时间表算法

时间:2008-10-16 23:27:33

标签: algorithm scheduling np-hard

这是我长期以来的一个问题。作为老师和程序员的儿子,我很早就想到了......但我仍然没有找到解决方案。

所以这就是问题所在。人们需要使用一些约束为学校创建时间表。这些通常分为两类:

完整性检查

  • 老师不能同时教授两门课程
  • 学生不能同时上两节课
  • 有些老师必须在一周内至少休息一天
  • 时间表中应包含一周中的所有日期
  • 主题X必须每周完成一段时间
  • ...

偏好设置

  • 每位教师的日程安排应尽可能紧凑(即教师应该连续一天工作一小时,如果可能的话,没有停顿)。
  • 休假的教师应该能够在哪一天表达偏好
  • 兼职教师应该能够表达是否在学校开学日或结束时工作的偏好。
  • ...

现在,经过几年没有找到解决方案(同时学习一两件事......),我意识到这闻起来像NP难题。

它被证明是NP难吗?

有没有人知道如何破解这件事?

查看this问题让我思考这个问题,以及遗传算法在这种情况下是否可用。然而,在保持理智检查规则的同时,很难改变可能性。另外,我不清楚如何区分不兼容的要求。


一个小的附录,以更好地说明问题。这适用于意大利学校风格的教室,所有学生都在不同的班级(例如:第1年A部分),教师在不同课程之间移动。同一班级的所有学生都有相同的时间表,并且无法选择参加哪些课程。

12 个答案:

答案 0 :(得分:23)

我是开发人员之一,负责学生信息系统的调度程序部分。 在我们调度问题的最初方法中,我们研究了遗传算法来解决约束满足问题,即使我们最初成功,我们也意识到问题的解决方案不太复杂(参加学校调度研讨会后)

我们当前的实施工作非常有效,并且使用强力启发式智能启动技术在短时间内获得有效的时间表。首先建立主要时间表(向教师分配课程),同时考虑到每个教师所具有的所有约束,同时最小化学生冲突的可能性(基于他们的课程要求)。然后使用相同的方法在课程中安排学生。

执行此操作可让您首先让机器构建主计划,然后在需要时进行人工调整。

调度程序当前实现是用perl编写的,但我们早期访问的其他选项是Prolog和CLIPS(专家系统)

答案 1 :(得分:2)

这是一个映射问题: 你需要映射到一周内每个小时和每个老师的活动(教授某个班级或空闲时间)。

解决问题:

  1. 创建教师,班级和偏好列表,然后让用户填充地图上的一些偏好设置作为起点。
  2. 从列表中随机取一个元素并将其放在地图上的随机自由位置 如果它没有通过任何健全性检查,直到列表为空。如果在任何特定的迭代中你不能在地图上放置一个元素而不通过理智检查,请在地图上移动两个位置并再试一次。
  3. 填充地图时,请尝试在地图上移动位置以优化结果。
  4. 在步骤2和3中向用户显示每次迭代:列表中剩余的项目,地图上的位置和下一次计算的移动,让用户进行干预。

    我没试过,但这是我最初的做法。

答案 2 :(得分:2)

回答我自己的问题:

gnud提到的FET项目使用这种算法:

  

关于算法的一些说法:FET   使用启发式算法,放置   这些活动依次开始   最困难的。如果不能   找到一个解决方案,它指向你   潜在的不可能活动,所以   你可以纠正错误。算法   如果那样递归交换活动   是为了腾出空间   新活动,或者在极端情况下,   回溯和切换顺序   评价。重要的代码在   SRC /发动机/ generate.cpp。请发电子邮件   我的详细信息或加入邮件   名单。该算法模仿了   人类时间表的运作,我   认为

Link


跟进维基百科上严格软件的“基于约束的推理”的引导,引导我these pages有一个有趣的段落:

  

解决约束满足感   有限域上的问题是   NP-complete问题一般。   研究表明了一些   多项式时间子句,主要是   通过限制任何一个获得   允许的域或约束或   方式约束可以放在   变量。研究也有   建立了关系   约束满足问题   有限的其他领域的问题   模型理论和数据库。

答案 3 :(得分:2)

过去我已经解决了类似的计划/调度问题,而且通常最适合这类问题的AI技术是“基于约束的推理”。

它基本上是像Laurenty所建议的强力方法,但该方法涉及以有效的顺序应用约束以使不可行的解决方案快速失败 - 以最小化所需的计算。

谷歌搜索“基于约束的推理”为该技术及其在调度问题中的应用带来了大量资源。

答案 4 :(得分:2)

这让我想起了这个blog post about scheduling a conferencevideo explanation here

我该怎么做:

人口中包含两件事:

  • 谁教授什么课(我希望老师教一门课)。
  • 特定时段的课程内容。

这样我们就不会有冲突(两个地方的老师,或同时有两个科目的班级)。

健身功能包括:

  • 每位老师每周给出多少个时段。
  • 老师在同一天有多少时间(他们不能整整一天教学,这也必须平衡)。
  • 一个班级在同一天有多少个同一个科目的时段(他们不能有一整天的数学!)。

可能会对所有这些标准差进行标准偏差,因为它们应该平衡。

答案 5 :(得分:2)

我不确定这是否与@Stringent Software's回答相同(因为名称略有不同),但我有几个非常好的朋友正在研究Constraint Programming的领域。创建时间表是他们研究的一个应用。

Dr Chris Jefferson创建了一个名为Minion的程序,可以从SourceForge下载,是一个用C ++编写的非常快速的强制约束问题求解器

答案 6 :(得分:1)

我认为你可能会遗漏一些限制因素。

人们希望尽可能让教师安排到他们获得认证的课程。

有人会怀疑所要求的课程以及每个课程的预期人数都很重要。

我认为开始的地方是列出所有约束,找出表示它们的数据结构。

然后创建某种引擎来构建试验解决方案,然后根据约束条件评估它的适应性。

然后你可以把有趣的遗传算法部分扔到它上面,看看你是否可以随着基因混合而增加适应性。

从一小部分约束开始,并在看到成功时增加它们(如果你看到成功)

可能有一种方法可以采用约束并将它们与线性编程算法结合在一起。

我同意。这听起来像是一个有趣的挑战

答案 7 :(得分:1)

有史以来最糟糕的开源网页之一,但该项目看起来很有希望: http://www.lalescu.ro/liviu/fet/

基于网络的方式:
phpScheduleIt(不是针对学校的)

答案 8 :(得分:1)

  

看着这个问题让我思考   关于这个问题,是否   遗传算法可用于   这个案例。不过它会很漂亮   很难改变可能性   保持理智检查规则。   我也不清楚如何做到这一点   区分不相容的要求。

遗传算法非常适合这样的问题。一旦你想出了一个体面的染色体表示(在这种情况下,可能是一个代表所有可用类槽的向量),你就是那里的大部分。

不要担心在变异阶段保持健全性检查。突变是随机的。完整性和偏好检查都属于选择阶段。失败的健全检查会大大降低个人的健康状况,而失败的偏好只会轻微降低健康状况。

不兼容的要求完全是一个不同的问题。如果它们完全不兼容,那么你将获得一个不会聚合任何有用的人口。

答案 9 :(得分:0)

祝你好运。作为一个有这种问题的父亲的儿子,我带到了研究小组,我最终进入了......


当我小时候,我的父亲在当地体育联盟中安排了比赛官员,这也有类似的长期限制,我试着写一些东西来帮助。当我上大学时,我甚至将它用作我的最后一年项目,最终解决蒙特卡洛实施(使用模拟退火模型)。

基本的想法是,如果它不是NP,它非常接近,所以不是假设有一个解决方案,我会开始在给定的时间范围内找到最好的。我会强调所有限制因素以及打破它们的成本:理智检查会产生巨大的成本,优先选择会降低成本(但是增加更多的休息时间,因此打破一次将不到打破它两次的成本的一半)。

基本的想法是我开始使用“随机”解决方案并将其计算在内;然后通过交换少量任务进行更改,重新评估,然后,逐步接受或拒绝更改。

经过数千次迭代后,您可以接近可接受的解决方案。

但是,请相信我,这类问题让研究小组培养出博士学位,这样你们就能很好地合作。

您可能还会对线性规划领域感兴趣,例如: simplex等等。

答案 10 :(得分:0)

是的,我认为这是完整的NP - 或者至少找到NP完整的最佳解决方案。

当我告诉朋友的父亲(他是一名教师)时,我在大学里遇到了类似的问题,如果他找不到合适的课程,我可以为他解决他的日程安排问题(这是在1990年左右) )

我不知道自己得到了什么。幸运的是,我所要做的就是找到一个符合约束条件的解决方案。但在我的测试中,我总是担心确定是否存在解决方案。他从来没有过多的约束,程序使用了不同的启发式和反向跟踪。这很有趣。

我认为比尔盖茨还在高中或大学里为他的高中制定了这样的系统。但不确定。

祝你好运。我所有的笔记都消失了,我从来没有实现过可以推销的解决方案。当我学习新语言(Basic,Scheme,C,VB,C ++)时,我重新编写了一个专业项目

玩得开心

答案 11 :(得分:0)

我看到这个问题可以通过Prolog程序将其连接到数据库来解决 并且程序可以使计划给出一组约束 阅读abt“约束满足问题序言”