演算主要步驟 :
1. 選擇某一年級的必修課程 , 開始分發運算
2. 取得此年級的課程 , 並依序使用亂數排序產生單科選課結果
3. 計算 "志願總值" , "志願平方和的總值" , 並判斷最差狀況 ,
以決定是否採用這次產生的選課結果
4. 重複步驟 2 , 3 數千次以上
針對步驟 2 , 詳細的演算法 :
1. 建立有選此課程的帳號清單 , 並標記哪些帳號有填志願 , 哪些未填志願
3. 取得此課程的選項個數 , 計算每個選項的人數上限
4. 開始分發 :
先處理有填寫志願的帳號
迴圈一 (控制變數 : 志願值 i = 1 to n) {
迴圈二 (控制變數 : 選項值 j = 1 to n) {
亂數建立一帳號清單 (其帳號對選項 j 所填的志願為 i)
若此選項(j)尚未達到人數上限 且 此帳號尚未被分發 {
則分發成功 , 此帳號在此課程選得的選項為 j , 為第 i 志願
}
}
}
再處理未填寫志願的帳號
亂數配給課程 , 填入尚有剩餘名額的選項 , 細節不詳述
針對步驟 3 , 說明 :
志願總值
為所有人選得的課程選項的志願之總和
即上述演算法說明中 , 紅色字樣之 i 值的總和
代表意義 : 選課結果總體優劣層度
志願平方和的總值
為個人選得的所有課程選項的志願總和 , 平方後 , 再將所有人加總
即紅色字樣之 i 值 , 個人所有課程志願總和平方後 , 所有人再加總
代表意義 : 選課結果個人與個人之間差異度
最差狀況
一帳號在此年級所有課程皆被分發到最後志願的選項即為最差狀況
判斷
若出現最差狀況則一律捨棄這次新產生的結果
若沒有出現最差狀況 , 且新產生之結果的 "志願總值" 和
"志願平方和的總值" 皆小於或等於目前保留的選課結果 ,
則採用新的選課結果
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.20.246