3 基于时间片优先级排课算法描述与分析

排课问题实质上是时间、教师、班级、教室、课程这五维关系的冲突问题,要合理的解决这个问题首先要了解排课中的一些基本原则以及排课的一些基本要求。

3.1排课中的基本原则

在课程的编排中应遵循一定的规则, 只有按照基本规则来进行课程的编排才能够减少冲突的发生, 这些基本规则主要有以下几条:

1) 同一班级的学生在同一时间(某些特定的选修课时间除外) 不能安排两门课程

2) 同一教师在同一时间不能安排两门课程

3) 同一教室在同一时间不能安排两门课程

4) 同一时间安排的课程总数不能大于所能提供的教室总数

5) 某一课程参加学习的总人数不应大于所安排教室的座位数

6) 所提供教室的属性与课程所需教室的属性一致

在时间、教师、班级、教室、课程这五维关系中, 时间、教师、班级三者之间存在着紧密关系。相对而言, 教室与它们关系就不那么密切。

3.2排课的基本要求

课程的安排不是任意的, 为了达到最好的教学效果应遵循一定的要求。这些要求主要有:

1) 要尽量为所排课程安排上该类课效果最好的时间

2) 课程在一周上多次时, 要有一定的间隔性

3) 公共课等涉及面广、学时多的课程应优先处理

4) 对同一教师, 同一上课对象应尽量选择相对固定的几个教室

5) 对同一个班级的课程应选择相对固定的教室

6) 连着的课的教室选择不应相隔太远

7)同一天有几门课时尽量把课分散

8) 优先满足一些特殊要求(比如有些教室喜欢上上午的课,可以优先满足)

3.3基于时间片优先级排课算法描述

在描述算法之前我们把一些概念先讲清楚。在这里我们把从行政角度分的班叫自然班,把在同一个教室上课的班叫做排课班。在大学里有些公共课是几个排课班通过多媒体来一起上的,我们把这个排课班的总和叫做公共班。班级、教室、教师、课程都维护着自己的一张课表。对课表的每个表元(如星期一的第一节课)在这里称做时间片。

基于时间片优先级排课算法以排课班为单位,围绕着各对像(自然班、教室、教室)的时间表选择合适的时间片。

1.算法流程图

2.算法的伪代码描述

输入:教师(teacher1,teacher2,…………….teachern)

教室(room1,room2,…………………roomn)

班级(class1,class2,………………….classn)

课程(course1,course2,………………coursen)

各教师、教室、班级、课程时间片的优先级

排课班(schudel_class1,schudel_class2………schudel_classn)

输出:已经排好课表的教师、教室、班级

Procedure schudeling(teacher,room,class,course,schudel_class,public_class)

//初始化一张空的时间表,对该时间表的每个时间片的优//先级初始化为高级

Init Time_table

//对排课班进行处理

For every schudel_class do:

If(!Check_Have_despose(schudel_class)) //假如该排课班尚未排课

Begin:

Time_table=Time_table & get_all_class_time_table(schudel_class)

Time_table=Time_table & get_room(schudel_class);

Time_table=Time_table & get_teacher(schudel_class);

Course=get_course(schudel_class);

//假设只有两节连堂及三节连堂那种课

Int iCount2=0;//那门课两节连堂的次数

Int iCount3=0;//那门课三节连堂的次数

//得到课程每周的课时数

Int course_count=get_couse_count(Course);

//得到每周的连课情况

Parse_couse_count(course_count,&iCount2,&iCount3);

//根据iCount2,iCount3,以及Time_table为该排课班选择N个

//(N=iCount2+iCount3)适当的时间片,保存在CPoint变量中

CPoint po;

LList<CPoint>* cp

Int priority[7]=0;

//得到每天的优先级的总和

Loop:I=0 until I=6 do:

Loop: J=0 until J=6 do:

Begin:

Priority[I] =Priority[I]+ Time_table.time_piece[I][j]

End Begin

//得到优先级总和最大的那天,我们认为那一时间最闲

//适宜安排课程

int number=get_number(priority[7]);

BOOL fail

While iCount2>0 do:

Begin:

fail=Get_Time_Pieces(2,&number,po);

if(!fail) then do

begin:

iCount2--;

cp->append_list(po);

end begin

else

break;

End Begin

While iCount3>0 do:

Begin:

fail=Get_Time_Pieces(3,&number,po);

if(!fail) then do:

begin:

ICount3--;

Cp->append_list(po);

