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

 

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

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

<!--[if !supportLists]-->1.<!--[endif]-->算法流程图                   

 

<!--[if !vml]--><!--[endif]-->

 

<!--[if !supportLists]-->2.<!--[endif]-->算法的伪代码描述

           输入:教师(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>*):擦除前面步骤在排课班、教师、班级、教室中写下的数据

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

转载于:https://www.cnblogs.com/yundesme/archive/2007/03/01/660807.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值