高效的大学课程安排

时间:2012-11-06 19:17:07

标签: python algorithm scheduling

我目前正在建立一个网站,允许我大学的学生根据他们想要的课程自动生成有效的时间表。

在开展网站工作之前,我决定解决如何有效安排课程的问题。

一些澄清:

  1. 我们大学的每门课程(我相互承担 大学)由一个或多个部分组成。所以,例如, 微积分我目前有4个部分可用。这意味着,根据部分的数量,以及课程是否有实验室,这会严重影响课程安排。

  2. 我们大学的课程使用主题缩写和课程代码的组合来表示。在微积分I的情况下:MATH 1110。

  3. CRN是某个部分唯一的代码。

  4. 我所在的大学并不喜欢,这意味着男性和女性在(几乎)不同的校园里学习。我的意思几乎就是校园分为两部分。

  5. 日期时间和时间范围dicts旨在减少对datetime.datetime.strptime()的调用,这是一个真正的瓶颈。

  6. 我的第一次尝试包括连续循环算法,直到找到30个时间表。通过从一个输入的课程中随机选择一个部分,然后尝试从剩余的课程中放置部分来尝试构建有效的时间表来创建时间表。如果并非所有课程都符合时间表,即存在冲突,则会取消时间表并继续循环。

    显然,上述解决方案存在缺陷。该算法运行时间太长,并且过于依赖随机性。

    第二种算法与旧算法完全相反。首先,它使用itertools.product()生成所有可能的计划组合的集合。然后,它会遍历计划,将任何无效的计划交叉。为了确保各个部分,在验证之前调度计划组合(random.shuffle())。同样,还有一些随机性。

    经过一些优化后,我能够让调度程序在1秒内运行,平均时间表包含5个课程。这很好,但是一旦你开始添加更多课程,问题就开始了。

    为了给你一个想法,当我提供一组特定的输入时,可能的组合数量太大,以至于itertools.product()在合理的时间内没有终止,在这个过程中吃掉1GB的RAM。

    显然,如果我要将其作为服务,我将需要更快,更有效的算法。在线和IRC中出现了两个:动态编程和遗传算法。

    动态编程不能应用于这个问题,因为如果我正确地理解了这个概念,它就会将问题分解成更小的部分,单独解决这些部分,然后将这些部分的解决方案结合在一起形成一个完整的解决方案。据我所知,这不适用于此。

    至于遗传算法,我对它们了解不多,甚至无法理解如何在这种情况下应用它。我也理解GA对于一个非常大的问题空间会更有效,而且

    我有哪些替代品?我可以采取一种相对可以理解的方法来解决这个问题吗?或者我应该坚持我所拥有的,并希望下个学期没有多少人决定参加8门课程?

    我不是一个伟大的作家,所以我很抱歉这个问题含糊不清。请随时要求澄清,我会尽力帮助。

    以下是完整的代码。

    http://bpaste.net/show/ZY36uvAgcb1ujjUGKA1d/

    注意:很抱歉使用误导性标记(计划)。

5 个答案:

答案 0 :(得分:14)

日程安排是一个非常着名的constraint satisfaction problem,通常为NP-Complete。关于这个主题已经做了很多工作,即使在与你相同的背景下:Solving the University Class Scheduling Problem Using Advanced ILP Techniques。关于这个问题甚至有textbooks

人们采取了很多方法,包括:

您需要减少问题空间和复杂性。做出尽可能多的假设(最大类数,基于块的时序等)。这个问题没有灵丹妙药,但应该可以找到近乎最优的解决方案。

一些半新刊物:

答案 1 :(得分:3)

你有没有读过关于遗传编程的任何内容?它背后的想法是,让你想要解决的“事物”自己发展,直到它成长为最佳解决方案。

您生成了一千个计划,其中通常为零,在正确的有效方向上。接下来,您随机更改“某些”课程。根据这些新的时间表,您可以根据您根据时间表的“优点”给出的评分选择一些最佳的时间表。接下来,通过结合两个时间表上的一些课程,让他们重现。你最终得到了一千个新的时间表,但它们都比你们的时间表要好一点。让它重复直到您满意为止,并从您生成的最后一千个中选择具有最高评级的计划。

我承认,存在随机性,但无论你让算法运行多久,时间表都会越来越好。就像现实生活和有机体一样,有适者生存,有可能查看同一种时间表的不同一般“线程”,这与生成的另一种一样好。两个截然不同的时间表最终可以通过杂交育种来“对抗”。

涉及学校时间表和遗传规划的项目: http://www.codeproject.com/Articles/23111/Making-a-Class-Schedule-Using-a-Genetic-Algorithm

我认为他们很好地解释了你的需求。

我的最后一点:我认为这是一个非常有趣的项目。制作起来相当困难,但一旦完成,看到你的解决方案就像真实生活一样发展真是太好了。祝你好运!

答案 2 :(得分:2)

您目前正在生成各个部分组合的方式可能会抛出大量的组合,这些组合被多个课程之间的冲突所排除。我认为您可以通过首先仅为两个课程生成部分的产品来减少您需要处理的组合数量。消除该集合中的冲突,然后介绍第三个课程的部分。再次消除,然后引入第四个,依此类推。随着所选课程数量的增加,这应该会使所需的处理时间呈线性增长。

答案 3 :(得分:1)

这是一个难题。它你谷歌像“课程安排问题论文”,你会发现很多参考。遗传算法 - 不,动态编程 - 是的。与标准DP算法相比,GA更难理解和实施。通常使用开箱即用的人,不懂标准技术。做一些研究,你会发现不同的算法。您可能能够找到一些实现。提出自己的算法比理解DP更加困难。

答案 4 :(得分:0)

您所描述的问题是约束满意度问题。我的方法如下:

  • 检查课程之间是否存在任何不兼容性,如果是,则将其记录为约束或弧线
  • 虽然找不到解决方案:
    • 选择约束较少的课程(即与其他课程的不兼容性较少)
    • 运行AC-3算法以减少搜索空间

我尝试过使用数独求解这种方法,并且它有效(在不到10秒的时间内解决了世界上最难的数独)