自学考试考场编排尾数组合算法
学业水平考试中座位编排系统的设计与实现

学业水平考试中座位编排系统的设计与实现作者:孙淑娟高洁来源:《内蒙古教育·科研版》2018年第11期摘要:文章分析了学业水平考试考生以及政策要求的特点,针对其特点对学业水平考试座位编排系统的设计思想和实现中的关键技术措施进行了详细的介绍。
关键词:座位编排;数据加密;网络编程;数据库【中图分类号】G 【文献标识码】B 【文章编号】1008-1216(2018)11B-0127-02座位编排是实现考试的一个重要环节,各种类型的考试,座位编排的要求不同。
本文就学业水平考试的特点,将其座位编排的设计与实现做一下详尽的阐述。
一、系统设计(一)学业水平考生特点在学业水平考试中,既有高二年级考生,也有高三年级考生,年级不同,允许选的课程不同。
蒙语授课考生需要考蒙语代替汉语文,朝鲜语授课的考生需要考朝鲜文代替汉语文。
其他科目根据其选择的授课语种,将非汉语的所选课程的试卷翻译成相应语言的试卷,发给对应考生作答。
对于某些科目,上一次没有通过的考生,需要在开考该科目时再次选择相应科目,进行补考。
根据以上说明,可以看出,一次学业水平考试开考的科目,每一科目选择的考生人数不同(包括应考的和补考的)。
参加学业水平考试的考生的另一个特点是,考生均是在校学生,是以就读中学为单位进行报名的。
(二)学业水平考试座位编排系统设计思想座位编排是实现考试的重要环节。
首先需要考虑地域因素。
按照政策要求,哪部分地域(学业水平地域要求为就读中学)的考生可以混编,哪些地域的考生不能混编。
其二,同一考试时间考试科目不同。
比如,同一时间汉语授课考生考一种课程,非汉语授课的要考相应的翻译卷。
其三,因为补考的原因,有的考试时间段的考生数量多,另外考试时间段的考生数量少。
合理安排考生座位,不仅要减少混编科目的考场(一个考场考的科目少、试卷分发简便),又要减少考场的占用(减少投资,因为现在所用的考场均是标准化考场即考场需要配备有一定要求的设备),权衡以上三种因素,使编排结果达到最优,就是该系统设计的最终思想。
考场编排函数

考场编排函数假如A列是学号1,2,3,……,57。
B列是姓名,在C1中输入=rand(),向下拖拽填充柄至57,在C列产生随机数0.5640531560.2264650420.0741012380.792663650.049040850.268217066再按C列排序,A列就是你要的随机安排考试座位号了假定第一行为表头,在适当位置插入"座位号"列,在该列的第二行输入公式:=RAND()将公式向下复制到相应行。
选定公式列,点"复制",在公式列的第一个单元格点鼠标右键,点"选择性粘贴",选中"数值",点"确定"。
将全表按"座位号"列排序,然后在"座位号"列的第二行输入1,按Ctrl+鼠标左键向下填充序号。
前插一列,用函数RAND()生成随机数,填充公式到这列。
然后按照这插入的列排序这个问题与成绩排名没有关系,主要是解决一个考场内,每个学生的前后左右没有自己班的。
可以参照二楼的方法:1.选择你的表格数据区,排序:按班级作为第一条件排序,学生成绩为第二条件排序;2.再依次取数,一个班取一个学生,依次上12个班的第1名,接着取12个班的第2名,又取取12个班的第3名,再取12个班的第4名。
这就是第一考场的48名学生,成绩也是排在前面的,这能保证每个学生前后左右没有自己班的。
3.同样的方法,依次取第个班的第5到第8名,是第二考场的学生;一直到取出所有考场的学生。
这样就能保证每个考场的每个学生的前后左右没有自己班的,而且成绩排在前面的,安排在前面的考场。
根据1排好序的学生,可以用函数自动把每个考场的学生取出来。
其实,不用函数和公式也能办到:加1列,考场列,第一个班第1 名学生的考场是1考场,输入1,以序列方式下拉到48,分到48个考场。
复制这个1~48的序列,粘贴到每个班(12个班粘贴11次)。
考号编写说明(1)

