蔣偉毅 王子超 張謙
【摘要】 考場編排是考試系統(tǒng)都要進行的一項工作,科學(xué)、合理、公正的編排考場,對于嚴(yán)肅考風(fēng)考紀(jì)、提升考試的公信力起著重要的作用。本文總結(jié)了考場中的各種編場方法并對方法的特點進行了介紹和分析,為考試系統(tǒng)工作人員根據(jù)編場需求的不同采用更為適合的編場方法提供了參考。
【關(guān)鍵詞】 編排 考試 隨機數(shù)
一、利用已有信息編場
在考生信息庫里抽取考生信息中的數(shù)字,以一定的規(guī)則為每名考生重新設(shè)置位次數(shù)字,根據(jù)位次數(shù)字重新排序打亂原有順序。
1.1自然順序號數(shù)字倒排
利用考生原有順序進行數(shù)字倒排得到不同位次數(shù)字。如:兩個考生在數(shù)據(jù)庫記錄位置1234、1235將考生記錄號倒排后位次數(shù)字為4321和5321,按位次重新排序后將挨著的考生在編場中隔開。缺點是規(guī)律性較強不適合人數(shù)百位以內(nèi)情況下使用。
1.2提取考生信息的數(shù)字進行排列
提取考生信息中的一個或多個字段中的數(shù)字生成位次數(shù)字,利用新組建的位次數(shù)字將考生順序打亂,較單一自然序號數(shù)字倒排具有更強的無規(guī)律性。如:報名時相鄰的兩個考生,報名時生成的報名號分別A00123和A00124,身份證號130982198301020928,130981198211250616,手機號15612171611,13931210928。編場中抽取考生報名號、身份證號、手機號等信息組成一組無規(guī)律位次數(shù)字。注意的是提取身份證號、電話等數(shù)字混合排序打亂時要避開信息中有規(guī)律位數(shù),如身份證號前6位為地域17位數(shù)字男單女雙.手機號前3位為手機運營商中間4位為市級區(qū)號.使用這些位數(shù)生成位次數(shù)字易造成相同地域、出生日期相近、性別相同或使用相同手機業(yè)務(wù)考生相對集中。
利用已有信息生成位次數(shù)字方法簡單,大多數(shù)數(shù)據(jù)庫和數(shù)據(jù)表可通過字符串截取函數(shù)實現(xiàn),適合編場要求不復(fù)雜,人數(shù)相對較少的中小型考試使用。
二、使用計算機隨機數(shù)編場
計算機產(chǎn)生隨機數(shù)字原理是系統(tǒng)定時器的值作為隨機種子,每個種子對應(yīng)一組根據(jù)算法預(yù)先生成的隨機數(shù),相同的平臺環(huán)境下不同時間產(chǎn)生的隨機數(shù)是不同的。
2.1、隨機數(shù)排序法
在計算機隨機編場中較常見生成速度快原理簡單。如:需要編場的考生為5000人,利用計算機隨機為每名考生產(chǎn)生10組0到9的隨機數(shù)字,利用產(chǎn)生的10位數(shù)字進行排序核心代碼為:
int[] array = new int[10];
for (int i = 0; i < array.Length; i++)
{ int x = Convert.ToInt32(random.Next(0,9);
for (int j = 0; j < i; j++)
{if (x == array[j])
{ x = Convert.ToInt32(random.Next(0,9));
j = 0}}
array[i] = x;
2.2洗牌法
打亂方式類似撲克牌的洗牌,編場時遍歷整個考生數(shù)據(jù)表,遍歷過程中隨機產(chǎn)生一個不大于考生總數(shù)的隨機數(shù),以該隨機數(shù)相同記錄序號與當(dāng)前遍歷到記錄序號進行對換。以10條記錄數(shù)為例核心代碼為:
public void Reshuffle()
{int[] cards = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Random ram = new Random();
int currentIndex;
int tempValue;
for (int i = 0; i < 10; i++)
{currentIndex = ram.Next(0,10- i);
tempValue = cards[currentIndex];
cards[currentIndex] = cards[9 - i];
cards[9 - i] = tempValue;}}
隨機數(shù)編場,可使考生數(shù)據(jù)進行完全隨機排序,通過簡單編程即可實現(xiàn),在考場設(shè)置要求不復(fù)雜的情況下適用。
三、特定需求下的算法編場
3.1分冶法
把一個規(guī)模較大的問題分成多個較小的與原問題類型相同的子問題,通過對子問題求解,并把子問題的解合并起來從而構(gòu)成整個問題的解。分冶法在每一層遞歸上面都有3個步驟:
a.分解,將若原問題分解為若干個規(guī)模較小、相互獨立、與原問題形式相同的子問題。
b.解決,若子問題規(guī)模較小而容易被解決則直接解,否則遞歸解決各個子問題。c.合并,將各個子問題的解合并原問題的解。
在涉及地域較廣的大型考試,考生需要在本地區(qū)考試,這種情況下就要使用分冶法,將每個考區(qū)進行單獨的編場,然后合成最終的編場數(shù)據(jù)庫。
3.2混洗法
采用的是基礎(chǔ)定位、依次插入的原理。把最大的集合看成一個組,將其他集合均勻的插入到這個集合中,最終形成一個全部的集合。在實際考試中適合把同單位或同班級的考生打亂均勻的分配到不同的考場中,使同一部分的考生達到較為理想的均勻分布狀態(tài)。
3.3環(huán)形選取法:讓需要編排考場的考生形成一個環(huán),按照一定的間隔來抽取考生到的考場中,該方法需要滿足兩個條件:1、間隔數(shù)和考生總?cè)藬?shù)互為素數(shù)2、間隔數(shù)要大于編場庫中同一單位考生最大人數(shù)。同一學(xué)校、班級或單位等考生相對熟悉的群體中使用該方法可很大程度上讓互相認(rèn)識的考生不分配到同一考場。
3.4蟻群算法
a.所有螞蟻遇到障礙物時按照等概率選擇路徑,并留下信息素;
b.隨著時間的推移,較短路徑的信息素濃度升高;
c.螞蟻再次遇到障礙物時,會選擇信息素濃度高的路徑;
d.較短路徑的信息素濃度繼續(xù)升高,最終最優(yōu)路徑被選擇出來。
該方法適合編場復(fù)雜度較高的情況為考場搭配尋找最優(yōu)的解決方案,如考生需要兩天內(nèi)進行4場考試,每次考試都要到新考場中,為了便于考生出行和熟悉環(huán)境,4場考試每名考生只能在小范圍內(nèi)隨機變換考場。
算法輸入:所有考點的考場數(shù),考生數(shù)量n,迭代次數(shù)K
算法輸出:所有考生4場考試在盡量單一考點范圍內(nèi)的考場隨機編場。
a.初始化隨機分配所有考生的第一次所在考場;
b.for i = 1 to K
c.for j = 1 to n
d.第j名考生搜索一遍;
e.if 考生分配到的不同考點數(shù)更小
f.更新該考生考場;
g.更新4場考試的分配方案;
h.end
i.end
參 考 文 獻
[1]馮向萍 張?zhí)t 李萍.高考考場編排算法研究.新疆農(nóng)業(yè)大學(xué)學(xué)報,2008年 第3期
[2] 安曉東.基于蟻群算法的電子化考試考場座位編排方法.中北大學(xué)學(xué)報:自然科學(xué)版,2007年 第3期.