End begin

Else

Break;

End Begin

//根据*cp的数据及schudel_class的数据对schudel_class中的自然班,所得到的教室,

// 老师的课表进行回写

if(!fail) do

WriteBack(schudel_class,cp);

Else then

RollBack(schudel_class,cp);//把先前选好的教室,老师给”擦除”掉

End Begin

End Schudeling

算法里面有到的一些函数解释:

BOOL check_for_dispose(schudel_class):以排课班为参数,判断该排课班是否已经排好课,排好了返回treu,否则返回false

‘&’操作:该操作是对两个课表的运算,返回一个新课表;得到的课表的时间片为所运算的课表对应时间片的较小值

CTime_table& get_all_class_time(schudel_class):以排课班为参数,得到该排课班所有自然班课表的&,返回得到的新课表

CTime_table& get_room(schudel_class):以排课班为参数,为该排课分配所有合适的教室,并把所得到的教室的课表求&,返回新课表

CTime_table& get_teacher(schudel_class):以排课班为参数,为该排课班选择一合适的教师,并返回该教师的课表

Ccourse get_course(schudel_class):以排课班为参数,得到该排课班的课程,并返回之

Int get_course_count(Ccourse):以课程为参数,得到该课程每周所需上的课时数,并返回之

Parse_course_count(int&,int&,int&):分析get_course_count所返回的数值,把该数值以2节连堂和3节连堂分开(在这里假设只有2节连堂和3节连堂两种情况)

Int GetNumber(int*):传进一整型数组,得到该整型数组中的最大值的下标,并返回之

WriteBack(schudel_class,Llist<CPoint>*):根据Llist<CPoint>* 中的时间片值,更新public_class中的教师,班级,教室的时间表信息

RollBack(schudel_class,Llist<CPoint>*):擦除前面步骤在排课班、教师、班级、教室中写下的数据

计算机排课是个复杂的过程,在数据量大,约束条件多的条件下,通过人工干涉达到合理排课是非常重要的。人工干涉包括在排课前的一些数据输入工作,人工进行些预排课,排完课后对课表进行适当的调课。

3.4算法分析

此算法属于贪心算法。每次对教师、教室资源的选取都是取当前最优的数据。此算法对按照教师、教室、班级的优先级取最优值,所以对各对象的一些特殊要求会很明显的体现出来,在教师、教室资源不紧缺的情况下,此算法能排出相对合理的课程。相对于上一章介绍的两个算法,在处理各种特殊要求的能力上有明显的优势。

参 考 资 料

参考网站:

http://www.csdn.net

http://www.vckbase.com

http://www.codeproject.com

http://lib.hnu.net.cn

参考文献:

[1] “An Average Case Approximation Bound for Course Scheduling by Greedy Bipartite Matching” Gary Lewandowski1, Prakash Ojha2, Jennifer Rizzo1, and Abigail Walker1 Xavier University, Mathematics and Computer Science Department

[2] “ A column generation scheme for faculty time-tabling “ Paolo Sera.ni, University of Udine, Italy

[3] Timetabling using a Steady State Genetic Algorithm Ender Ozcan, Alpay Alkan

Yeditepe University Department of Computer Engineering,

[4] 基于优先级自动排课算法PCSA 的设计与实现方案 陈 谊,  杨 怡,  张国龙,  王尚忠 北京工商大学计算机学院

[5] 基于课元相关运算的高校排课算法董艳云  钱晓群  张宇舒 西南交通大学

[6] 《Visual C++.NET宝典》Tom Archer ,Andrew Whitechapel编著,电子工业出版社

[7] 《Visual C++ 6.0 网络及Interner 开发指南》 李博轩 著 清华大学出版社2000

[8] 《Visual C++6.0 项目案例导航》 扬小平 著 科学出版社

[9] 《学用Visual C++6 .0》 [美]Davis Chapman 著 骆长乐 译 清华大学出版社 西蒙与舒斯特国际出版公司

[6] 《数据库系统概念》 [美] Abraham Silberschatz Henry F.Korth 著 机械工业出版社