考号、考场编排1.考号编排(1)编排办法:考号统一为8位数。
第一位数为中心校代码,第二、三位为学校代码,第四位为年级代码,第五位、第六位为考场代码,第七、八位为座号代码;实验小学代码为1,中心学校代码为2,航南中心校代码为3,航北中心校代码为4,河东中心校代码为5,张庄中心校代码为6,龙中中心校为7。
学校代码就按照自己学校的名称定,一小代码为01,二小代码为02,十小代码为10,十一小代码为11,十五小代码为15,十六小代码为16,十七小代码为17,十八小代码为18.例如:一小二年级第一考场的3号,应该编辑如下:3 0 1 2 0 1 0 3(座号)(考场代码)(2)张贴方法:每一考场门口必须张贴考场号(第*考场),考场内必须张贴考号,只粘贴考号后四位。
考号从前门开始粘贴,由外到里、由前到后,每列都是小号在前,大号在后。
**教会学生编辑自己的考号,能根据桌子上张贴的四位考号准确找到自己的位置。
并训练学生填写卷头,包括在卷子上填写自己的考号(8位),以便登分时核对。
(年龄小的可以把考号记在一张纸上放进文具袋)2.考场编排考试前一天由各单位集中培训,统一编排考场(每场30人,不超过35人)。
考场按照7、8、8、7或5列、每列7人摆放桌子。
考场外设物品存放处。
学生物品统一摆放在考场外物品存放处,考场务必干净整洁,室内无与考试无关的物品、文字(前后黑板必须擦干净,前黑板只写考试相关信息),桌斗朝前摆放整齐。
桌子必须拉开,两边靠墙,并且注意前后距离。
黑板上写:今天____午考___科目,试卷共____张____页____大题。
提醒学生距离密封线2厘米外答题。
**估计这次卷头是密封线的格式,平时注意训练学生(学校、姓名、考号该怎样填写)。
无论哪种格式的卷头尽量让学生都会填写。
3.考场数计算方法依据每个年级总人数,按30或者35的倍数计算考场数。
即:年级总人数÷30,或者年级总人数÷35,剩余数再安排一个考场。
淮南师范学院考试考场排序细则

淮南师范学院考试考场排序细则1、全校所有考场一律按“1+nk”或“2+nk”排定座序(n 依次等于0,1,2,3,……;k值为某一常数,如1,2,3,4,5等。
如对60人班级,若k=2时,则排序为1,3,5,7,9,……59,2,4,6,8,10……60),其中“1+nk”或“2+nk”中的1和2为第一个学号和第二学号,学生以学号按此序对号就座。
2、要求同一考场K值应相同,同一班级不同课程考试的考场排序K值应不同。
K值原则上小于6,K值等于几,排序轮数就是几。
如K=4,就需排四轮,方可排完全班,第一轮为1,5,9,13,17……;第二轮为2,6,10,14,18,……;第三轮为3,7,11,15,19,……;第4轮为4,8,12,16,20,……。
3、排序工作由各班级学生干部,于考前30分钟内安排完成,不按要求执行,全校通报批评。
4、空号或缺考者,座位保留,若遇座位不够,监考老师可以调整;合班考试,座位按班级序号排列,由小到大;其他方面按教务处文件规定执行。
举例说明1:(考场黑板上填写内容)班级:国际经济与贸易15(2)人数:应到 45人辅导员(班主任):张三K=2座位安排201 231过道233 218 220过道203 229 235 216 222205 227 237 214 224207 225 239 212 226 244 209 223 241 210 228 242 211 221 243 208 230 240 213 219 245 206 232 238 215 217 202 204 234 236举例说明2:(考场黑板上填写内容)班级:体育教育14(2)人数:应到 45人辅导员(班主任):李四K=3座位安排201 202过道205 206 209过道204 243 208 203 212207 240 211 244 215210 237 214 241 218 245 213 234 217 238 221 242 216 231 220 235 224 239 219 228 223 232 227 236 222 225 226 229 230 233。
考号编写说明(1)

