• 沒有找到結果。

護理人員換班問題之圖形演算法設計

在文檔中 中 華 大 學 (頁 39-53)

4-1 圖形演算法之設計

在3-1 節所提到的換班圖形是如何透過圖形演算法來轉換呢?最重要的是護理人 員提出某日某班需要換班的需求,透過換班資訊將護理人員某日班表轉換成換班圖形 之節點,並透過節點之間的換班資訊建立邊線,形成換班圖形之後便可找出循環換班 之方式。

如圖4-1 所顯示的,在護理人員提出換班的需求之後,我們便可以將護理人員所 提出的換班日期7 月 8 日當天的班表資料讀取出來。

圖4-1:讀取 7 月 8 日之排班表

將7 月 8 日之班表讀取出來之後,可以紀錄在陣列中。而讀取出來的資料有:

1. 護理人員的姓名 2. 當天的值班班別

讀取出資料後,我們先將用編號代表護理人員的姓名,依序將每位護理人員標上編 號,例如:第一位護理人員為游敏敏,標上編號1 號;第二位為王筑筑,標上編號 2 號,餘類推。

因此,將護理人員的姓名用編號取代,在陣列中會紀錄兩筆資料:

1. 護理人員編號 2. 當天值班班別

如表4-1 中所顯示的,取而代之的是代表護理人員的編號及當天值班班別。一位護理 人員會對應一個班別,透過陣列的方式將換班資訊儲存起來。

表4-1:紀錄護理人員的編號及當天值班班別

接下來就是開始判斷是否能夠換班,若可以換班再將所有可以換班的班別紀錄於 陣列中。而輪值排班之班別有:白班(D)、小夜班(E)、大夜班(N)及休假(R),共有四 種班別。我們該如何判斷當天值班之班別是否可以換成別的班別呢?答案在於透過硬 限制的檢查,我們便可以找出所有可以換班的班別。依照硬限制之橫列條件規定而逐 一檢查:

(1) 上班天數不可連續超過 7 天( ≦ 7 天),後面一定要休假。

(2) 小、大夜班之後不可以接白班。

(3) 大夜班之後不可以接小夜班。

舉例來說:1 號當天是大夜班(N),而可能可以換班的班別有:白班、小夜班、休假。

我們必須一個一個檢查每個班別是否能夠與1 號的大夜班進行換班,而針對上述之硬 限制來逐一檢查是否符合規定。

護理人員編號 班別

1 N 2 D 3 E 4 R 5 E 6 E

首先,先檢查是否能換成白班(D)?7 月 8 日當天的班別為 N,若換成 D,必須前 後檢查是否有違反硬限制,而往前檢查的結果發現7 月 7 日的班別為 N,若 7 月 8 日 換成D,則違反大夜班之後不可以接白班之規定,因此不能換成 D,於是我們在陣列 中D 的位置標示不能換班的記號為「0」。

接著檢查是否能換成小夜班(E)?若換成 E,往前檢查 7 月 7 日的班別為 N,這樣 會違反大夜班之後不可以接小夜班之規定,於是在陣列中E 的位置紀錄為「0」。

最後檢查是否能換成休假(R)?若換成 R,往前檢查會找到 7 月 7 日為 N,往後 檢查找到7 月 9 日為 N,並不會違反任何一個硬限制之規定,於是我們在陣列中紀錄 R 的位置是可以換班的記號為「1」。

如表4-2 所顯示的,透過硬限制之規定可找出所有換班可能,並利用結構陣列的 方式紀錄所有可以換班之班別。透過表4-2 的換班資訊將圖形節點所需要的資訊儲存 於陣列中。

表4-2:將 7 月 8 日的班表轉成陣列儲存

我們將表4-2 中的換班資訊,可轉換成圖形節點,如圖 4-2 所顯示的,1 號護理 人員值大夜班(N),可以換班的班別有:休假(R)。2 號護理人員值白班(D),可以換班 的班別有:休假(R),餘類推。因而形成一個換班之圖形節點。

護理人員編號 班別

可換班之班別

D E N R

1 N 0 0 0 1

2 D 0 0 0 1

3 E 0 0 0 1

4 R 0 1 0 0

5 E 1 0 1 1

6 E 1 0 0 1