通用高校排课算法研究----3.基于时间片优先级排课算法相关推荐

  1. 基于时间片优先级排课算法描述

    在描述算法之前我们把一些概念先讲清楚.在这里我们把从行政角度分的班叫自然班,把在同一个教室上课的班叫做排课班.在大学里有些公共课是几个排课班通过多媒体来一起上的,我们把这个排课班的总和叫做公共班.班级 ...

  2. 三维图形几何变换算法实验_基于深度学习的三维重建算法综述

    点击上方"计算机视觉life",选择"星标" 快速获得最新干货 00 前言 目前,三维重建技术已在游戏.电影.测绘.定位.导航.自动驾驶.VR/AR.工业制造以 ...

  3. 清华大学开源迁移学习算法库:基于PyTorch实现已有算法

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...

  4. 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...

    本发明属于机器人路径规划领域,提出一种基于地图栅格与QPSO结合的机器人路径规划方法. 背景技术: 移动机器人路径规划是寻找一条无碰撞的可行路径问题的方法.近些年,群智能优化算法逐渐成为移动机器人路径 ...

  5. rrt算法流程图_基于RRT的运动规划算法综述

    基于 RRT 的运动规划算法综述 1. 介绍 在过去的十多年中, 机器人的运动规划问题已经收到了大量的关注, 因为机器人开始成 为现代工业和日常生活的重要组成部分. 最早的运动规划的问题只是考虑如何移 ...

  6. 推荐算法概述(基于用户的协同过滤算法、基于物品的协同过滤算法、基于内容的推荐算法)

    "无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程." 目前推 ...

  7. AI算法和笔记 | 基于深度学习和传统算法的人体姿态估计

    点击蓝色"AI专栏"关注我哟 选择"星标",重磅干货,第一时间送达 这是站长的第 41 篇原创优质长文, 前几天站长写的一篇的文章[基于深度学习算法和传统立体匹 ...

  8. 连通域最小外接矩形算法原理_基于分割的文本检测算法之PSENet/PAN/DBNet

    1. 文本检测难点 文本内包含文本,艺术字体,任意方向 ,曲线文字 ,多语言,其他环境因素等是文本检测中的难点 2. 分割 问题1: 语义分割模型是对pixel进行分类,所以理论上讲,可以检测不规则的 ...

  9. m低信噪比下GPS信号的捕获算法研究,分别使用matlab和FPGA对算法进行仿真和硬件实现

    目录 1.算法概述 2.仿真效果预览 3.MATLAB/FPGA部分代码预览 4.完整MATLAB/FPGA程序 1.算法概述 GPS卫星发送的信号一般由3个分量组成:载波.伪码和导航电文,其中伪码和 ...

最新文章

  1. 解决Unity中新导入了C#文件在vs打开一直都是杂项文件的问题
  2. jQuery对象与DOM对象的相互转化
  3. Python学习笔记整理(十五)类的编写细节
  4. [Jarvis OJ - PWN]——[XMAN]level2(x64)
  5. python输出不重复的单词_Python情感分析(比较单词时,不计算文本中重复的单词)...
  6. 【肥朝】从一次问题讨论聊聊我对阅读源码的思考
  7. dll文件保存到服务器,dll是什么文件?dll文件怎么打开?
  8. html制作排班表模板,你会制作排班表吗?手把手教你用Word制作!分分钟搞定!...
  9. 【模块学习】关于磁力计HMC5883L型号探索
  10. linux 查看IP地址
  11. 【LTE学习日记01】子载波功率与信道功率的换算
  12. 当你开始听不清这个世界的声音
  13. 微信小程序入门---01
  14. Win10 出现恢复,无法加载操作系统,关键系统驱动程序丢失或错误 蓝屏错误代码0xc000007b
  15. 语义解析Parser用户手册
  16. 人工智能前沿——玩转OpenAI聊天机器人ChatGPT(中文版)
  17. 面试必练:50道经典SQL练习
  18. Matlab R2019b[破]安装教程
  19. 澳门惊现Google地图街景车
  20. 最适合微商的直播平台——微信直播

热门文章

  1. 河北四方承建大数据中心
  2. 6000左右的台式机电脑和笔记本电脑配置清单
  3. linux 测试端口通不通(四种方法)
  4. 服务器拦截图片格式文件,真正可用的IIS的ISAPI-Rewrite伪静态URL图片防盗链规则写法...
  5. 实战| 一行命令对你的图像视频进行风格迁移
  6. iOS 查漏补缺 - PerformSelector
  7. 53784-29-5,2,3,4,6-Tetra-O-acetyl-α-D-mannopyranosyl Azide
  8. java的定时器不能提供实时保证_Spring Boot 2 整合 QuartJob 实现定时器实时管理功能...
  9. 化学应用软件经典之经典--ChemOffice
  10. mysql 开启 远程连接