同学毕业设计搞的是一个排课系统,具体功能就给课程安排教室和时间。排课算法是有一定难度的,很多老师说过,至今也没有完美的排课算法,的确,排课,是一个五维交叉的复杂体系:时间、课程、教室、班级、学生。一个排好的课表至少要保证以下几点原则:

一个教师同一时间只上一门他要教的课

一个班级同一时间只上一门他要上的课

一个教室同一时间只上一门课

拿到这个问题,刚开始觉得简单,后来仔细分析后,发现难度相当大。关键是其复杂度太高,对待这种问题,我选择排除法。也就是先列出可能的各种组合,再依据约束条件进行排除,最后留下的结果即是所求。

利用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实现的一个自动排课机制...相关推荐

  1. html页面点击小图弹出大图代码,利用JS实现点击小图弹出大图代码

    特效描述:利用JS实现 点击小图 弹出大图代码.利用JS实现点击小图弹出大图代码 代码结构 1. HTML代码 (function(){ var LightBox = function(options ...

  2. python自动聊天机器人_用python实现的一个自动聊天的机器人

    因为之前想过 如果每天早上微信能够发送天气预报给我,给我老婆多好,然后就动手看网上的教程做了一个可以定时发送天气预报的程序, 最近又想到折腾,做了一个更加详细的版本.但是需要主动操作 具体操作看图. ...

  3. python自动投注软件_能帮我开发一个自动投注的脚本吗?

    python写的自动投注脚本(SSC) #coding:utf-8 import time from selenium import webdriver from selenium.webdriver ...

  4. 《自动驾驶感知算法实战专栏(源代码)》专栏概述

    导言 自动驾驶太火?高薪?跃跃欲试,又仅存于想的阶段.动起来,只是看理论,却总也学不会?看不懂,又总没有进度?如果你也有这类问题,那你来看看这个专栏.以实际项目为导向,亲自动手实践,从简单的图像分类. ...

  5. 请用java写教务系统的排课算法

    写排课算法有很多种方法,下面给出一种基于贪心算法的实现方法. 首先,要获取所有课程.教室.教师.时间等相关信息,将其存储在程序中. 然后,可以通过以下步骤实现排课: 选择一门课程: 遍历所有的教室,找 ...

  6. 基于遗传算法的排课算法思路

    摘自毕业论文<基于微服务的智能教学质量管理平台的设计与实现> (1)问题描述 课程编排(排课)是平台的核心功能.排课问题被国外专家证明为属于NP完全问题,本质是求出满足一定软硬约束下的教学 ...

  7. (2)Hadoop核心 -- java代码对MapReduce的例子1

    案例一:wordcount字数统计功能 1.1 先准备两个txt文件,并上传到hdfs上 test1.txt hello zhangsan lisi nihao hai zhangsan nihao ...

  8. 通用高校排课算法研究----前言

    1   绪 论 1.1课题背景与研究意义 1.2课题的应用领域 1.3 课题的现状 1.4解决NP问题的几种算法及其比较 2   目前流行的几种排课算法的介绍 2.1. 自动排课算法 2.2 基于优先 ...

  9. 一款没有排课算法的《陈老师排课软件》

    一.当前流行的排课软件都是采用排课算法进行排课 有排课算法的软件大致排课流程: 1.设置每天上午.下午的排课节数,一个周期的上课的天数,一般是分别是五.六.七天. 2.设置开课的班级号.班级数.学校名 ...

最新文章

  1. 发条js调试工具_小工具大帮手,利用 @open-node/antman 实现 node.js 进程线上调试,无须重启...
  2. CF401D Roman and Numbers
  3. STM32 RTC BKP备份数据区数据丢失问题的讨论
  4. Python代码:数字图像处理(DIP)7.1.1图像金字塔example7.1
  5. Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法
  6. 编程方法学25:设计实用社交网络
  7. python发红包问题_一个关于红包的问题引发的python算法初体验
  8. windows下 wgl 创建渲染上下文步骤
  9. swift5以上版本的代理的实现,详细教你书写代理
  10. mysql utf8存不了中文乱码_MySQL怎么存文本不乱码?
  11. PostgresException: 42883: function ifnull(integer, integer) does not exist
  12. Linux -- Reactor
  13. csgo降低延迟指令_ILP——指令级并行
  14. C#环境下利用VS2017使用MapXtreme7.0.0开发桌面应用实例
  15. SSH框架的工作原理
  16. 贝叶斯公式理解与应用
  17. Assimp库中文文档
  18. 3322的动态域名申请设置
  19. 超链接中 utm_source, utm_medium 等参数的含义是什么?
  20. TF标准模型TensorFlow Mobile for Android

热门文章

  1. DSP F28335不同波特率参数设置
  2. access数据库剔除重复项_如何处理access中重复内容去除?
  3. 长见识了!现在连送快递的都用上大数据了!
  4. FPGA | 时钟问题
  5. 比害时新己50米地面蹦极交吻(组图)
  6. 计算机视觉技术在现代社会中的应用
  7. LWIP学习笔记7——使用 Socket 接口编程
  8. hbase java api 查询_hbase查询api的基本使用
  9. ELO rating system
  10. textarea不可编辑状态