3.3.1 Bước 1: Khởi tạo một lịch làm việc ban đầu
Lời giải ban đầu được khởi tạo dựa trên ý tưởng của thuật giải Tham lam. Tại mỗi bước, ta thực hiện ba hoạt động riêng biệt:
- Chọn ngày để phân công theo thứ tự từ Chủ Nhật – thứ Hai – … – thứ Bảy. - Chọn loại ca làm việc khó phân công nhất để phân công trước. Trong hai ngày
cuối tuần gồm Chủ Nhật và thứ Bảy ca được chọn là ca cuối tuần. Trong các ngày thường từ thứ Hai đến thứ Sáu, ca làm việc được chọn để phân công sẽ theo thứ tự ưu tiên từ ca trễ, ca sáng, ca sớm. Nghĩa là trong mỗi ngày thường, ta phân công ca trễ trước, nếu hết ca trễ trong ngày thì phân công đến ca sáng, khi hết ca sáng để phân công thì ca sớm sẽ được chọn.
- Phân công ca làm việc đã chọn cho y tá với tiêu chí y tá được chọn là y tá cần ca làm việc đó nhất. Chi tiết về cách chọn y tá theo loại ca làm việc như sau:
o Ca cuối tuần của Chủ Nhật sẽ được phân công cho y tá làm vào thứ Bảy của tuần trước theo yêu cầu của bài toán. Ca cuối tuần của thứ Bảy (tuần hiện tại): y tá được chọn để làm ca này là y tá được phân công chưa đủ số ngày làm việc trong tuần theo quy định.
o Ca trễ: vào thứ Hai, y tá được chọn làm ca trễ là y tá làm ít ca trễ nhất trong chu kỳ xếp lịch trước đó. Vào những ngày khác, y tá được chọn là y tá cần ca trễ nhất, nghĩa là y tá đã được phân công làm ca trễ trong ngày kế trước.
o Ca sáng: vào thứ Hai, y tá được chọn theo thứ tự, ví dụ như trong tuần cuối của chu kỳ xếp lịch trước đó, ca sáng được phân công cho các y tá 1, 2, …, 8, thì vào tuần đầu tiên của chu kỳ này y tá kế tiếp theo thứ tự sẽ được chọn để phân công. Vào những ngày khác, y tá được chọn là y tá cần ca sáng nhất, nghĩa là y tá đã được phân công làm ca sáng trong ngày kế trước.
35
Phương thức này được lặp đi lặp lại cho đến khi đáp ứng đủ nhu cầu y tá cho các ca làm việc ở bệnh viện. Trong trường hợp thiếu y tá, tức là những y tá làm việc chính thức đã được phân công xong nhưng vẫn còn ca làm việc chưa được phân công, thì ta sẽ phân công cho những y tá sau với độ ưu tiên giảm dần:
- Y tá full time thuộc nhóm Flying Squad - Y tá part time thuộc nhóm Flying Squad - Phân công làm thêm giờ cho:
o Y tá làm việc chính thức part time.
o Y tá part time của nhóm Flying Squad.
o Y tá làm việc chính thức full time.
o Y tá full time của nhóm Flying Squad. - Y tá nghỉ hưu.
3.3.2 Bước 2: Tập trung giải quyết vi phạm ràng buộc với thuật giải Lặp tìm kiếm cục bộ Iterated Local Search
Khi có được lời giải ban đầu, thuật giải dùng Tabu Search để tìm ra lời giải tối ưu cục bộ.
Sau đó lặp lại những bước sau:
- Làm nhiễu perturbation lời giải tối ưu cục bộ này bằng cách xoá và xếp lại lịch
cho một số y tá.
- Dùng lại thuật giải Tabu Search ở trên cho lời giải đã bị làm nhiễu, nhằm tìm ra lời giải tối ưu cục bộ khác.
- Chọn lời giải tốt hơn trong số lời giải tối ưu cục bộ vừa tìm được và lời giải tối
ưu hiện tại để làm lời giải đầu vào cho bước lặp tiếp theo (đây là tiêu chí chọn acceptance criterion).
Việc lặp này được dừng lại khi đạt đến thời gian lặp tối đa cho phép.
Ngoài ra, tại mỗi vòng lặp, số lượng y tá và danh sách các y tá được chọn để xoá lịch sẽ được lưu lại trong history. Tại lần lặp kế tiếp, những danh sách y tá trong các history trước đó sẽ không được chọn lại. Việc này làm tăng khả năng tìm được lời giải
36
Hơn nữa tại mỗi vòng lặp, tiêu chí acceptance criterion để chọn lời giải làm lời giải
đầu vào cho lần lặp kế tiếp cũng đóng vai trò quan trọng. Thuật giải Lặp tìm kiếm cục bộ của luận văn sử dụng tiêu chí chọn có tính chuyên sâu, còn được gọi là better acceptance criterion. Theo tiêu chí này, lời giải tối ưu nhất sẽ được chọn làm lời giải
đầu vào cho lần lặp kế tiếp.
Mã giả của toàn bộ quá trình này được trình bày ở Hình 3.7 với MaxTime là thời gian tối đa cho các vòng lặp của thuật giải, và f(s) là tổng điểm phạt cho các vi phạm của lời giải s.
Hình 3.7. Mã giả của thuật giải Lặp tìm kiếm cục bộ
Bước 2a: Tabu Search
Cải thiện lịch làm việc ban đầu của các y tá với Bước chuyển đơn
Thuật giải sẽ tập trung tìm kiếm lời giải trong vùng không gian của tập láng giềng
Bước chuyển đơn (Move single shift). Tập láng giềng này gồm các lời giải láng giềng
Procedure ITERATED_LOCAL_SEARCH(s0)
1. Đặt s0 = lời giải khởi tạo ban đầu
2. sbest = TabuSearch(s0)
3. Đặt t = tstart= thời gian hiện tại
4. While (t < MaxTime) do
5. ListIdNurses ← Lấy ngẫu nhiên một y tá vi phạm ràng buộc cứng, một số
y tá vi phạm ràng buộc mềm, và một số y tá khác.
6. Đặt s = sbest
7. Xoá tất cả lịch làm việc của các y tá trong ListIdNurses ở lời giải s
8. Khởi tạo lại lịch làm việc cho các y tá trong ListIdNurses ở lời giải s
9. Gán s’ = TabuSearch(s)
10. If (f(s’) < f(sbest)) then
11. sbest = s’
12. End if
13. tend= thời gian tại thời điểm này
14. t = tend – tstart
15. End while
37
được tạo ra bằng cách thay đổi một số thành phần trong lời giải hiện tại, mà cụ thể là bằng cách di chuyển một ca làm việc từ y tá này sang y tá khác trong cùng một ngày, nhằm cố gắng giảm số lượng y tá được phân công không đủ số ngày làm việc trong tuần (vi phạm ràng buộc cứng được bỏ qua trong bước 1) và giảm lượng y tá làm nhiều hơn số ngày làm việc trong tuần theo hợp đồng.
Cần lưu ý rằng, trong mỗi tuần ta chỉ di chuyển một ca làm việc từ y tá này sang y tá khác trong cùng ngày với phạm vi từ thứ Hai đến thứ Bảy. Việc di chuyển ca làm việc trong ngày Chủ Nhật của tuần không được quan tâm vì bài toán yêu cầu nếu y tá làm vào thứ Bảy của tuần trước thì bắt buộc làm việc vào Chủ Nhật của tuần này. Do đó ca làm việc của những y tá làm việc vào Chủ Nhật không được thay đổi trừ khi ta di chuyển cả hai ca làm việc của thứ Bảy tuần trước và Chủ Nhật tuần này cho một y tá khác, tuy nhiên điều này sẽ khiến cho y tá dễ bị vi phạm ràng buộc cứng H1 về số ca làm việc bắt buộc của y tá trong một tuần và không giúp tìm ra được lời giải tốt hơn. Tại mỗi bước lặp của thuật giải, từ thứ Hai đến thứ Bảy ta xem xét những bước chuyển
đơn chuyển một ca làm việc c của một y tá A sang y tá B nếu thoả hai điều kiện sau:
- Y tá B chưa được phân công trong ngày đó.
- Ca làm việc c có thể được phân công cho y tá B mà không vi phạm bất cứ ràng
buộc cứng nào.
Sau đó ta chọn ra lời giải tốt nhất s trong những lời giải láng giềng từ các bước chuyển
đơn hợp lệ. Lời giải tốt nhất này sẽ được chọn làm lời giải đầu vào cho bước lặp tiếp
theo. Quá trình này được lặp đi lặp lại cho đến khi đạt đến số lần liên tiếp tối đa mà lời giải s không cải thiện được chất lượng so với lời giải tốt nhất hiện có.
Trong quá trình tìm kiếm, một số thông tin của bước chuyển tạo ra lời giải tốt nhất s sẽ được lưu vào danh sách Tabu List nhằm tránh trường hợp cũng trong ngày đó, y tá lại được phân công vào ca làm việc mà trước đó nó đã chuyển đi. Những thông tin được lưu lại trong Tabu List gồm (y tá chuyển A, ngày chuyển d, ca chuyển c), cho biết rằng y tá A đã chuyển một ca làm việc c trong ngày d cho y tá khác, do đó việc phân công
38
List và không bị cấm nữa sau TabuTenure bước lặp kế tiếp. Giá trị nguyên TabuTenure = 0.8*N, với N là tổng số y tá cần phân công làm việc. Công thức này được tham khảo trong bài báo của Zhipeng Lü và Jin-Kao Hao [63], nhóm đoạt giải Ba tại vòng 1 và giải Tư tại vòng 2 của cuộc thi Xếp lịch Y tá Quốc tế lần thứ nhất INRC- 2010 tại Bắc Ailen vào năm 2010. Lưu ý rằng sự so sánh chất lượng giữa các lời giải trong tập láng giềng này dựa trên hàm mục tiêu của cả bài toán và lời giải thu được cuối cùng là một lời giải tối ưu cục bộ của tập láng giềng Bước chuyển đơn.
Mã giả của thuật giải như Hình 3.8 với current là lời giải tốt nhất hiện có thu được từ
các bước trước, TL là danh sách Tabu List, MaxNotImprove là số lần liên tiếp tối đa
mà lời giải không cải thiện được chất lượng so với lời giải tốt nhất hiện có, N(s) là tập các lời giải láng giềng được tạo từ lời giải s, f(s) là tổng điểm phạt của lời giải s với
điểm phạt càng nhỏ thì chất lượng lời giải càng tốt, argmin trả về lời giải tốt nhất trong tập các lời giải láng giềng.
Hình 3.8. Mã giả của thuật giải Tabu Search với Bước chuyển đơn
Procedure TABU_SEARCH_MOVE_A_SHIFT(current)
1. Đặt sbest = s = current 2. Đặt n = 0
3. Đặt TL = rỗng
4. While (n < MaxNotImprove) do
5. Gán n = n+1
6. Tạo tập lời giải láng giềng 𝑧 ∈ N(s) từ các bước chuyển đơn m hợp lệ, với thông tin của m phải không có trong TL, hoặc f(z) < f(sbest)
7. Gán s = argmin z є N(s) { f(z) } 8. If ( f(s) < f(sbest)) then 9. sbest = s 10. n = 0 11. End if 12. Cập nhật danh sách TL 13. End while
39
Cải thiện lịch của y tá có lịch tệ nhất với Bước hoán chuyển đồng loạt
Sau N lần liên tiếp tối đa mà Bước chuyển đơn không giúp tìm ra lời giải tốt hơn lời
giải tốt ưu hiện tại, thì chuyển qua bước hoán chuyển đồng loạt. Bước này sẽ tập trung cải thiện chất lượng lịch của một y tá có tổng giá trị các điểm phạt vi phạm ràng buộc nhiều nhất trong tất cả y tá. Bước này giúp giảm tối thiểu các vi phạm ràng buộc cứng mà bước chuyển đơn không giải quyết được.
Từ lời giải hiện có, tập láng giềng được tạo bởi Bước hoán chuyển đồng loạt các ca
làm việc của y tá có lịch tệ nhất với những y tá khác trong khoảng thời gian từ một ngày đến bốn ngày (một nửa khoảng thời gian đang xếp lịch, tức là một nửa của một tuần). Chiến lược này được tham khảo từ nghiên cứu về bài toán xếp lịch của E.K. Burke, P.D. Causmaecker, S.Petrovic and G.V. Berghe [39]. Việc hoán chuyển các ca làm việc của y tá A có lịch tệ nhất với y tá B được xem là hợp lệ nếu thoả cả hai điều
kiện:
- Các ca làm việc của y tá A trong khoảng thời gian p có thể được phân công cho y tá B mà không vi phạm bất cứ ràng buộc cứng nào.
- Và ngược lại, những ca làm việc của y tá B trong khoảng thời gian p cũng có
thể được phân công cho y tá A mà không vi phạm bất cứ ràng buộc cứng nào. Sau đó, ta chọn lời giải tốt nhất s trong những lời giải láng giềng để làm lời giải đầu vào cho bước lặp tiếp theo, và chỉ dừng lại khi đạt đến số lần liên tiếp tối đa mà lời
giải s không cải thiện được chất lượng so với lời giải tốt nhất hiện có. Danh sách Tabu List của bước hoán chuyển đồng loạt gồm những thông tin (y tá hoán chuyển, tổng số
ngày hoán chuyển p, ngày hoán chuyển thứ nhất, ca hoán chuyển của ngày thứ nhất, …, ngày hoán chuyển thứ p, ca hoán chuyển của ngày thứ p). Giá trị TabuTenure bằng
0.8*N, với N là tổng số y tá cần phân công làm việc. Tiêu chuẩn mong đợi là nếu bước hoán chuyển những ca làm việc c đã bị cấm trong Tabu List có thể tạo ra lời giải tốt
hơn lời giải tốt nhất hiện có thì lời giải đó vẫn được chọn. Chiến lược này giúp tránh bỏ sót những lời giải có chất lượng tốt.
40
Bước 2b: Perturbation làm nhiễu lời giải tối ưu cục bộ
Bước này giúp chuyển sang tìm kiếm ở không gian tìm kiếm mới. Hay nói cách khác, bước xoá và xếp lại lịch làm tăng tính đa dạng (diversification) của không gian lời giải và làm tăng cơ hội tìm được lời giải tối ưu khác.
Các ràng buộc cứng về trình tự của các ca làm việc (H3, H4, H5) là những ràng buộc khó. Nên sau khi dùng Tabu Search, đôi khi lời giải vẫn còn y tá vi phạm ràng buộc. Lý do là trình tự các ca làm việc của y tá này khó có thể nhận thêm những ca khác hoặc chuyển đổi các ca với y tá khác. Ý tưởng để giải quyết vấn đề này là sắp xếp lại trình tự các ca làm việc cho y tá này để có cơ hội giải quyết được những vi phạm và tìm được lời giải tốt hơn. Ta sẽ lần lượt xoá lịch của một y tá vi phạm ràng buộc và một số y tá khác, sau đó xếp lại lịch cho những y tá này. Số lượng y tá được chọn để xoá và xếp lại lịch sẽ được lấy ngẫu nhiên từ bốn đến sáu y tá theo tham khảo từ H. Frøyseth, M. Stølevik và A. Riise [40]. Những y tá này gồm một trong số các y tá được phân công không đủ số ngày làm việc trên tuần (vi phạm H1), một số y tá được chọn ngẫu nhiên trong số các y tá vi phạm ràng buộc mềm, và số y tá còn lại được lấy ngẫu nhiên trong các y tá khác. Việc lấy ngẫu nhiên này giúp tránh việc rơi vào chu trình, tức là tránh trường hợp tất cả những y tá này lại được chọn trong lần lặp sau.
Thuật giải xếp lại lịch là thuật giải khởi tạo lịch ở bước 1, chỉ khác ở trình tự ngày để xếp lịch, ở thuật giải khởi tạo trình tự ngày được xếp lịch từ Chủ Nhật – thứ Hai – thứ Ba – … – thứ Bảy, trong khi ở thuật giải xếp lại lịch này thì ngày có tổng số ca làm việc chưa được phân công nhiều nhất sẽ được chọn để xếp lịch trước.
3.3.3 Bước 3: Cải thiện lịch cho tất cả y tá với Xáo trộn tham lam
Bước này tập trung tìm kiếm lời giải trong vùng không gian của tập láng giềng được tạo bởi Bước hoán chuyển đồng loạt các ca làm việc giữa hai y tá bất kỳ trong khoảng thời gian từ một ngày đến bốn ngày. Việc này giúp xem xét tất cả bước chuyển có thể cải tiến lời giải.
Thuật giải Steepest Descent được áp dụng cho bước này. current là lời giải tốt nhất hiện có. Tại mỗi bước lặp của thuật giải, những lời giải láng giềng được tạo từ current
41
với các bước hoán chuyển đồng loạt hợp lệ. s là lời giải tốt nhất trong số những lời giải láng giềng này. Nếu s tốt hơn lời giải tốt nhất hiện tại thì s trở thành lời giải đầu vào cho bước lặp tiếp theo. Đồng thời, s cũng trở thành lời giải tốt nhất hiện có current
= s. Quá trình này được lặp đi lặp lại cho đến khi lời giải láng giềng tốt nhất s không
cải thiện được chất lượng so với lời giải tốt nhất hiện có current.