自动排课算法核心java代码怎么实现的?点击自动排课按代码实现的?_用SQL实现的一个自动排课机制...
同学毕业设计搞的是一个排课系统,具体功能就给课程安排教室和时间。排课算法是有一定难度的,很多老师说过,至今也没有完美的排课算法,的确,排课,是一个五维交叉的复杂体系:时间、课程、教室、班级、学生。一个排好的课表至少要保证以下几点原则:
一个教师同一时间只上一门他要教的课
一个班级同一时间只上一门他要上的课
一个教室同一时间只上一门课
拿到这个问题,刚开始觉得简单,后来仔细分析后,发现难度相当大。关键是其复杂度太高,对待这种问题,我选择排除法。也就是先列出可能的各种组合,再依据约束条件进行排除,最后留下的结果即是所求。
利用Power Designer来数据建模。
首先是建立教师、班级、课程表,因为他们是主体。并建立相关的关系映射表:
这五张表都是要作为输入数据提交给自动排课系统的。
分配的主体还包括时间和地点,也就是上课时段和教室,由于系统要满足三点原则,所以,需要将五维关系进行关联,也就是教室和时间、教师和时间、班级和时间进行关系映射:
上图中,教室表、教师表、班级表、上课时段表都是系统的输入数据。而他们之间的关系映射表:Room_Time_Map、Class_Time_Map、Teacher_Time_Map则是系统在运行中使用的表,系统就是靠他们完成前面提到的三个排除原则的,在系统运行之前,它们是空的。运行开始之后,每当系统要为一门课程分配教室时,都要检查这三个映射表,看是否已经有相关的记录。举个例子:当系统要为语文课分配某个时间和某个教室时它首先要看Class_Time_Map,看看上语文课的这个班级是否在同一时间已经有课,如果有则不分配这个时间。同理对教室,和教师。
筛选条件准备好之后,开始构造课程表,准确说是预排课程表,这个课程表包括各种可能:
它是教室表、上课时段、班级课程对应表、教师课程对应表的连接组合,只进行了一个初步筛选,就是每条记录中,的班级上的课程与教师上的课程必须是相同的。SQL如下:
1 select
2 cc.CourseID,3 r.RoomID,4 cc.ClassID,5 tc.TeacherID,6 t.TimeID7 into
8 TempPlans9 from
10 dbo.Class_Course_Map ascc,11 dbo.Teacher_Course_Map astc,12 dbo.Times ast,13 dbo.Rooms asr14 where
15 cc.CourseID = tc.CourseID
在输入10个班级、6位教师、5个教室、5门课程、15个上课时段(5 天 × 3 时段/每天)的情况下共有3450条记录产生。
在构造一个最终课程表,结构与预排课程表相同,用来放最终结果。所有预排课程表中的记录只要满足筛选条件都要插入到此表。
下面就要对3450条记录进行筛选了,筛选之前还有一个问题必须考虑,那就是这3450条记录中有很多记录可能出现如下情况:一个班级在不同时间内上同一门课程若干次,而不是一次。系统是假定每门课程每个班级只上一次的(这可能有悖常理,稍后讨论)。所以有必要再构造一个表进行条件筛选,此表称之为班级课程记录表:
每当系统为一个班级分配好一门课程时,都会将班级、课程号记录再此表内,将来再插入记录时便可以检查改表,看是否以为该班分配了该课,避免重复。
下面就可以进行最后的运行了,系统将对预排课程表逐条检查,看其是否满足删除条件:也就是看Room_Time_Map、Class_Time_Map、Teacher_Time_Map、Class_COurse_Rec_Map中是否已经有此记录,如果有,略过;如果没有证明可以排课,则将其添加到最终的课程表;最后将这条记录从预排表中删除。
SQL如下:
1 /*check the data one by one*/
2
3
4 while (select count(*) from dbo.TempPlans) > 0
5 begin
6
7 declare @course int,@room int,@class int,@teacher int,@time int
8 select top 1 @course=CourseID, @room=RoomID, @class=ClassID, @teacher=TeacherID, @time=TimeID9 fromdbo.TempPlans10
11 declare @classok int,@teacherok int,@roomok int,@classrecok int
12 select @classok=count(*) from dbo.Class_Time_Map where ClassID=@class and TimeID=@time
13
14 select @classrecok=count(*) from dbo.Class_Course_Rec_Map where ClassID=@class and CourseID=@course
15
16 select @teacherok=count(*) from dbo.Teacher_Time_Map where TeacherID=@teacher and TimeID=@time
17
18 select @roomok=count(*) from dbo.Room_Time_Map where RoomID=@room and TimeID=@time
19
20 if @classok + @teacherok + @roomok + @classrecok = 0
21 begin
22 insert into dbo.Class_Time_Map values(@time,@class)23 insert into dbo.Class_Course_Rec_Map values(@class,@course)24 insert into dbo.Teacher_Time_Map values(@teacher,@time)25 insert into dbo.Room_Time_Map values(@room,@time)26 insert into dbo.Plans values(@course,@room,@class,@teacher,@time)27 end
28
29 delete fromdbo.TempPlans30 where CourseID=@course and RoomID=@room and ClassID=@class and TeacherID=@teacher and TimeID=@time
31
32
33 end
最终的结果条数应该与Class_Course_Map中的条数是一致的,因为我们假设每个课程每个班只上一次。经检测,实现了预想的效果,只是系统会尽少地完成安排,也就是说,系统会使用尽量少的教室安排课程,5个教室,只使用了3个。当然这些可以通过增加筛选条件加以避免。总的排课策略是对的。
文章最后解决前面提到的一个问题:系统假设每门课程,每个班只上一次,这完全不满足现实需要。例如,大学的英语,每周要上三次之多。其实这个很好解决,可以把英语看作三个不同的课程,命名为英语1、英语2、英语3,这样对于上课多于一次的课程只要修改输入表:课程、班级课程对应表、教室课程对应表就可以了,并不需要修改系统。
自动排课算法核心java代码怎么实现的?点击自动排课按代码实现的?_用SQL实现的一个自动排课机制...相关推荐
- html页面点击小图弹出大图代码,利用JS实现点击小图弹出大图代码
特效描述:利用JS实现 点击小图 弹出大图代码.利用JS实现点击小图弹出大图代码 代码结构 1. HTML代码 (function(){ var LightBox = function(options ...
- python自动聊天机器人_用python实现的一个自动聊天的机器人
因为之前想过 如果每天早上微信能够发送天气预报给我,给我老婆多好,然后就动手看网上的教程做了一个可以定时发送天气预报的程序, 最近又想到折腾,做了一个更加详细的版本.但是需要主动操作 具体操作看图. ...
- python自动投注软件_能帮我开发一个自动投注的脚本吗?
python写的自动投注脚本(SSC) #coding:utf-8 import time from selenium import webdriver from selenium.webdriver ...
- 《自动驾驶感知算法实战专栏(源代码)》专栏概述
导言 自动驾驶太火?高薪?跃跃欲试,又仅存于想的阶段.动起来,只是看理论,却总也学不会?看不懂,又总没有进度?如果你也有这类问题,那你来看看这个专栏.以实际项目为导向,亲自动手实践,从简单的图像分类. ...
- 请用java写教务系统的排课算法
写排课算法有很多种方法,下面给出一种基于贪心算法的实现方法. 首先,要获取所有课程.教室.教师.时间等相关信息,将其存储在程序中. 然后,可以通过以下步骤实现排课: 选择一门课程: 遍历所有的教室,找 ...
- 基于遗传算法的排课算法思路
摘自毕业论文<基于微服务的智能教学质量管理平台的设计与实现> (1)问题描述 课程编排(排课)是平台的核心功能.排课问题被国外专家证明为属于NP完全问题,本质是求出满足一定软硬约束下的教学 ...
- (2)Hadoop核心 -- java代码对MapReduce的例子1
案例一:wordcount字数统计功能 1.1 先准备两个txt文件,并上传到hdfs上 test1.txt hello zhangsan lisi nihao hai zhangsan nihao ...
- 通用高校排课算法研究----前言
1 绪 论 1.1课题背景与研究意义 1.2课题的应用领域 1.3 课题的现状 1.4解决NP问题的几种算法及其比较 2 目前流行的几种排课算法的介绍 2.1. 自动排课算法 2.2 基于优先 ...
- 一款没有排课算法的《陈老师排课软件》
一.当前流行的排课软件都是采用排课算法进行排课 有排课算法的软件大致排课流程: 1.设置每天上午.下午的排课节数,一个周期的上课的天数,一般是分别是五.六.七天. 2.设置开课的班级号.班级数.学校名 ...
最新文章
- 发条js调试工具_小工具大帮手,利用 @open-node/antman 实现 node.js 进程线上调试,无须重启...
- CF401D Roman and Numbers
- STM32 RTC BKP备份数据区数据丢失问题的讨论
- Python代码:数字图像处理(DIP)7.1.1图像金字塔example7.1
- Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法
- 编程方法学25:设计实用社交网络
- python发红包问题_一个关于红包的问题引发的python算法初体验
- windows下 wgl 创建渲染上下文步骤
- swift5以上版本的代理的实现,详细教你书写代理
- mysql utf8存不了中文乱码_MySQL怎么存文本不乱码?
- PostgresException: 42883: function ifnull(integer, integer) does not exist
- Linux -- Reactor
- csgo降低延迟指令_ILP——指令级并行
- C#环境下利用VS2017使用MapXtreme7.0.0开发桌面应用实例
- SSH框架的工作原理
- 贝叶斯公式理解与应用
- Assimp库中文文档
- 3322的动态域名申请设置
- 超链接中 utm_source, utm_medium 等参数的含义是什么?
- TF标准模型TensorFlow Mobile for Android