考号、考场编排1.考号编排(1)编排办法:考号统一为8位数。
第一位数为中心校代码,第二、三位为学校代码,第四位为年级代码,第五位、第六位为考场代码,第七、八位为座号代码;实验小学代码为1,中心学校代码为2,航南中心校代码为3,航北中心校代码为4,河东中心校代码为5,张庄中心校代码为6,龙中中心校为7。
学校代码就按照自己学校的名称定,一小代码为01,二小代码为02,十小代码为10,十一小代码为11,十五小代码为15,十六小代码为16,十七小代码为17,十八小代码为18.例如:一小二年级第一考场的3号,应该编辑如下:3 0 1 2 0 1 0 3(座号)(考场代码)(2)张贴方法:每一考场门口必须张贴考场号(第*考场),考场内必须张贴考号,只粘贴考号后四位。
考号从前门开始粘贴,由外到里、由前到后,每列都是小号在前,大号在后。
**教会学生编辑自己的考号,能根据桌子上张贴的四位考号准确找到自己的位置。
并训练学生填写卷头,包括在卷子上填写自己的考号(8位),以便登分时核对。
(年龄小的可以把考号记在一张纸上放进文具袋)2.考场编排考试前一天由各单位集中培训,统一编排考场(每场30人,不超过35人)。
考场按照7、8、8、7或5列、每列7人摆放桌子。
考场外设物品存放处。
学生物品统一摆放在考场外物品存放处,考场务必干净整洁,室内无与考试无关的物品、文字(前后黑板必须擦干净,前黑板只写考试相关信息),桌斗朝前摆放整齐。
桌子必须拉开,两边靠墙,并且注意前后距离。
黑板上写:今天____午考___科目,试卷共____张____页____大题。
提醒学生距离密封线2厘米外答题。
**估计这次卷头是密封线的格式,平时注意训练学生(学校、姓名、考号该怎样填写)。
无论哪种格式的卷头尽量让学生都会填写。
3.考场数计算方法依据每个年级总人数,按30或者35的倍数计算考场数。
即:年级总人数÷30,或者年级总人数÷35,剩余数再安排一个考场。
基于遗传算法无固定座位多课程混编的考试座位编排算法

节 只能参 加一门课程考试 。一个 考生可能参加 1 4门
课程考试 , 均为 2 平 . 。 6门
因为一个考生不是 4节都 参加考试 . 为节省座位 .
不 能 像 一 般 考 试 那 样 .采 用 固定 座 位 方 法 编 排 考 试 座
( 合并 ) , 时 应使 混编试 室最少。 ●为了方便考生参加考试 .例如 一考生在 同一天
位编排试室座位 。 例如将某县区 3 . 5万多人安排在该 区
5 O多个 考场 参加考试。 为了方便试卷管理 , 一门课程尽
上、 下午都参加考试 , 尽可能安排该考 生在同一考场 应
或就近考场 。为此 , 建立 区( ) 县 考场关联矩阵 :
关 键 词 : 传 算 法 ;无 固定 座 位 ;多课 程 混编 遗
0 引 言
我 省 自学 考 试 开 考 10多 个 专 业 .一 次 安 排 3 0 0 5 多 门课 程 考 试 。最 多 的 区 ( ) 考 人 数 3 县 报 . 多 人 , 5万 9 万 多 科 次 . 要 用 考 场 ( 如 中学 )0多个 。 次 考试 安 需 例 5 一 排 两 天 , 4节 ( 个 上 午 或 下 午 为一 节 )一 个 考 生 一 分 一 ,
() 3 部分试室 出现多课程混编 . 但计算机辅 助阅卷
课 程不 与非计算 机辅助 阅卷课 程汇编
座位 编 排算 法 中需 要 实 现 下 列优 化 :
位 为了保证一个座位 4节时间尽可能都安排考间 里 可 能 安 排 不 同 考 生 、不 同 的课 程 考 试 。 以 看 出 . 多 的试 室 、 场 参 加 座 位 编 排 。 节 可 越 考 从 省 座 位 方 面 来 看 . 果 越 好 。由于 这 样 的 编 排方 法 会 导 效 致 一 个 考 生 同 一 天 的上 、下 午 被 安 排 在 不 同 的 考 场 参
自考本科座位号

