排课仿真算法
㈠ 有没有人知道最优排课算法怎么设计
不是所有的问题都能在你能接受的时间复杂度内得到最优解的。
多项式算法并不总是存在。
排课问题。。
你这什么意思啊。这个每个班不是人数固定嘛?那让人待在一个地方老师来教不就行了啊。。正纳闷你什么意思。。
这个问题能不能应用线性规划模型?因为你叙述不清,所以我也没有办法帮你建立模型。
至于DFS(深度优先搜索,就是你所谓的递归穷举)算法,那是一定要最优性剪枝和可行性剪枝的。运用地恰当可以大大减小搜索树的大小,至于20,20...这种数据量是小儿科的,应用DFS+剪枝应该可以得到很好的效果(我的意思是1s出解,因为我的世界衡量好与不好就是1s的限制)。
可行性剪枝:你自己定吧,我实在不明白你什么意思。
最优性剪枝:这个需要动态规划算法协助估计剩余可能需要的最小的目标函数值,再加上当前的目标函数值,大于最优解直接跳出。
我在剪枝上面基本上是文盲,不过对于解决你这个问题应该问题不大。
建议你好好考虑问题,再次用DFS算法,用上面两个方向考虑去掉多余的解,这是完全可以得到的。
实际中这种问题的算法都是非完美算法。(我不知道这个问题的性质是P类还是NP类,NP类是一定没有多项式时间算法的)
比如很简单的应用模拟退火算法和遗传算法都可以比较完美地解决问题。
一般实际中较少地要求最优解,因为比起消耗,这是不值得的。
㈡ 水晶排课是怎么排
只要设置好学校班数、节数、课程、教师任课,水晶排课就会自动排出所有课程表。
一个50个班的学校,从信息开始录入到开始打印课程表的整个过程一般一个小时内就可以完全搞定。而且电脑自动排课的过程只需几秒钟,排完之后觉得不满意,完全可以再用几秒钟的时间再排一次。
还能完美地导入Excel数据,并且能生成漂亮的Excel课程表,排课质量也非常优秀,基本告别所有手动和半自动排课方式,手动调课功能也非常强大。
(2)排课仿真算法扩展阅读:
水晶排课的优势:
排课软件,界面非常易用漂亮,手工排课一向是学校教务工作中最另人头疼的事,非常费时费神,而且由于人工操作时多多少少会有些失误。
往往经过一两天的冥思苦想排出来的课程表,却总会发现纰漏,导致课程表需要修改。而修改课程表一般都是牵一发而动全身,令人非常苦恼。水晶排课智能排课系统的出现解决了以上所有难题。
水晶排课软件特性
最好的智能排课系统。完美地导入Excel数据,真正生成Excel课程表,先进的排课算法,功能强大的手动排课,完美解决令头头疼的学校排课问题。
参考资料:网络-水晶排课
㈢ 如何用matlab实现基于遗传算法的自动排课系统的仿真测试
一句话讲不清楚咯,挺复杂
㈣ 排课的算法
排课算法是一个复杂程度相当高的算法,穷举是行不通的。不同的班级,不同的教师的课程纵横交错,不可能对每一种组合一一穷举。一间不到三十个班的学校,其课程组合的数量级常常超过整个宇宙质子数的总和。
但在这么多的课程组合中,找出“相对合理”的课程组合,满足学校、教师、学生的要求是可行的。
㈤ 怎么使用C#编写排课系统 急需 希望高手能帮助下 提供下具体步骤和源代码 感激不
我只提示,希望你自己完成
1、弄清楚排课算法,完成算法函数,注意输入输出接口
2、制定界面,定义输入输出(显示)模块(控件)
3、主程序或事件调用排课算法
㈥ c++如何实现排课系统的算法
我的想法是……
1.首先把最难弄的老师排上,就是说她教的班多,限制多。(这步的实际操作就是把排课顺序按照班数排序)
2.随机安排课(当然要根据人类习惯,您总不能让他一天上七节课),安排方式为先满足部分人需求(当然不太公平),然后剩下的补空
3.这剩下的部分人可能因为班级的关系出现重课的问题,没有关系,先把他安排上去,用repeat循环逐层更改被冲突对象的课节(最后可以选把美术音乐等老师,他们安排到下午的话上午比较好换)
具体跟据实际来定。。……我乱讲讲。这是我的想法模型。
㈦ 基于python的高校智能排课系统,求指导思路,算法。
以教学任务为基本单位,在计算教学任务排课优先级的基础上,对教学任务的时间和教室的安排均采用优化资源查找的算法.为简化算法,先安排教学任务的时间,然后再安排教室,设计并实现了一个高效智能排课系统.
㈧ Python实现基于遗传算法的排课优化
排课问题的本质是将课程、教师和学生在合适的时间段内分配到合适的教室中,涉及到的因素较多,是一个多目标的调度问题,在运筹学中被称为时间表问题(Timetable Problem,TTP)。设一个星期有n个时段可排课,有m位教师需要参与排课,平均每位教师一个星期上k节课,在不考虑其他限制的情况下,能够推出的可能组合就有 种,如此高的复杂度是目前计算机所无法承受的。因此众多研究者提出了多种其他排课算法,如模拟退火,列表寻优搜索和约束满意等。
Github : https://github.com/xiaochus/GeneticClassSchele
遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传算法的流程如下所示:
遗传算法首先针对待解决问题随机生成一组解,我们称之为种群(Population)。种群中的每个个体都是问题的解,在优化的过程中,算法会计算整个种群的成本函数,从而得到一个与种群相关的适应度的序列。如下图所示:
为了得到新的下一代种群,首先根据适应度对种群进行排序,从中挑选出最优的几个个体加入下一代种群,这一个过程也被称为精英选拔。新种群余下的部分通过对选拔出来的精英个体进行修改得到。
对种群进行修改的方法参考了生物DAN进化的方法,一般使用两种方法: 变异 和 交叉 。 变异 的做法是对种群做一个微小的、随机的改变。如果解的编码方式是二进制,那么就随机选取一个位置进行0和1的互相突变;如果解的编码方式是十进制,那么就随机选取一个位置进行随机加减。 交叉 的做法是随机从最优种群中选取两个个体,以某个位置为交叉点合成一个新的个体。
经过突变和交叉后我们得到新的种群(大小与上一代种群一致),对新种群重复重复上述过程,直到达到迭代次数(失败)或者解的适应性达到我们的要求(成功),GA算法就结束了。
算法实现
首先定义一个课程类,这个类包含了课程、班级、教师、教室、星期、时间几个属性,其中前三个是我们自定义的,后面三个是需要算法来优化的。
接下来定义cost函数,这个函数用来计算课表种群的冲突。当被测试课表冲突为0的时候,这个课表就是个符合规定的课表。冲突检测遵循下面几条规则:
使用遗传算法进行优化的过程如下,与上一节的流程图过程相同。
init_population :随机初始化不同的种群。
mutate :变异操作,随机对 Schele 对象中的某个可改变属性在允许范围内进行随机加减。
crossover :交叉操作,随机对两个对象交换不同位置的属性。
evolution :启动GA算法进行优化。
实验结果
下面定义了3个班,6种课程、教师和3个教室来对排课效果进行测试。
优化结果如下,迭代到第68次时,课程安排不存在任何冲突。
选择1203班的课表进行可视化,如下所示,算法合理的安排了对应的课程。