论文部分内容阅读
摘 要:目前学分制选课在我国各高校普遍采用,本文结合浙江大学的选课管理实践,对基于多志愿多级优先权的选课方法进行了研究,取得了良好的实施效果。问题具有一定的代表性,措施具有一定的通用性,适合国内其他高校教务管理部门参考。
关键词:学分制;选课方式;筛选
中图分类号:G642.42文献标识码:B文章编号:1673-8454(2011)15-0028-04
学分制是近几年来高校教学改革的重点和热点,它以学分作为计量学生学习量的单位,以学生取得必要的最低学分为毕业标准。学分制一般以选课的方式来实施,即在规定范围内学生对所开课程有一定的选择自由,包括自主选择课程、教师、上课时间,选择适合的学习量和学习进程,也可以根据自己的能力、需要、兴趣来选择自己希望学习的课程。因此一个设计良好的选课方案是选课制的基础,而其中的选课筛选方法则是关键。本文以浙江大学为例研究选课的科学方法。
一、选课方式的选择
国内高校采用的选课方式多种多样,主要有“先到先得”、“先报名后筛选”、“投币法”等等。有的高校只采用其中一种,也有的高校同时采用多种。下面先来看看这几种选课方式的优缺点。
1.先到先得
即根据教学班的容量限定选课人数,只要在选课操作的时间点上选课人数未达到教学班容量就可以立刻选上,无需等待;一旦某个教学班选满了可以马上另外选择其他未满的教学班,节省了选课时间。但是缺点比较多,一是学生选课时间非常集中,在选课开始阶段对服务器的配置和网络的畅通要求很高,否则容易导致服务器瘫痪和网络堵塞。二是一旦学生在选课开始时由于各种各样的原因不能选课,就会错失选课的先机。三是如果允许选课、退课同时操作,会带来私下交换选课的问题,即两个学生事先约好某个时间,一人退课而另一人马上选课。四是无法区分不同专业、不同类型的学生选课的优先权。这种方式比较适合公选课的选课或者必修课后面几轮的选课。
2.先报名后筛选
即先任意报名,每个教学班不限报名人数,不分报名时间先后,报名结束后再根据一定的优先原则进行筛选,选中的人数不能超过教学班的容量。这种方式下学生只要在报名的期限内,就可以自由选择何时去报名,筛选选中的几率和报名时间无关,不会发生报名时间过于集中的情况,服务器和网络的压力比较小。但是也有缺点,一是学生需要等待筛选的结果才能确定是否选上,不宜在开始上课后进行,否则有可能很多待定的学生都去听课而导致教室拥挤。二是筛选不中不能马上改报其他教学班,而必须等到下一轮的报名,需要花费较多的时间在选课上才能完成所有课程的选课。这种方式比较适合前几轮的选课,特别是必修课的选课。
3.“投币法”
又称“押注法”,即每个学生分配到一定数量的选课币,个人根据自己偏好,报名的同时对每门课程的教学班投注一定数量的选课币,谁投币多谁就先选上。为了防止出现孤注一掷的情况,可以设置投币的上限;为了防止先投币吃亏、后投币占便宜的情况,投币时教学班的已投币情况不公开。报名结束后根据每个学生投币多少排序,多者先选上。这种方式的优点是处理起来简单快捷,不需要做大范围的筛选,缺点是即使大量投币也不一定保证选上,也不宜在开始上课后进行,没投中的仍需等到下一轮再投其他教学班。另外也难以体现不同专业、不同类型学生选课的优先权,不太适合必修课的选课。
由此可见,这三种选课方式各有各的优缺点,没有一种是十全十美的。浙江大学最初从2002年开始学分制选课,采用的是“先报名后筛选”和“先到先得”的混合方式。前几轮选课采用前者,后几轮选课采用后者。这样做的目的是想充分利用两种选课方式的优点,弥补二者的缺点。前几轮选课在筛选时利用优先权尽量保证学生选上本专业的课程,后几轮选课采取“先到先得”方式。因为在选课后期,一方面大多数学生的大部分课程都已经选上,而且限制退选前几轮已经选上的课程,因此只有个别学生或少部分课程需要补选;另一方面可供选课的余量也不多,不是很有必要再搞筛选,一步到位更能节省时间、提高效率。
另一方面,为了提高“先报名后筛选”这种选课方式的效率,提高选课的命中率,我们引入了多志愿报名办法,把“先报名后筛选”的选课方式改为“先多志愿报名后筛选”。这种方式就是在选课报名时,允许同一门课程选择两个以上的教学班报名,并根据自己意愿排序。不同志愿的教学班上课时间可以相同,也可以不同。报名结束后,遵循所有的包括志愿次序在内的优先原则进行筛选。
二、筛选算法的分析
筛选处理是筛选类选课方式的关键,学生报名后能不能有个公平、合理的筛选结果是衡量筛选算法好坏的一个标准。对必修课程和选修课程的筛选处理是不同的,前者比后者要复杂,因此我们仅针对必修课程的筛选算法进行分析。
课程教学班的筛选不能完全随机进行,必须考虑很多的优先权,包括静态优先权和动态优先权。静态优先权是指在筛选过程中优先权和已选课程无关,始终保持不变,例如专业优先权、年级优先权、预选优先权、志愿优先权等等。我们把所有需要涉及的静态优先权按照重要程度排序,假设是按“专业>志愿>年级>预选”的顺序,本专业为“1”,跨专业为“0”;志愿按“3”、“2”、“1”从大到小排序;年级优先简化,高年级为“1”、低年级为“0”;预选的为“1”、未预选的为“0”。总共优先权的组合有24个,如下表所示:
如果多志愿是平行的,筛选可简单地按这四个优先权组合的顺序进行,具体步骤如下:
首先,先看符合表中次序1优先权组合条件的学生选课人数,如果大于教学班容量,那么随机筛选,选中的学生入选该教学班,同时要删除他们的其他志愿,处理结束;如果小于教学班容量,那么这部分学生全部入选,同时删除他们的其他志愿,继续下一步处理。
其次,看符合表中次序2优先权组合条件的学生选课人数,如果大于教学班余量,那么随机筛选,选中的学生入选该教学班,同时要删除他们的其他志愿,处理结束;如果小于教学班余量,那么这部分学生全部入选,同时删除他们的其他志愿,继续下一步处理。
接着,继续按表中3~24的次序重复第二步的处理,处理当中只要出现余量为零就结束处理。
单个教学班筛选的C语言算法简单表达如下:
iRemainder = Class_Capacity;
for (iSP=1 ;iSP>-1;iSP--) //专业优先循环
for (iCP=3;iCP>0;iCP--) //志愿顺序循环
for (iGP=1;iGP>-1;iGP--) //高低年级循环
for (iPP=1;iPP>-1;iPP--) //预选优先循环
{
sStudent=GetMCS(iSP,iCP,iGP,iPP);
//符合优先权组合的学生
nStudent=CountStudent(sStudent);
//符合优先权组合的学生数
if (nStudent> iRemainder)
//符合条件的学生数超过容量或余量
{
SelectAllStudent(sStudent);
iRemainder = iRemainder -nStudent;
//余量更新
}
else
{
sStudent=Draw(sStudent,r); //筛选
goto ProcessFinished; //结束处理
}
}
ProcessFinished:;
处理中一旦学生入选,其他志愿都删除,不再参加后续的处理。实际上,多志愿不是平行的,如果按上述方法筛选,对于某个学生,他的低志愿有可能先被选中,导致他的高志愿被删除而失去了筛选的机会,这显然不合理。正确的做法是一门课程所有教学班的高志愿先筛选,低志愿后筛选。这样就不能简单地按四个静态优先权组合的顺序筛选,相同课程的所有教学班必须根据志愿优先权的不同进行多次循环处理。具体步骤改为如下:
第一,同门课程的每个教学班,针对本专业学生第一志愿的处理方法:
(1)比较本专业、第一志愿学生的选课人数和余量,如果前者小于后者,这部分学生全部入选,该教学班处理结束;如果前者大于后者,进入第(2)步处理。
(2)比较本专业、第一志愿、高年级学生的选课人数和余量,如果前者小于后者,这部分学生全部入选,再进入第(4)步处理;如果前者大于后者,进入第(3)步处理。
(3)比较本专业、第一志愿、高年级、有预选学生的选课人数和余量,如果前者小于后者,这部分学生全部入选,再进入第(5)步处理;如果前者大于后者,随机筛选,该教学班处理结束。
(4)比较本专业、第一志愿、低年级学生的选课人数和余量,如果前者小于后者,则部分学生全部入选,该教学班处理结束;如果前者大于后者,进入第(6)步处理。
(5)根据余量在本专业、第一志愿、高年级、未预选的学生中随机筛选,该教学班处理结束。
(6)根据余量在本专业、第一志愿、低年级、未预选的学生中随机筛选,该教学班处理结束。
注意,一旦学生入选,其余低志愿都删除,不再参加后续的处理。
第二,同门课程的每个教学班,针对本专业学生的第二志愿,按第一个步骤处理一遍。
第三,同门课程的每个教学班,针对本专业学生的第三志愿,按第一个步骤处理一遍。
第四,同门课程的每个教学班,针对非本专业学生的第一、二、三志愿,都按第一个步骤各处理一遍。
针对某门课程所有教学班筛选的C语言算法表达如下:
for (iSP=1 ;iSP>-1;iSP--) //专业优先循环
for (iCP=3;iCP>0;iCP--) //志愿优先循环
for (iClassNumber=1;i<=ClassMax;i ) //教学班循环
{
iRemainder=GetRemainder(ClassList[iClassNumber]);
if (iRemainder ==0) continue;
//无余量的教学班跳过不处理
for (iGP=1;iGP>-1;iGP--) //高低年级循环
for (iPP=1;iPP>-1;iPP--) //有无预选循环
{
sStudent=GetMCS(ClassList[iClassNumber], iSP,iCP,,iGP,iPP);
//符合优先权组合的学生
nStudent=CountStudent(sStudent);
//符合优先权组合的学生数
if (nStudent<= ClassList[iClassNumber].Remainder)
//符合条件的学生数小于余量
{
SelectAllStudent(sStudent);
//符合条件的学生都入选
iRemainder = iRemainder -nStudent;
//更新余量
}
else //符合条件的学生数超过余量
{
sStudent=Draw(sStudent, ClassList[iClassNumber].Remainder);
//随机筛选
SelectAllStudent(sStudent);
iRemainder =0; //余量变零
goto ProcessFinished; //该教学班结束处理
}
}
ProcessFinished: ;
SetRemainder(ClassList[iClassNumber], iRemainder);
//更新该教学班余量
}
上述筛选方法基于单独考虑选一门课程的条件,从公平性角度来看还是可行的。但是如果是多门选课,由于存在着随机概率的不确定因素,很可能会产生筛选结果的不合理性、不均匀性,即所有优先权都相同的情况下,有的学生选中了很多门课程,而有的学生则选中了很少;有的学生选中的课程大多是高志愿的,而有的学生大多是低志愿的。这主要是因为不同课程之间的筛选无关联性造成的。为了减少选课的不平衡性,可增加“已选课程门数”和“平均选中志愿”两个动态优先权,并且假设前者的影响超过后者。
筛选过程中两个动态优先权的处理算法如下:
iMaxSCC=FindMaxSCC(sStudent); //取已选课程门数最大值
for (iSCC=0 ;iSCC<=iMaxSCC;iSCC ) //已选课程门数循环
{
tmp_sStudent=GetMSCCS(sStudent);
//符合当前已选课程门数的学生
tmp_nStudent=CountStudent(tmp_sStudent);
if (tmp_nStudent>0)
if (tmp_nStudent<=iRemainder)
//如果人数大于零且小于余量
{
SelectAllStudent(tmp_sStudent); //入选
iRemainder=iRemainder-tmp_nStudent; //余量更新
SCCAdd1(tmp_sStudent); //已选门数加一
RecountASC(tmp_sStudent,iCP);
//重新统计已选平均志愿
}
else
{
SortByASC((tmp_sStudent);
//按已选平均志愿值从小到大排序
fASC=tmp_sStudent[iRemainder];
//取第iRemaind个学生的平均志愿值
for (i=1;i<=iRemainder;i )
{
if (tmp_sStudent[i]==fASC) break;
SelectStudent(tmp_sStudent[i]);
iRemainder=iRemainder-1;
}
if (iRemainder>0)
{
tmp_sStudent= GetMASC(tmp_sStudent, fASC);
tmp_sStudent =Draw((tmp_sStudent, iRemainder);
//随机筛选
SelectAllStudent(tmp_sStudent);
iRemainder=0;
SCCAdd1(tmp_sStudent);
RecountASC(tmp_sStudent,iCP);
}
}
}
三、选课效果
按照本文的选课方法,选课效果可以得到很大改善。浙江大学通过多年来的选课实践,多志愿选课方式保证了第一轮的选课命中率平均在70%左右,大大高于单志愿选课方式(不足50%),节约了学生的选课时间;基于多级优先权组合的筛选处理方法保证了第一轮90%以上的学生选课命中率在60%~80%之间,保证了选课结果分布的均衡性,基本上不再有极端选课结果的情况发生。
本文阐述的选课方法是基于对浙江大学学生的培养特点、教学资源条件的研究而设计的,目的是为了在学分制条件下尽可能给予学生较大的选择自由权,这是我国高校实施学分制教学管理的重要内容之一,也是高校学生培养模式改革的方向。?筅(编辑:金冉)
关键词:学分制;选课方式;筛选
中图分类号:G642.42文献标识码:B文章编号:1673-8454(2011)15-0028-04
学分制是近几年来高校教学改革的重点和热点,它以学分作为计量学生学习量的单位,以学生取得必要的最低学分为毕业标准。学分制一般以选课的方式来实施,即在规定范围内学生对所开课程有一定的选择自由,包括自主选择课程、教师、上课时间,选择适合的学习量和学习进程,也可以根据自己的能力、需要、兴趣来选择自己希望学习的课程。因此一个设计良好的选课方案是选课制的基础,而其中的选课筛选方法则是关键。本文以浙江大学为例研究选课的科学方法。
一、选课方式的选择
国内高校采用的选课方式多种多样,主要有“先到先得”、“先报名后筛选”、“投币法”等等。有的高校只采用其中一种,也有的高校同时采用多种。下面先来看看这几种选课方式的优缺点。
1.先到先得
即根据教学班的容量限定选课人数,只要在选课操作的时间点上选课人数未达到教学班容量就可以立刻选上,无需等待;一旦某个教学班选满了可以马上另外选择其他未满的教学班,节省了选课时间。但是缺点比较多,一是学生选课时间非常集中,在选课开始阶段对服务器的配置和网络的畅通要求很高,否则容易导致服务器瘫痪和网络堵塞。二是一旦学生在选课开始时由于各种各样的原因不能选课,就会错失选课的先机。三是如果允许选课、退课同时操作,会带来私下交换选课的问题,即两个学生事先约好某个时间,一人退课而另一人马上选课。四是无法区分不同专业、不同类型的学生选课的优先权。这种方式比较适合公选课的选课或者必修课后面几轮的选课。
2.先报名后筛选
即先任意报名,每个教学班不限报名人数,不分报名时间先后,报名结束后再根据一定的优先原则进行筛选,选中的人数不能超过教学班的容量。这种方式下学生只要在报名的期限内,就可以自由选择何时去报名,筛选选中的几率和报名时间无关,不会发生报名时间过于集中的情况,服务器和网络的压力比较小。但是也有缺点,一是学生需要等待筛选的结果才能确定是否选上,不宜在开始上课后进行,否则有可能很多待定的学生都去听课而导致教室拥挤。二是筛选不中不能马上改报其他教学班,而必须等到下一轮的报名,需要花费较多的时间在选课上才能完成所有课程的选课。这种方式比较适合前几轮的选课,特别是必修课的选课。
3.“投币法”
又称“押注法”,即每个学生分配到一定数量的选课币,个人根据自己偏好,报名的同时对每门课程的教学班投注一定数量的选课币,谁投币多谁就先选上。为了防止出现孤注一掷的情况,可以设置投币的上限;为了防止先投币吃亏、后投币占便宜的情况,投币时教学班的已投币情况不公开。报名结束后根据每个学生投币多少排序,多者先选上。这种方式的优点是处理起来简单快捷,不需要做大范围的筛选,缺点是即使大量投币也不一定保证选上,也不宜在开始上课后进行,没投中的仍需等到下一轮再投其他教学班。另外也难以体现不同专业、不同类型学生选课的优先权,不太适合必修课的选课。
由此可见,这三种选课方式各有各的优缺点,没有一种是十全十美的。浙江大学最初从2002年开始学分制选课,采用的是“先报名后筛选”和“先到先得”的混合方式。前几轮选课采用前者,后几轮选课采用后者。这样做的目的是想充分利用两种选课方式的优点,弥补二者的缺点。前几轮选课在筛选时利用优先权尽量保证学生选上本专业的课程,后几轮选课采取“先到先得”方式。因为在选课后期,一方面大多数学生的大部分课程都已经选上,而且限制退选前几轮已经选上的课程,因此只有个别学生或少部分课程需要补选;另一方面可供选课的余量也不多,不是很有必要再搞筛选,一步到位更能节省时间、提高效率。
另一方面,为了提高“先报名后筛选”这种选课方式的效率,提高选课的命中率,我们引入了多志愿报名办法,把“先报名后筛选”的选课方式改为“先多志愿报名后筛选”。这种方式就是在选课报名时,允许同一门课程选择两个以上的教学班报名,并根据自己意愿排序。不同志愿的教学班上课时间可以相同,也可以不同。报名结束后,遵循所有的包括志愿次序在内的优先原则进行筛选。
二、筛选算法的分析
筛选处理是筛选类选课方式的关键,学生报名后能不能有个公平、合理的筛选结果是衡量筛选算法好坏的一个标准。对必修课程和选修课程的筛选处理是不同的,前者比后者要复杂,因此我们仅针对必修课程的筛选算法进行分析。
课程教学班的筛选不能完全随机进行,必须考虑很多的优先权,包括静态优先权和动态优先权。静态优先权是指在筛选过程中优先权和已选课程无关,始终保持不变,例如专业优先权、年级优先权、预选优先权、志愿优先权等等。我们把所有需要涉及的静态优先权按照重要程度排序,假设是按“专业>志愿>年级>预选”的顺序,本专业为“1”,跨专业为“0”;志愿按“3”、“2”、“1”从大到小排序;年级优先简化,高年级为“1”、低年级为“0”;预选的为“1”、未预选的为“0”。总共优先权的组合有24个,如下表所示:
如果多志愿是平行的,筛选可简单地按这四个优先权组合的顺序进行,具体步骤如下:
首先,先看符合表中次序1优先权组合条件的学生选课人数,如果大于教学班容量,那么随机筛选,选中的学生入选该教学班,同时要删除他们的其他志愿,处理结束;如果小于教学班容量,那么这部分学生全部入选,同时删除他们的其他志愿,继续下一步处理。
其次,看符合表中次序2优先权组合条件的学生选课人数,如果大于教学班余量,那么随机筛选,选中的学生入选该教学班,同时要删除他们的其他志愿,处理结束;如果小于教学班余量,那么这部分学生全部入选,同时删除他们的其他志愿,继续下一步处理。
接着,继续按表中3~24的次序重复第二步的处理,处理当中只要出现余量为零就结束处理。
单个教学班筛选的C语言算法简单表达如下:
iRemainder = Class_Capacity;
for (iSP=1 ;iSP>-1;iSP--) //专业优先循环
for (iCP=3;iCP>0;iCP--) //志愿顺序循环
for (iGP=1;iGP>-1;iGP--) //高低年级循环
for (iPP=1;iPP>-1;iPP--) //预选优先循环
{
sStudent=GetMCS(iSP,iCP,iGP,iPP);
//符合优先权组合的学生
nStudent=CountStudent(sStudent);
//符合优先权组合的学生数
if (nStudent> iRemainder)
//符合条件的学生数超过容量或余量
{
SelectAllStudent(sStudent);
iRemainder = iRemainder -nStudent;
//余量更新
}
else
{
sStudent=Draw(sStudent,r); //筛选
goto ProcessFinished; //结束处理
}
}
ProcessFinished:;
处理中一旦学生入选,其他志愿都删除,不再参加后续的处理。实际上,多志愿不是平行的,如果按上述方法筛选,对于某个学生,他的低志愿有可能先被选中,导致他的高志愿被删除而失去了筛选的机会,这显然不合理。正确的做法是一门课程所有教学班的高志愿先筛选,低志愿后筛选。这样就不能简单地按四个静态优先权组合的顺序筛选,相同课程的所有教学班必须根据志愿优先权的不同进行多次循环处理。具体步骤改为如下:
第一,同门课程的每个教学班,针对本专业学生第一志愿的处理方法:
(1)比较本专业、第一志愿学生的选课人数和余量,如果前者小于后者,这部分学生全部入选,该教学班处理结束;如果前者大于后者,进入第(2)步处理。
(2)比较本专业、第一志愿、高年级学生的选课人数和余量,如果前者小于后者,这部分学生全部入选,再进入第(4)步处理;如果前者大于后者,进入第(3)步处理。
(3)比较本专业、第一志愿、高年级、有预选学生的选课人数和余量,如果前者小于后者,这部分学生全部入选,再进入第(5)步处理;如果前者大于后者,随机筛选,该教学班处理结束。
(4)比较本专业、第一志愿、低年级学生的选课人数和余量,如果前者小于后者,则部分学生全部入选,该教学班处理结束;如果前者大于后者,进入第(6)步处理。
(5)根据余量在本专业、第一志愿、高年级、未预选的学生中随机筛选,该教学班处理结束。
(6)根据余量在本专业、第一志愿、低年级、未预选的学生中随机筛选,该教学班处理结束。
注意,一旦学生入选,其余低志愿都删除,不再参加后续的处理。
第二,同门课程的每个教学班,针对本专业学生的第二志愿,按第一个步骤处理一遍。
第三,同门课程的每个教学班,针对本专业学生的第三志愿,按第一个步骤处理一遍。
第四,同门课程的每个教学班,针对非本专业学生的第一、二、三志愿,都按第一个步骤各处理一遍。
针对某门课程所有教学班筛选的C语言算法表达如下:
for (iSP=1 ;iSP>-1;iSP--) //专业优先循环
for (iCP=3;iCP>0;iCP--) //志愿优先循环
for (iClassNumber=1;i<=ClassMax;i ) //教学班循环
{
iRemainder=GetRemainder(ClassList[iClassNumber]);
if (iRemainder ==0) continue;
//无余量的教学班跳过不处理
for (iGP=1;iGP>-1;iGP--) //高低年级循环
for (iPP=1;iPP>-1;iPP--) //有无预选循环
{
sStudent=GetMCS(ClassList[iClassNumber], iSP,iCP,,iGP,iPP);
//符合优先权组合的学生
nStudent=CountStudent(sStudent);
//符合优先权组合的学生数
if (nStudent<= ClassList[iClassNumber].Remainder)
//符合条件的学生数小于余量
{
SelectAllStudent(sStudent);
//符合条件的学生都入选
iRemainder = iRemainder -nStudent;
//更新余量
}
else //符合条件的学生数超过余量
{
sStudent=Draw(sStudent, ClassList[iClassNumber].Remainder);
//随机筛选
SelectAllStudent(sStudent);
iRemainder =0; //余量变零
goto ProcessFinished; //该教学班结束处理
}
}
ProcessFinished: ;
SetRemainder(ClassList[iClassNumber], iRemainder);
//更新该教学班余量
}
上述筛选方法基于单独考虑选一门课程的条件,从公平性角度来看还是可行的。但是如果是多门选课,由于存在着随机概率的不确定因素,很可能会产生筛选结果的不合理性、不均匀性,即所有优先权都相同的情况下,有的学生选中了很多门课程,而有的学生则选中了很少;有的学生选中的课程大多是高志愿的,而有的学生大多是低志愿的。这主要是因为不同课程之间的筛选无关联性造成的。为了减少选课的不平衡性,可增加“已选课程门数”和“平均选中志愿”两个动态优先权,并且假设前者的影响超过后者。
筛选过程中两个动态优先权的处理算法如下:
iMaxSCC=FindMaxSCC(sStudent); //取已选课程门数最大值
for (iSCC=0 ;iSCC<=iMaxSCC;iSCC ) //已选课程门数循环
{
tmp_sStudent=GetMSCCS(sStudent);
//符合当前已选课程门数的学生
tmp_nStudent=CountStudent(tmp_sStudent);
if (tmp_nStudent>0)
if (tmp_nStudent<=iRemainder)
//如果人数大于零且小于余量
{
SelectAllStudent(tmp_sStudent); //入选
iRemainder=iRemainder-tmp_nStudent; //余量更新
SCCAdd1(tmp_sStudent); //已选门数加一
RecountASC(tmp_sStudent,iCP);
//重新统计已选平均志愿
}
else
{
SortByASC((tmp_sStudent);
//按已选平均志愿值从小到大排序
fASC=tmp_sStudent[iRemainder];
//取第iRemaind个学生的平均志愿值
for (i=1;i<=iRemainder;i )
{
if (tmp_sStudent[i]==fASC) break;
SelectStudent(tmp_sStudent[i]);
iRemainder=iRemainder-1;
}
if (iRemainder>0)
{
tmp_sStudent= GetMASC(tmp_sStudent, fASC);
tmp_sStudent =Draw((tmp_sStudent, iRemainder);
//随机筛选
SelectAllStudent(tmp_sStudent);
iRemainder=0;
SCCAdd1(tmp_sStudent);
RecountASC(tmp_sStudent,iCP);
}
}
}
三、选课效果
按照本文的选课方法,选课效果可以得到很大改善。浙江大学通过多年来的选课实践,多志愿选课方式保证了第一轮的选课命中率平均在70%左右,大大高于单志愿选课方式(不足50%),节约了学生的选课时间;基于多级优先权组合的筛选处理方法保证了第一轮90%以上的学生选课命中率在60%~80%之间,保证了选课结果分布的均衡性,基本上不再有极端选课结果的情况发生。
本文阐述的选课方法是基于对浙江大学学生的培养特点、教学资源条件的研究而设计的,目的是为了在学分制条件下尽可能给予学生较大的选择自由权,这是我国高校实施学分制教学管理的重要内容之一,也是高校学生培养模式改革的方向。?筅(编辑:金冉)