圖4-2:將 7 月 8 日之結構陣列轉換成圖形節點

從圖形節點之陣列中,可以找出節點之間的關係,並延伸出圖形之邊線。找出邊 線後,我們可以利用相鄰矩陣法來儲存圖形之邊線。如何透過節點陣列之資訊找出邊 線?找出節點陣列之資訊中的關聯性,舉例來說:1 號原本班別為 N,找到陣列中 5 號可換成N,於是便在 1→5 之間標上記號「1」。而 1 號不能與其他編號之護理人員 換班,我們亦需要將不能換班之編號標上記號「0」。2 號原本班別為 D,找到 5、6 號護理人員都可以換成D,便在 2→5 及 2→6 標上記號「1」,其餘無法換班則標上記 號「0」,餘類推。透過這樣的步驟可找出所有的邊線,並紀錄在矩陣中。如圖 4-3 所 顯示的,透過圖形節點之陣列中找出所有邊線,並將所有邊線都儲存在相鄰矩陣中。

圖4-3:邊線矩陣

1 2 3 4 5 6

1 0 0 0 0 1 0

2 0 0 0 0 1 1

3 0 0 0 1 0 0

4 1 1 1 0 1 1

5 0 0 0 1 0 0

6 0 0 0 1 0 0

1 N

R 2

D R

3 E R 6

E D, R

5 E D, N, R

4 R E

透過表 4-2 的圖形節點之陣列與圖 4-3 的邊線矩陣,我們可以建立換班的圖形如 圖4-4。透過圖形演算法將護理人員換班當天之班表資訊,轉換成換班圖形,從圖形 中找出所有可以換班的組合,以提供護理人員換班之需求。

圖4-4:換班圖形

在排班表轉換成圖形的過程中,我們透過結構陣列紀錄節點,並利用相鄰矩陣法 來紀錄節點之間所產生的邊線,透過演算法亦能勾勒出一個完整的換班圖形。

接下來我們要透過圖形演算法所轉換的換班圖形,找出圖形中可以換班的有向迴 圈之換班解,若找到多種迴圈之換班解,便將所有的迴圈之換班方式列出來,提供給 護理人員從多種迴圈之換班解中,找到一組最符合自己換班需求的可行解,以滿足護 理人員的換班需求。

1 N

R 2

D R

3 E R 6

E D, R

5 E D, N, R

4 R E

4-2 從換班圖形中找出有向迴圈之換班解之演算法設計

透過換班圖形,我們該如何從中找出是否有迴圈之換班方式?在本文中利用演算 法之技巧來找出有向迴圈之換班解。我們運用到的演算法有:

1. 深先搜尋法 (depth-first search, DFS) 2. 回溯法 (backtracking)

我們透過深先搜尋法及回溯法可以找出所有迴圈之換班解及最短迴圈之換班解,運用 兩種不同的演算法解決護理人員之換班問題,以滿足護理人員換班之需求。

4-2-1 運用深先搜尋法找換班解

深先搜尋法是透過遞迴的概念,走訪所有的節點,針對每一個節點進行檢查,便 可找出換班迴圈。在走訪每一個節點的過程中,會從編號較小的開始拜訪,從小編號 檢查到大編號,拜訪完一節點之後若無法再往下走,便往回走,走回上一個節點再繼 續走下一個節點,仔細檢查每一個節點所產生的路徑是否能返回起始點。

以圖4-4 為例,若 5 號護理人員提出需要換班的需求,5 號節點為樹根,並往下 尋找其他節點是否有可回到樹根5 號節點的迴圈。而 5 號節點只有一個換班之方法,

就是和4 號節點換班,於是從 5 號出發至 4 號(5→4),接著 4 號可以走到 1、2 號,

而1、2 號又可以走回 5 號,便找到二組迴圈之換班解,4 號也可以直接走回 5 號,

這也是一組迴圈之換班解,所以我們發現可以從圖4-4 中,可以找到三組有向迴圈之 換班解:

(1) 5 → 4 → 1 → 5 (2) 5 → 4 → 2 → 5 (3) 5 → 4 → 5

