自動排課算法分析

1   緒 論算法

 1課題背景與研究意義編程

排課問題早在70年代就證實是一個NP徹底問題,即算法的計算時間是呈指數增加的,這一論斷確立了排課問題的理論深度。對於NP問題徹底問題目前在 數學上是沒有一個通用的算法可以很好地解決。然而不少NP徹底問題目具備很重要的實際意義,例如。你們熟悉地路由算法就是很典型的一個NP徹底問題,路由 要在從多的節點中找出最短路徑完成信息的傳遞。既然都是NP徹底問題,那麼不少路由算法就能夠運用到解決排課問題上,如Dijkstra算法、節點子樹剪 枝構造網絡最短路徑法等等。數組

   目前你們對NP 徹底問題研究的主要思想是如何下降其計算複雜度。即利用一個近似算法來代替,力爭使得解決問題的時間從指數增加化簡到多項式增加。結合到課表問題就是創建 一個合適的現實簡約模型,利用該簡約模型可以大大下降算法的複雜度,便於程序實現,這是解決排課問題一個不少的思路。網絡

在高等院校中,培養學生的主要途徑是教學。在教學活動中,有一系列管理工做,其中,教學計劃的實施是一個重要的教學環節。每學期管理人員都要整理教 學計劃,根據教學計劃下達教學任務書,而後根據教學任務書編排課程表。在這些教學調度工做中,既有大量繁瑣的數據整理工做,更有嚴謹思惟的腦力勞動,還要 填寫大量的表格。所以工做很是繁重。數據結構

加之,隨着教學改革的進行及「211」工程的實施,新的教育體制對課表的編排提出了更高的要求。手工排課時,信息的上通下達是極其麻煩的,而採用計 算機排課,教學中的信息能夠一目瞭然,對於優化學生的學習進程,評估每位教師對教學的貢獻,領導合理決策等都具備重要的意義,必將會大大推動教學的良性循 環。app

 2課題的應用領域數據結構和算法

本課題的研究對開發高校排課系統有指導做用。函數

排課問題的核心爲多維資源的衝突與搶佔,對其研究對相似的問題(特別是與時間表有關的問題:如考試排考場問題、電影院排座問題、航空航線問題)也是個參考。oop

   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 一、N 二、N 三、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 個字符「一、二、三、四、五、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 ) 表示該課程的參與人數; C一、C二、

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算法分析

此算法屬於貪心算法。每次對教師、教室資源的選取都是取當前最優的數據。此算法對按照教師、教室、班級的優先級取最優值,因此對各對象的一些特殊要 求會很明顯的體現出來,在教師、教室資源不緊缺的狀況下,此算法能排出相對合理的課程。相對於上一章介紹的兩個算法,在處理各類特殊要求的能力上有明顯的 優點

相關文章
相關標籤/搜索