1 緒 論
1.1課題背景與研究意義
1.2課題的應用領域
1.3 課題的現狀
1.4解決NP問題的幾種算法及其比較
2 目前流行的幾種排課算法的介紹
2.1. 自動排課算法
2.2 基於優先級的排課算法
3 基於時間片優先級排課算法描述與分析
3.1排課中的基本原則
3.2排課的基本要求
3.3基於時間片優先級排課算法描述
3.4算法分析
參 考 資 料
1 緒 論
1課題背景與研究意義
排課問題早在70年代就證明是一個NP完全問題,即算法的計算時間是呈指數增長的,這一論斷確立了排課問題的理論深度。對於NP問題完全問題目前在 數學上是沒有一個通用的算法能夠很好地解決。然而很多NP完全問題目具有很重要的實際意義,例如。大家熟悉地路由算法就是很典型的一個NP完全問題,路由 要在從多的節點中找出最短路徑完成信息的傳遞。既然都是NP完全問題,那么很多路由算法就可以運用到解決排課問題上,如Dijkstra算法、節點子樹剪 枝構造網絡最短路徑法等等。
目前大家對NP 完全問題研究的主要思想是如何降低其計算復雜度。即利用一個近似算法來代替,力爭使得解決問題的時間從指數增長化簡到多項式增長。結合到課表問題就是建立 一個合適的現實簡約模型,利用該簡約模型能夠大大降低算法的復雜度,便於程序實現,這是解決排課問題一個很多的思路。
在高等院校中,培養學生的主要途徑是教學。在教學活動中,有一系列管理工作,其中,教學計划的實施是一個重要的教學環節。每學期管理人員都要整理教 學計划,根據教學計划下達教學任務書,然后根據教學任務書編排課程表。在這些教學調度工作中,既有大量繁瑣的數據整理工作,更有嚴謹思維的腦力勞動,還要 填寫大量的表格。因此工作非常繁重。
加之,隨着教學改革的進行及“211”工程的實施,新的教育體制對課表的編排提出了更高的要求。手工排課時,信息的上通下達是極其麻煩的,而采用計 算機排課,教學中的信息可以一目了然,對於優化學生的學習進程,評估每位教師對教學的貢獻,領導合理決策等都具有重要的意義,必將會大大推進教學的良性循 環。
2課題的應用領域
本課題的研究對開發高校排課系統有指導作用。
排課問題的核心為多維資源的沖突與搶占,對其研究對類似的問題(特別是與時間表有關的問題:如考試排考場問題、電影院排座問題、航空航線問題)也是個參考。
3 課題的現狀
年代末,國外就有人開始研究課表編排問題。1962年,Gotlieb曾提出了一個課表問題的數學模型,並利用匈牙利算法解決了三維線性運輸問題。 次后,人們對課表問題的算法、解的存在性等問題做了很多深入探討。但是大多數文獻所用的數學模型都是Gotlieb的數學模型的簡化或補充,而至今還沒有 一個可行的算法來解決課表問題。
近40年來,人們對課表問題的計算機解法做了許多嘗試。其中,課表編排的整數規划模型將問題歸結為求一組0-1變量的解,但是其計算量非常大。解決0-1 線性優化問題的分支一定界技術卻只適用也規模較小的課表編排,Mihoc和Balas(1965)將課表公式化為一個優化問題,Krawczk則提出一種 線性編程的方法。Junginger將課表問題簡化為三維運輸問題,而Tripathy則把課表問題視作整數線性編程問題並提出了大學課表的數學模型。
此外,有些文獻試圖從圖論的角度來求解排課表的問題,但是圖的染色問題也是NP完全問題,只有在極為簡單的情況下才可以將課表編排轉化為二部圖匹配問題,這樣的數學模型與實際相差太遠,所以對於大多數學校的課表編排問題來說沒有實用價值。
進入九十年代以后,國外對課表問題的研究仍然十分活躍。比較有代表的有印度的Vastapur大學管理學院的ArabindaTripathy、加拿大 Montreal大學的Jean Aubin和Jacques Ferland等。目前,解決課表方法的問題有:模擬手工排課法,圖論方法,拉格朗日法,二次分配型法等多種方法。由於課表約束復雜,用數學方法進行描述 時往往導致問題規模劇烈增大,這已經成為應用數學編程解決課表問題的巨大障礙。國外的研究表明,解決大規模課表編排問題單純靠數學方法是行不通的,而利用 運籌學中分層規划的思想將問題分解,將是一個有希望得到成功的辦法。
在國內,對課表問題的研究開始於80年代初期、具有代表性的有:南京工學院的UTSS(A University Timetable Scheduling System)系統,清華大學的TISER(Timetable SchedulER)系統,大連理工大學的智能教學組織管理與課程調度等,這些系統大多數都是模擬手工排課過程,以“班”為單位,運用啟發式函數來進行編 排的。但是這些系統課表編排系統往往比較依賴於各個學校的教學體制,不宜進行大量推廣。
從實際使用的情況來看,國內外研制開發的這些軟件系統在實用性上仍不盡如人意。一方面原因是作為一個很復雜的系統,排課要想面面俱到是一件很困難的 事;另一方面每個學校由於其各自的特殊性,自動排課軟件很難普遍實用,特別是在調度的過程中一個很小的變動,要引起全部課程的大調整,這意味着全校課程大 變動,在實際的應用中這是很難實現的事。
4解決NP問題的幾種算法及其比較
解決NP完全問題只能依靠近似算法,所以下面介紹幾種常用算法的設計思想,包括動態規划、貪心算法、回溯法等。
動態規划法是將求解的問題一層一層地分解成一級一級、規模逐步縮小的子問題,直到可以直接求出其解的子問題為止。分解成的所有子問題按層次 關系構成一顆子問題樹。樹根是原問題。原問題的解依賴於子問題樹中所有子問題的解。動態規划算法通常用於求一個問題在某種意義下的最優解。設計一個動態規 划算法,通常可按以下幾個步驟進行:
1. 分析最優解的性質,並刻划其結構特征。
2. 遞歸的定義最優解。
3. 以自底向上的方式計算出最優解。
4. 根據計算最優解時得到的信息,構造一個最優解。
步驟1~3是動態規划算法的基本步驟。在只需要求出最優解的情形,步驟4可以省去。若需要求出問題的一個最優解,則必須執行步驟4。此時,在步驟3中計算最優解時,通常需記錄更多的信息,以便在步驟4中,根據所記錄的信息,快速地構造出一個最優解。
(二)貪心算法
當一個問題具有最優子結構性質時,我們會想到用動態規划法去解它,但有時會有更簡單、更有效的算法,即貪心算法。顧名思義,貪心算法總是做出在當前 看來最好的選擇。也就是說貪心算法並不是整體最優上加以考慮,他所作出的選擇只是在某種意義上的局部最優的選擇。雖然貪心算法不是對所有問題都能得到整體 最優解,但對范圍相當廣的許多問題它能產生整體最優解,如圖的算法中單源最短路徑問題,最小支撐樹問題等。在一些情況下,即使貪心算法不能得到整體最優 解,但其最終結果卻是最優解的很好的近似解。
在貪心算法中較為有名的算法是Dijkstra算法。它作為路由算法用來尋求兩個節點間的最短路徑。Dijkstra算法的思想是:假若G有n個頂 點,於是我們總共需要求出n-1條最短路徑,求解的方法是:初試,寫出V0(始頂點)到各頂點(終頂點)的路徑長度,或有路徑,則令路徑的長度為邊上的權 值;或無路經,則令為∞。再按長度的遞增順序生成每條最短路徑。事實上生成最短路徑的過程就是不斷地在始頂點V何終頂點W間加入中間點的過程,因為在每生 成了一條最短路徑后,就有一個該路徑的終頂點U,那么那些還未生成最短路徑的路徑就會由於經過U而比原來的路徑短,於是就讓它經過U。
(三)回溯法
回溯法有“通用的解題法”之稱。用它可以求出問題的所有解或任一解。概括地說,回溯法是一個既帶有系統性又帶有跳躍性的搜索法。它在包含問題所有解 的一顆狀態空間樹上,按照深度優先的策略,從根出發進行搜索。搜索每到達狀態空間樹的一個節點,總是先判斷以該節點為根的子樹是否肯定不包含問題的解。如 果肯定不包含,則跳過對該子樹的系統搜索,一層一層地向它的祖先節點繼續搜索,直到遇到一個還有未被搜索過的兒子的節點,才轉向該節點的一個未曾搜索過的 兒子節點繼續搜索;否則,進入子樹,繼續按深度優先的策略進行搜索。回溯法在用來求問題的所有解時,要回溯到根,且根的所有兒子都已被搜索過才結束;而在 用來求問題的任一解時,只要搜索到問題的一個解就可結束。
2 目前流行的幾種排課算法的介紹
2.1. 自動排課算法
1 .問題的描述
我們討論的自動排課問題的簡化描述如下:
設要安排的課程為{ C1 , C2 , ., Cn} ,課程總數為n , 而各門課程每周安排次數(每次為連續的2 學時) 為{ N1 , N2 , ., Nn} ;每周教學日共5 天,即星期一~ 星期五;每個教學日最多安排4 次課程教學,即1 ~ 2 節、3 ~ 4 節、5 ~ 6 節和7 ~ 8 節(以下分別稱第1 、2 、3 、4 時間段) . 在這種假設下,顯然每周的教學總時間段數為5 ×4 = 20 ,並存在以下約束關系:
n ≤20 , (1)
N = 6n, i =1, Ni ≤20. (2)
自動排課問題是:設計適當的數據結構和算法, 以確定{ C1 , C2 , ., Cn } 中每個課程的教學應占據的時間段,並且保證任何一個時間段僅由一門課程占據.
2 .主要數據結構
對於每一門課程,分配2 個字節的“時間段分配字”(無符號整數) :{ T1 , T2 , ., Tn} . 其中任何一個時間段分配字(假設為Ti ) 都具有如下格式:
Ti 的數據類型C 語言格式定義為:unsigned int . Ti 的最高位是該課程目前是否是有效的標志,0 表示有效,1 表示無效(如停課等) ;其它各位稱為課程分配位, 每個課程分配位占連續的3 個位(bit) ,表示某教學日(星期一~ 星期五) 安排該課程的時間段的值,0 表示當日未安排,1 ~ 4 表示所安排的相應的時間段(超過4 的值無效) .
在這種設計下, 有效的時間段分配字的值應小於32 768 (十六進制8000) , 而大於等於32 768 的時間段分配字對應於那些當前無效的課程(既使課程分配位已設置好也如此) , 因此很容易實現停課/ 開課處理.
3 .排課算法
在上述假設下,自動排課算法的目標就是確定{ C1 , C2 , ., Cn} 所對應的{ T1 , T2 , ., Tn} .
從安排的可能性上看,共有20 !/ (20 - N) !種排法( N 的含義見(2) 式) . 如果有4 門課,每門課一周上2 次,則N = 8 ,這8 次課可能的安排方法就會有20 !/ (20 - 8) ! = 5 079 110 400 ,即50 多億種. 如果毫無原則地在其中選擇一種方案,將會耗費巨大量的時間. 所以排課的前提是必須有一個確定的排課原則. 我們采用輪轉分配法作為排課原則:從星期一第1 時間段開始按{ C1 , C2 , ., Cn} 中所列順序安排完各門課程之后(每門課安排1 次) ,再按該順序繼續向后面的時間段進行安排,直到所有課程的開課次數符合{ N1 , N2 , ., Nn} 中給定的值為止. 在算法描述中將用{ C[1 ] , C[2 ] , ., C[ n ]} 表示{ C1 , C2 , ., Cn} , 對{ N1 , N2 , ., Nn}
和{ T1 , T2 , ., Tn} 也采用同樣的表示法.
算法1 排課算法
輸入 { C1 , C2 , ., Cn} 、{ N1 , N2 , ., Nn} .
輸出 { T1 , T2 , ., Tn} .
① 初始化:
星期值week = 1
時間段值segment = 1
{ T [1 ] , T [2 ] , ., T [ n ]} 中各時間段分配字清零
② 新一輪掃描課程:
置繼續處理標志flag = 0
對課程索引值c-index = 1 ,2 , ., n 進行以下操作:
如果N[c-index ] > 0 ,則做以下操作:
把segment 的值寫入T[c-index ]的第(week - 1) 3 3~week 3 3 - 1 位中 N[c-index ]的值減1
如果N[c-index ] > 0 ,則置flag = 1
如果week = 5 並且segment = 4
則:置flag = 1 並轉③
否則:如果segment = 4
則:置segment = 1 且week 增1
否則:segment 增1
檢測是否已全部安排完畢:
如果flag = 1
則:轉②
否則:轉③
③ 檢測是否成功:
如果flag = 1
則:開課次數過多
否則:課程安排成功
④ 算法結束
顯然,本算法的時間復雜度為O ( N) ( N 為每周總開課次數, 見(2) 式) , 而存儲時間段分配字所用空間為2 n 個字節( n 為課程門數) .
4 .沖突檢測算法
有時在自動排課完畢后,需要人工調整某些課程的安排時間,如把第i 門課程在人工干預下改成星期數為week 、時間段為segment 的位置,則根據上述數據結構需做如下運算:
T [ i ] = T [ i ] &(~ (7 << (week - 1) * 3) ) + (segment << (week - 1)*3) ,
其中&、~ 和n 分別為按位與、按位取反和按位左移運算符(下同) .
問題是如何判斷是否已有其它課程安排在同一個時間段上. 設人工調整的時間段分配
字為T[1 ] ,則該問題描述為:判斷時間段分配字T [1 ] 與{ T[2 ] , T [3 ] , ., T [ n ]} 中的某個分配字是否存在相同課程分配位上的相等的非零時間段值, 或者說{ T [2 ] , T [3 ] , .,T[ n ]} 中是否存在與T [1 ] 沖突的時間段分配字. 為簡化起見,在以下算法描述中假設所有時間段分配字的最高位為0.
算法2 沖突檢測算法
輸入 T1 和{ T2 , ., Tn} .
輸出 與T1 沖突的{ T2 , ., Tn} 中的時間段分配字.
① 對c-index = 2 ,3 , ., n 做以下操作:
初始化屏蔽字mask = 7
對星期值week = 1 ,2 ,3 ,4 ,5 做以下操作:
如果T[1] & mask 等於T[c-index] & mask ,而且二者不等於0
則: T[ 1 ]與T[c-index ]相沖突,轉①
mask 左移3 位(或乘8)
② 算法結束
本算法時間復雜度為O ( n) ( n 為課程門數)
5.算法分析
此算法以課程為中心,進行搜索匹配,取最先匹配的值;具有占有空間少,運算速度快的特點。但其未對數據進行擇優選取,所以不能對教學資源(教師、教室)合 理分配,也不能滿足一些特殊要求(比如有些老師喜歡上午上課,有些老師偏向於集中式上課;有些課程安排到上午會更合適些,有些課程不能安排到上午等)。
2.2 基於優先級的排課算法
從數學上講, 排課問題是一個在時間、教師、學生和教室四維空間, 以教學計划和各種特殊要求為約束條件的組合規划問題。其實質就是解決各因素之間的沖突。在設計算法時, 為了降低課程調度的算法復雜性, 我們主要采用了化整為零的思想及優先級算法:
1.排課的預處理
1.等價類的划分
將具有共同聽課對象的任務划分在同一等價類中, 在每個等價類之間只存在地點上的沖突, 而沒有時間上的沖突。 然后按照的大小, 從大到小進行處理。 等價類的划分可以先按年級分, 然后再按系別分, 如下 所示:
聽課對象等價類的划分
自控系機械系化工系管理系.
99 級N 1 子類1 子類2 子類3 子類4 .
98 級N 2 子類5 子類6 子類7 子類8 .
97 級N 3 子類9 子類10 子類11 子類12 .
96 級N 4 子類13 子類14 子類15 子類16 .
這樣, 先按年級分為四個類: 99 級(N 1) , 98 級(N 2) , 97 級(N 3) , 96 級(N 4) , 而對每一個等價類N 1、N 2、N 3、N 4 又可以按院系分為若干個子類, 然后對每個子類分別進行排課處理, 這樣做就可以大大降低算法的復雜性
2.教室分類
為了合理使用教室, 我們采用了教室分類的辦法, 以便盡可能在課程編排過程中避免上課人數少的課程盲目強占容量大的教室現象。
首先將教室按照其類型分為若干個等價類, 如下所示,然后, 根據教室的容量再分別對每個教室等價類進行划分: 如分為0~ 30 人、30~ 60 人、60~90 人、90~ 120 人、120~ 180 人等若干種
教室等價類的划分:
教室類型等價類R 教室類型等價類R
普通教室R1 聽力教授R5
投影教室R2 物理實驗室R6
多媒體教室R3 化學實驗教室R7
制圖教室R4 計算機實驗教學R8
3.時間預處理
1) 構造時間模式庫
時間模式是根據教務人員的經驗, 為各種周學時數不同的課程指定的一種時間組合方式.例如, 一門課程的周學時數為4, 那么它的時間組合方式可以有:“11”,“41”; 表示該課程一周上兩次, 分別為周一的12 節和周四的12 節L同時, 為了達到較好的上課效果, 也要對這些時間模式進行分級.如下 所示
時間模式分級舉例
周學時優先級周一周二周三周四周五
4 1 11 41
∶ ∶
4 2 22 43
: :
其中, 將周一至周五用數字1~ 5 表示, 上課節次: 12 節、34 節、56 節、78 節、晚12 節、晚34 節分別用數字1~ 6 表示。 例如數字“42”表示周四的34 節
這個時間單元。這樣, 對於每種周學時數, 可以將所有合理的時間組合形式存入模式庫中。以便進行時間處理時可以用時間模式庫中的各種模式進行匹配。
2) 時間數組
為了表示班級、教師、教室的可排課時間, 分別為他們建立一維數組L例如, 某位教師的初始可排課時間數組為(123456 123456 123456 123456 123456)。 其中共有五組數據, 分別表示一周中的五天; 而一組數據共有6 個字符“1、2、3、4、5、6”分別表示一天中的六個時間單元。 當為某位教師分配時間后, 相應的那位字符就置為0L 例如, 某位教師的可排課時間數組為( 020456 103456 003456 120456 023456) , 則表示這位教師在周一的12 節和56 節, 周二的34 節, 周三的12 節和34 節, 周四的56 節, 周五的12 節已經安排了課程, 如果要再安排課程的話, 就應該安排在非0 的時間單元L對於班級和教室也可以進行同樣的處理, 分別標出可排課時間。
2. 每一子類的排課處理
在對每個子類的排課處理中, 我們結合了分治法、貪婪法、回溯法三者的思想L首先, 根據分治法的思想把整個排課過程分成時間分配和教室分配兩個階段。然后, 依據貪婪法的算法思想, 在時間分配時,總是在尚未分配的時間單元中選擇上課效果最好的
單元。而在時間分配發生死鎖時, 會向上回溯搜索到發生沖突的最近一個記錄, 然后對它進行重排以解決沖突。 具體處理過程如下:
1.設定優先級
對子類中的課程計算優先級L設優先級函數為:
D (g ) = J (g )*C1 + T (g ) * C2 + P (g ) * C3 ( 1 )
其中, J (g ) 表示課程級別, 選修課的課程級別設置為1, 必修課的課程級別設置為2; T (g ) 表示該課程的周學時數; P (g ) 表示該課程的參與人數; C1、C2、
C3 是可以調整的參數。 由式(1) 可以看出課程級別越高、周學時越多、參加人數越多的課程, 其D (g )值越大, 其優先級也越高; 反之, D (g ) 值越小, 其優先級越低。這樣, 就可以根據計算的優先級的高低對課程進行排序, 優先級高的優先調度。
2.查詢可用時間單元
第1 步, 初始化某門課程的最大可安排時間數組, 為( 123456 123456 123456 123456 123456)。第2 步, 找出參加該課程學習的所有班級。第3 步, 查詢每個班級的時間數組, 得到班級的已排課時間, 並將其與課程的最大時間數組相“與”, 從而得到該課程不能安排的時間單元。第4 步, 依次處理教師時間數組和相關教室時間數組, 這樣, 該課程最終的可安排時間數組就是班級、教師、教室可排課時
間的交集。
3.查找適當的時間模式
找到可排課時間后, 就應根據課程的周學時數在時間模式庫中匹配適當的時間模式。完成以上工作后, 就確定了課程的上課時間和地點。如果在處理中發生死鎖, 則可根據回溯法的思想向上回溯搜索到發生沖突的最近一個記錄, 然后對它進行重排以解決死鎖, 如果仍不能解決死鎖問題, 則可以將該課程信息輸出到沖突列表中。
3. 人工干預的處理
計算機自動排課也需要進行人工干預, 以便可以使得各個高校能夠根據自己的具體要求對排課算法中的一些參數進行設置和調整, 並對計算機排出的課表進行調整L本算法所設計的人工干預過程有:
等價類划分中參數的設置, 教室類型的設置, 時間模式庫的設置, 優先級函數中參數的設置。用戶可以根據自己的具體要求對這些參數和庫進行設置。另外,對於計算機排出的課程表, 用戶也可以通過人機交互進行適當調整, 從而得到用戶滿意的課程表。
4.性能分析
此算法對班級及教室划分等價類,對學校資源進行了合理的利用。但對一些特殊要求還是無法具體體現出來。
3 基於時間片優先級排課算法描述與分析
排課問題實質上是時間、教師、班級、教室、課程這五維關系的沖突問題,要合理的解決這個問題首先要了解排課中的一些基本原則以及排課的一些基本要求。
3.1排課中的基本原則
在課程的編排中應遵循一定的規則, 只有按照基本規則來進行課程的編排才能夠減少沖突的發生, 這些基本規則主要有以下幾條:
1) 同一班級的學生在同一時間(某些特定的選修課時間除外) 不能安排兩門課程
2) 同一教師在同一時間不能安排兩門課程
3) 同一教室在同一時間不能安排兩門課程
4) 同一時間安排的課程總數不能大於所能提供的教室總數
5) 某一課程參加學習的總人數不應大於所安排教室的座位數
6) 所提供教室的屬性與課程所需教室的屬性一致
在時間、教師、班級、教室、課程這五維關系中, 時間、教師、班級三者之間存在着緊密關系。相對而言, 教室與它們關系就不那么密切。
3.2排課的基本要求
課程的安排不是任意的, 為了達到最好的教學效果應遵循一定的要求。這些要求主要有:
1) 要盡量為所排課程安排上該類課效果最好的時間
2) 課程在一周上多次時, 要有一定的間隔性
3) 公共課等涉及面廣、學時多的課程應優先處理
4) 對同一教師, 同一上課對象應盡量選擇相對固定的幾個教室
5) 對同一個班級的課程應選擇相對固定的教室
6) 連着的課的教室選擇不應相隔太遠
7)同一天有幾門課時盡量把課分散
8) 優先滿足一些特殊要求(比如有些教室喜歡上上午的課,可以優先滿足)
3.3基於時間片優先級排課算法描述
在描述算法之前我們把一些概念先講清楚。在這里我們把從行政角度分的班叫自然班,把在同一個教室上課的班叫做排課班。在大學里有些公共課是幾個排課 班通過多媒體來一起上的,我們把這個排課班的總和叫做公共班。班級、教室、教師、課程都維護着自己的一張課表。對課表的每個表元(如星期一的第一節課)在 這里稱做時間片。
基於時間片優先級排課算法以排課班為單位,圍繞着各對像(自然班、教室、教室)的時間表選擇合適的時間片。
<!--[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>*):擦除前面步驟在排課班、教師、班級、教室中寫下的數據
計算機排課是個復雜的過程,在數據量大,約束條件多的條件下,通過人工干涉達到合理排課是非常重要的。人工干涉包括在排課前的一些數據輸入工作,人工進行些預排課,排完課后對課表進行適當的調課。
3.4算法分析
此算法屬於貪心算法。每次對教師、教室資源的選取都是取當前最優的數據。此算法對按照教師、教室、班級的優先級取最優值,所以對各對象的一些特殊要 求會很明顯的體現出來,在教師、教室資源不緊缺的情況下,此算法能排出相對合理的課程。相對於上一章介紹的兩個算法,在處理各種特殊要求的能力上有明顯的 優勢