透過深先搜尋法讓我們找到三組迴圈之換班解,並藉由圖4-4 可以畫出如圖 4-5 之樹狀圖,以樹狀圖的方式紀錄深先搜尋法走訪每一個節點的過程。以5 號節點為樹 根,開始尋找迴圈。針對每一個節點進行檢查,是否可以回到5 號節點,若找到便是 一組迴圈換班解,這是深先搜尋法尋找迴圈換班解的方式。

圖4-5:以深先搜尋法之方式建立其換班樹狀圖

深先搜尋法的方式可以運用在護理長完成班表後,若不符合護理人員之上班期 望,便可提出換班需求。護理人員提出換班需求之後,不限定任何換班要求,透過深 先搜尋法可以找出所有的迴圈之換班組合,提供給護理人員多種換班方式進行換班。

隨著找到的迴圈越長,表示需要協調換班的護理人員就越多,也就需要越多的時間來 協調換班,因此運用深先搜尋法找出換班解之後,需要較多時間協調換班,所以護理 人員需要較早提出換班需求。而深先搜尋法較耗時,原因在於需要檢查每一個節點可 以走訪的路徑是否有可以返回起點的迴圈,會花費較多的時間逐一檢查。但其效果是 好的,可以找到所有的換班組合。

5

2 5 6

5 5 6

4 4

1 3

4-2-2 運用回溯法找換班解

回溯法的原理是利用深先搜尋法(depth-first search,DFS)與界限函式

(bounding function)來找出最短換班人數解。利用深先搜尋法,可以產生所有護理 人員之換班解,再透過界限函式檢查是否有找到最短路徑可返回出發點,若有即找到 最短換班解,以求快速搜尋換班解之方式。當問題的解答是由一系列的選擇所組成 時,可以用回溯法來縮小選擇的範圍。回溯法找出來的換班解為深先搜尋法的部分換 班解,而我們可以透過回溯法找到最短的迴圈之換班方式。

再以上述例子為例,5 號護理人員提出換班,以 5 號節點當作樹根作為出發點,

尋找迴圈之換班組合。透過回溯法的方式,從5 號節點開始,便以 5 號節點為樹根,

尋找其他節點是否能夠回到5 號的方式找換班解。於是從 5 號出發至 4 號(5→4),回 溯法會檢查4 號節點是否能夠直接走回起始點,檢查發現 4 號節點可直接走回 5 號,

於是便會停住,不會再繼續向下延伸。回溯法在找到解之後便會停止尋找其他的解 答。所以並不會像深先搜尋法會檢查每一個節點,而找到三組迴圈換班解,運用回溯 法只找到一組換班解:

(1) 5 → 4 → 5

我們可以透過回溯法讓我們找到一組最短的迴圈之換班方式,藉由圖4-4 可以畫出如 圖4-6 之樹狀圖,以樹狀圖的方式紀錄回溯法走訪的過程。

圖4-6:以回溯法之方式建立其換班樹狀圖 5

4 B

回溯法可以運用在臨時或緊急狀況下的換班。若某護理人員臨時需要換班,提出 換班需求之後,透過回溯法,找到最短的迴圈之換班路徑,對於需要換班之護理人員 來說,可能只需要和一位護理人員協調換班即可,可以達到省時之效果,並不需要與 很多人互相換班,也可為護理人員省下不少協調換班的時間。因為回溯法的方式是找 到最短的迴圈之換班路徑,換班的人數越少越好,因此運用回溯法會較為省時。

4-2-3 深先搜尋法與回溯法之差異

      我們運用深先搜尋法及回溯法兩種演算法的過程中,發現兩種演算法找出來的換 班解有很大的差異,深先搜尋法是會將所有的換班解都找出來,而回溯法找到解之後 就會停住,不再往下尋找,是為尋找最短換班方式,讓換班人數越少越好。

以上述的例子來說,以圖4-7 為例,5 號護理人員想要換班,我們運用深先搜尋 法可以找到三組迴圈之換班解:

(1) 5 → 4 → 1 → 5 (2) 5 → 4 → 2 → 5 (3) 5 → 4 → 5

而運用回溯法只會找到一組換班解:

(1) 5 → 4 → 5

圖4-7:7 月 8 日之換班圖形

1 N

R 2

D R

3 E R 6

E D, R

5 E D, N, R

4 R E

在文檔中 中 華 大 學 (頁 39-53)

相關文件