我目前正在一个网站上工作,该网站将允许我所在大学的学生根据他们想修的课程自动生成有效的课程表。
在网站上工作之前,我决定解决如何有效地安排课程的问题。
一些澄清:我们大学的每门课程
大学)由一个或多个部分组成。比如说,
微积分I目前有4个部分可用。这意味着,取决于课程的节数,以及课程是否有实验室,这会极大地影响排课过程。
我们大学的课程用学科缩写和课程代码的组合来表示。在微积分I中:数学1110。
CRN是一个区段特有的代码。
我就读的大学不是男女混合的,意思是男女在(几乎)不同的校园学习。我几乎是说校园被分成了两部分。
datetimes和timeranges dict旨在减少对datetime.datetime.strTime()的调用,这是一个真正的瓶颈。
我的第一次尝试是算法不断循环,直到找到30个调度。通过从一个输入的课程中随机选择一个部分,然后尝试从其余课程中放置部分来构建有效的计划,创建计划。如果不是所有课程都符合时间表,即存在冲突,则取消时间表并继续循环。
显然,上述解决方案存在缺陷。算法运行时间太长,而且过于依赖随机性。
第二种算法与旧算法完全相反。首先,它使用itertools.product()生成所有可能的计划组合的集合。然后,它遍历计划,删除所有无效的。为了确保分类的部分,计划组合在被验证之前被洗牌(random.shuffle())。同样,也有一些随机性。
经过一点优化,我能够让调度程序在1秒内运行,平均调度由5个课程组成。那很好,但一旦你开始增加更多的课程,问题就开始了。
给你一个