Algorithm 安排学生上课

Algorithm 安排学生上课,algorithm,logistics,Algorithm,Logistics,我正在为学校的一个辅助项目制作一个网站,学生们可以进入他们需要上课的课程,他们想要或不想要上课的日子,以及他们不能上课或不想要上课的时间。基础是有课,每节课在不同的时间有不同的教授,学生可以从中选择。在新生级别的课程中,每个课程可以有30多个不同的部分。我有mysql数据库中的类和部分,我一直在用php编写代码 到目前为止,我有它的工作,但我想让它更快。我一直在读关于其他日程安排问题的书,但我正在寻找我正在做的事情的细节。这不是从头开始制定时间表。它是根据可用的部分制定时间表,并根据学生输入的内

我正在为学校的一个辅助项目制作一个网站,学生们可以进入他们需要上课的课程,他们想要或不想要上课的日子,以及他们不能上课或不想要上课的时间。基础是有课,每节课在不同的时间有不同的教授,学生可以从中选择。在新生级别的课程中,每个课程可以有30多个不同的部分。我有mysql数据库中的类和部分,我一直在用php编写代码

到目前为止,我有它的工作,但我想让它更快。我一直在读关于其他日程安排问题的书,但我正在寻找我正在做的事情的细节。这不是从头开始制定时间表。它是根据可用的部分制定时间表,并根据学生输入的内容对其进行排序。目前,对于少数可能的部分,它运行速度很快。但当可能的时间表达到大约300000时,需要大约30秒来比较和排列所有内容。我一直在通过改变时间表的生成方式来改进它,但我想更快。我从蛮力生成改为使用基于树的方法

我不是在请求家庭作业帮助,也不是请求别人帮我做这件事。我只想指出我可以学习的已经存在的问题和算法的正确方向

看一看。它可能不是你想要的,但你可以得到一些设计想法。

看看。它可能不完全是你想要的,但你可以得到一些设计想法。

还记得吗?我当然希望你这样做,如果没有,先去解决它,然后再回到你的日程安排任务

您已经从蛮力移动到树结构。现在是时候休息了。不管你所说的“良好的时间表”是什么意思,170000太多了——你修剪的树不够。我不认为每个学生都有超过20-50个真正好的时间表,除非他们上课很少,而且非常灵活。

还记得吗?我当然希望你这样做,如果没有,先去解决它,然后再回到你的日程安排任务


您已经从蛮力移动到树结构。现在是时候休息了。不管你所说的“良好的时间表”是什么意思,170000太多了——你修剪的树不够。我不认为每个学生都有超过20-50个真正好的时间表,除非他们上课很少,而且非常灵活。

试试禁忌搜索或模拟退火等超启发式方法。 蛮力和分支绑定的规模不够大

看看我在drools planner中的课程示例,如ITC2007所定义。
它可能是您用例的高级形式(不包括gui/db)。

尝试禁忌搜索或模拟退火等超启发式方法。 蛮力和分支绑定的规模不够大

看看我在drools planner中的课程示例,如ITC2007所定义。
它可能是用例的高级形式(不包括gui/db)。

您分析过当前算法的时间复杂性吗?对于7个类,50400个可能的计划,总时间:6.47082304955秒,每个计划的秒数:7788.80825733秒,每个计划的秒数:0.0001283893421,良好的计划:24330。对于8个类,201600可能的时间表,总时间:18.2666659355秒,每个时间表的秒数:11036.4967921秒,每个时间表的秒数:9.06084619817E-5,良好的时间表:59024|对于9个类,806400个可能的时间表,总时间:60.92305777946秒,每个时间表的秒数:13236.3677923秒,每个时间表的秒数:7.55494268286E-5,好的时间表:172912我制作时间表的方法是将第一个类节放在0级节点中,然后放在1级,如果没有冲突,它会将“下一个类”部分添加到每个子节点。每节课都是这样。在添加所有类之后,一路向下的路径是一个很好的时间表。像树一样操作大大减少了我的时间和对手的数量。你分析过你当前的算法的时间复杂度吗?对于7个类,50400个可能的计划,总时间:6.47082304955秒,每个计划的秒数:7788.80825733秒,每个计划的秒数:0.0001283893421,良好时间表:24330。|对于8个课程,201600个可能的时间表,总时间:18.2666659355秒,每个时间表的秒数:11036.4967921秒,每个时间表的秒数:9.06084619817E-5,良好时间表:59024|对于9个类,806400个可能的时间表,总时间:60.92305777946秒,每个时间表的秒数:13236.3677923秒,每个时间表的秒数:7.55494268286E-5,好的时间表:172912我制作时间表的方法是将第一个类节放在0级节点中,然后放在1级,如果没有冲突,它会将“下一个类”部分添加到每个子节点。每节课都是这样。在添加所有类之后,一路向下的路径是一个很好的时间表。像树一样做可以大大减少我的次数和公司数量,这是因为野蛮的强迫。-1对不起,这看起来一点关系都没有。他想要的是一种查找日程安排的方法,而不是在网页上显示日历。-1抱歉,这看起来根本不相关。他想要的是找到日程安排的方法,而不是在网页上显示日历。