自考本科座位号
自考本科座位号是指在自考考试中,考生所被安排的座位号码,用来标识考生的考场位置和座位位置。
自考本科座位号通常由数字和字母组成,包含考场号、座位号以及考生试卷编号等信息。
一般来说,自考本科座位号由几个固定的部分组成,每部分的含义如下:
1. 考场号:考场号一般由1、2、3等数字表示,用来表示考生所在的考场位置。
2. 座位号:座位号一般由数字表示,用来表示考生在考场中的座位位置。
3. 考生试卷编号:考生试卷编号一般由字母和数字组成,用来标识考生的试卷。
自考本科座位号可以通过自考考试通知书或考试准考证上查看。
考生在参加自考考试时,需要按照自己的座位号找到相应的座位并坐下,然后按照考试规定参加考试。
座位号的安排一般是由考试主办单位根据考生报名信息和考场情况进行分配的,旨在保证每个考生都能有一个固定的座位位置,便于考试的进行和管理。
总之,自考本科座位号是考生在自考考试中的位置标识,通过座位号可以方便地找到考场和座位,参加考试。
教案(项目6:编排考场(任务2编排考场))

Excel 2003中文版教案桃源县职业中专倪贵兰年月日第周星期第节课题任务二编排考场课型新授课教学目标知识与技能1、了解部分函数应用的方法。
2、掌握数据排序的基本方法。
3、熟悉分类汇总的基本方法教学方法分组讨论,合作探究项目管理,任务驱动情感态度价值观增强学生的团结、合作意识增加学生学习EXCEL的积极性教学重点了解部分函数应用的方法教学难点掌握数据排序的基本方法教具准备教学过程程序内容〈1〉学生自学探究①展示教学目标②提出自学探究的内容、要求、方法及自学时间(也就是学案)③模拟练习〈2〉学生分组讨论交流、教师点拨讲解〈3〉达标练习(分层次),教师个别辅导。
一、导入新知,激发动机。
编排考场是学校工作中比较常见的一项常规工作,有时为了公正公平,要求全年级甚至全院校的学生打乱顺序,随机编排考场,.生成准考证号。
本项目中,以某学院计算机系编排考场为例,介绍如何利用Excel 2003的强大功能达到随机编排考场的目的,包括综合利用公式和函数进行考场编排,利用数据排序和分类汇总査看、分析相关信息的方法。
制作一张某学院计算机系学生原始名单。
随机编排考场后生成准考证号。
二、欣赏教材,自主学习任务一制作学生名单表格启动Excel 2003,修改工作表修改工作表Sheetl的名称为“名单”。
输入班级、学号、姓名等信息。
【操作要求】制作学生名单。
制作表格操作步骤略(具体操作步骤参考项目一),本工作表数据可以自己录入,也可以从其他文档中复制过来。
任务二编排考场使用Excel函数库中的随机函数RAND()、取整函数INT()、取模函数MOD()来随机编排考场和考号。
假设考场安排规则如下:全院学生打乱顺序,每个考场安排10个学生(最后一个考场可以不足10人),每个学生生成一个唯一的包含考场号和流水号的准考证号。
考场的编排首先利用随机数进行排序,然后在此基础上分配考场号和流水号,最后利用考场号和流水号生成准考证号。
和流水号,最后利用考场号和流水号生成准考证号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自学考试考场编排尾数组合算法文稿归稿存档编号:[KKUY-KKIO69-OTM243-OLUI129-G00I-FDQS58-自学考试考场编排尾数组合算法德阳市自学考试办公室景小松考场编排是自学考试管理系统中一个重要的部分。
自学考试的考场编排有别于其它考试的最大特点是参与编排的课程数巨大,普通高考、成人高考等考试每一场考试只有一门或几门课程,而自学考试每一场考试的课程达到一百多门。
一百多门的课程数给自学考试的考场编排出了一道在其他考试中不会遇到的难题,就是如何把大量的课程尾数(对课程报考科数用考场容量取余的结果称为课程尾数,简称尾数,在这里尾数为0的除外)按要求组合起来。
目前自学考试编排考场的要求是:1.考场人数不超过考场容量(考场最多可容纳的人数称为考场容量,现为30人);2.考场课程门数不超过规定门数,即课程容量(现为6门);3.课程尾数不能分割;4.编排的考场数应尽量与最佳考场数接近(最佳考场数是指考场总报考科数对考场容量向上取整的结果)。
考场编排的考场数与最佳数相等或尽可能接近是自学考试考场编排中最基本的要求,一方面减少考场数,节约考试经费,另一方面减少人工调整,提高了工作效率。
自学考试考场编排中最为核心的工作就是大量课程尾数组合,尾数组合算法的优劣直接关系到编排的效率以及对考场数的影响。
本文所探求的就是找到一种最佳尾数组合算法来达到这一目的。
为了更好地设计考场编排的尾数组合算法,我们先来分析一下考场编排中最重要的对象――课程尾数。
考场课程尾数分析。
自学考试每次开考课程达几百门,平均每场近百门。
以四川省2008年10月份为例,共开考课程470门,平均每场115门,每场课程尾数也近百(除开整除的情况)。
不同规模的考点,课程尾数出现是有一定的规律的。
小规模考点(每场十个考场左右或以下)一般情况下课程报考人数少,容易产生大量的小尾数,我们称之的小尾数(型)考点,所以在考场编排时经常遇到几个不足十人的考场,为了节约经费,有的考点常常把两三个考场合为一个考场(当然是考务上的操作)。
在考场编排算法中,课程容量的可调整,对这些小考点来说也是一种方便。
县区考点一般情况下都是小考点(除开有高校的县区),这部分县区考点占所有考点的大部分,所以在考场编排中要充分考虑大部分考点的情况。
大中型考点(每场二十考场左右或以上)一般情况下课程报考人数多,课程尾数的分布相对均匀,我们称为尾数均匀(型)考点。
大型考点可能出现比较特殊的大量大尾数,我们称为大尾数(型)考点。
有些中型考点小尾数也较多,主要出现在冷偏专业的课程上。
大中型考点主要分布在大中型城市。
我们把考场编排结果按照考场内的尾数特征来进行一个分类:一类是由几个小尾数组成的考场,如5+2+2+1+1+1,尾数和不大于15,称为小尾数考场;一类是由一个大尾数组成的考场,如29、28等,称为大尾数考场;一类是由一个中尾数组成的考场,如16,17等,称为中尾数考场。
这三类考场都达不到考场容量称为不满考场,其余的尾数组合达到考场容量的称为满考场。
考场编排合理的情况下,每场不满考场只有一到两个,且考场余数和不大于考场容量。
现有系统中考场编排算法分析。
我们先来分析一下现在四川省自学考试管理系统中考场编排算法。
从只有一个考点的自动编排结果分析来看,最后几个考场往往是小尾数集中的小考场。
从尾数的组合情况来看,是从大尾数开始,向下找到合适的最大的一个尾数,达到或尽量接近考场容量(30),不足考场容量的再如此循环一次,循环次数不超过课程容量(6)。
我们把这种算法称为先大法。
先大法算法简单,比较容易通过语言实现。
先大法的算法流程图如下:数,一般情况下比最佳考场数要多出一至两个考场。
但先大法对于存在大量小尾数的小考点是不合适的,编排结果往往会出现多个小尾数考场,比最佳考场数多出二至三个甚至四个考场。
小尾数较多的中型考点也容易出现这种情况。
大多数情况下,通过人工调整,每场都可以减少一至两个考场。
基本上每一场都需要人工调整来减少考场,增加了工作量,算法设计不合理,编排效率不高。
所以先大法对于大多数中小型考点的考场编排是不合适的。
在先大法中,人工调整是必须要做的工作,由于要人工参与,效率不高。
那么,我们是否可以把人工调整设计成算法来实现,减少人工成分,提高系统效率和工作效率呢?我们先来分析一下人工调整的过程,这实际上就是调整算法的设计。
先大法容易产生多个小尾数考场,当两个小尾数考场相加不足考场容量的,我们一般可以通过调整来减少一个考场。
我们把两个小尾数考场的尾数统一调整,通过排序,从大到小,先把最大的几个尾数组合(比课程容量少一,5个),计算出它们的和数(如5+3+2+2+1),在已编排好的有两个尾数的考场中寻找是否有这个和数,如有(如13+17),则把这个尾数与尾数组合对换(17+5+3+2+2+1,13),如无,则在尾数排序中减少尾数组合和(如5+3+2+1+1),又循环一次,直至找到与尾数组合相对应的已组合尾数,如无,则尾数组合个数减少1,在已编排好的有三个尾数的考场中寻找与组合和匹配的尾数。
尾数组合的个数递减参与外围循环。
循环直到所要调整的尾数个数等于或小于课程容量(6个)为止,然后再看有无要调整的小尾数考场。
虽然还有其它的人工调整的方法,但不好程式化,这里只介绍这一种小尾数考场的合并算法,算法流程图如下:调整算法比较复杂,它把人工调整的整个过程程式化,虽然算法实现起来比较困难,但却提高了编排设计的效率,减少了人工调整的环节。
在先大法中,第一个组合的尾数有可能不是最合适的,使得考场尾数组合达不到考场容量。
如:18、7、6、3、3中,先大法组合为:18+7+3=28,达不到30。
而次大尾数组合18+6+3+3=30,就比先大法组合要好。
所以在先大法组合中可以加入两次次大组合,选择最接近考场容量的组合。
我们称这种算法为试探法。
如果我们在先大法中加入试探法后,对每一场又进行调整算法进行程式调整,则使得考场编排更加自动化,更加合理和高效。
其它思路的尾数组合算法。
对于大多数县区考点,先大法往往会产生许多小尾数考场,在考场编排时要进行大量的人工调整。
这是由先大法本身算法所决定的,先大法中总是先选大尾数来组合,最后小尾数余下的就比较多,从而出现了许多的小尾数考场。
为了防止大量小尾数的剩余,可以在选择尾数时,用试控法,选择最接近考场容量,并且尾数个数最多的一组。
当然,我们也可以重新设计一种尾数组合的算法来消除小尾数考场。
我们可以用与先大法相反的思路来设计新的算法,先选择最小的尾数来组合,如此循环,在最后一次循环时用先大法来达到或接近考场容量。
我们称这种算法为先小法。
先小法的算法流程图与先大法大同小异,可参考先大法算法流程图。
先小法虽然可以解决先大法中小尾数考场的问题,但新的问题也就产生了。
先小法中小尾数优先,使得中尾数大量剩余,如14、17、18等,形成几个无法组合的中尾数考场。
在现在的考务管理中,尾数不允许分割。
实际上,尾数分割在考务操作上是可行的,分割后,可以通过增加试卷袋解决考务操作。
如果允许尾数分割,中尾数考场的问题就迎刃而解了。
如上例中,我们可以把14分割为12+2,可产生18+12与17+2的合理组合,这样就减少了一个考场,一般情况下,只进行一至两次分割操作就可以达到最佳考场数。
我们称这种算法为分割算法。
在先大法与先小法中都是以最大的尾数开始组合尾数,往往会产生小尾数或中尾数的剩余而产生一些组合上不合理的问题。
我们是否可以考虑从中间的某一个尾数开始用先小法组合,最后进行最大尾数的组合,一方面可以消除中尾数无法组合的情况,另一方面也防止了小尾数的剩余。
我们称这种算法为中点法。
中点法中,中小尾数先被组合,容易形成大尾数考场,但考场余数和一般不会大于考场容量,与最佳考场数相等或最接近,所以,中点法相对于先大法和先小法较为合理。
在中点法中,关键是开始组合的尾数的选择,也就是中点的选择。
我们设计了一种比较简单合理的中点选择法:我们把所有的尾数相加的和对考场容量向上取整(既取整有余则取整数加一),所得的数称为最小组合考场数,能达到最小组合考场数就能达到最佳考场数。
把尾数从大到小排序后,中点就是最小组合考场数所对应的记录。
我们以中点为界,把大尾数的考场余数比为“坑”,小尾数比为“石头”,最小组合考场数就是我们要填的“坑”的最小数目。
中点可以形象地比做成“坑”与“石头”之间的供求平衡点。
以考场容量为30例,如果中点大于15,就会出现“坑小石头大”无法组合的情况,所以,一般情况下中点不能大于15。
中小型考点由于存在大量的小尾数,中点一般不会大于15,但对于大型考点有可能出现大量的大尾数,这时中点就可能大于15。
中点大于15时,在尾数不允许分割的情况下,只能通过增加考场数来容纳从16到中点的这部分无法填“坑”的大“石头”,从而下移中点至15,下移几个记录,则考场数就增加几个。
当然,如果允许尾数分割,就不用增加考场。
遍历算法。
在上述的几种算法中,都是一个考场尾数组合完毕后进行下一个考场尾数组合,我们统称为逐场(个)法。
逐场法中,往往是先满足所组合考场的条件,没有考虑全局,难免产生这样那样的问题。
为解决这个问题,我们可以选择较为合理的中点法,用遍历法来分配所有的尾数。
我们以中点为界,从中点这个最大的“坑”开始向每个“坑”填“石头”,总是用最大的“石头”来填“坑”,一次遍历一个“坑”只用一个“石头”;填满的“坑”就不再参与遍历;如此遍历几次(最多为课程容量的次数,6次,如果没有课程容量的限制,则可一直遍历下去,但一般情况下,遍历次数不会超过9次),由于供求平衡,所以最后“石头”会用完;如果在遍历了课程容量所规定的次数后仍有尾数剩余,则剩余尾数按先大法组合,从而出现个小尾数考场,这种情况往往会出现在有大量小尾数的考点。
遍历时,可以用上述的固定“坑”遍历,也可以用动态“坑”遍历,也就是每次遍历前都对未填满的“坑”从大到小排序,然后从最大的“坑”开始用先大法填“坑”。
动态遍历比较合理,但较固定遍历用语言实现起来比较困难。
中点遍历法中虽然仍是用先大法来填“坑”,但一次遍历时只准用一次先大法,这样,大中小尾数的组合都兼顾到了,出现中尾数考场及小尾数考场等问题的机率大大降低,基本上不会出现需要调整的情况。
动态遍历算法的流程图如下(有些步骤简化省略):在遍历法中,也会出现一些特殊的情况。
比如,中点为第一个15记录,中点附近尾数分布情况为:…18、17、16、15、15、15、14、14、13…,明显的一点是,有一个15和一个14的“石头”无法用上。
也就是说,有许多大“石头”,而能容纳大“石头”的“坑”少,这时用遍历法,最后这部分大“石头”就无法找到合适的“坑”,而有些“坑”却没有填满。