Phần này trình bày về một số thuật giải liên quan đến thuật giải mà luận văn đề nghị trong Chương 3 để giải quyết bài toán, các thuật giải liên quan được trình bày gồm
thuật giải Steepest Descent, Tabu Search, Variable Neighborhood Search, Iterated Local Search.
21
2.4.1 Thuật giải Steepest Descent
Ý tưởng của thuật giải là tại mỗi bước lặp, chọn ra một lời giải tốt hơn bước trước đó để tiếp tục cải thiện giải pháp. Quá trình này kết thúc khi không tìm ra được lời giải nào tốt hơn lời giải hiện thời s trong số các lời giải láng giềng của s.
Đây là thuật giải đơn giản và dễ thực hiện. Tuy nhiên, phương pháp tìm kiếm này sẽ dừng lại tại một lời giải tối ưu cục bộ đầu tiên tìm thấy kể từ lời giải khởi tạo và có nhiều khả năng là lời giải này khác xa so với lời giải tối ưu toàn cục. Thuật giải này dễ rơi vào tối ưu cục bộ quá sớm và ít có cơ hội tìm kiếm trong một không gian lời giải rộng lớn hơn. Mặt khác thì tốc độ xử lý nhanh chính là ưu điểm của thuật giải này.
Giả sử s0 là lời giải khởi tạo của bài toán, current là lời giải tốt nhất hiện tại và cũng là lời giải đầu vào cho mỗi vòng lặp. Ở vòng lặp đầu tiên thì current=s0. Danh sách các lời giải láng giềng của lời giải current là N(current). Ta sẽ lặp lại các bước sau cho đến khi không còn lời giải láng giềng nào tốt hơn lời giải tốt nhất hiện tại. Các bước như sau:
- Bước 1: Tạo tập lời giải láng giềng z thuộc N(current) của lời giải current. - Bước 2: Chọn lời giải s là lời giải tối ưu nhất trong tập lời giải trên.
- Bước 3: Nếu lời giải s tốt hơn current thì gán current = s, lời giải này cũng là
lời giải đầu vào cho lần lặp kế tiếp. Nếu lời giải s không tốt hơn current thì dừng thuật giải.
2.4.2 Thuật giải Tabu Search
Thuật giải Tabu Search của Glover [38] là một thuật giải Metaheuristic được ứng dụng phổ biến và rộng rãi vì tính hiệu quả trong việc tìm lời giải gần tối ưu đối với các bài toán lớn. Thuật giải bắt đầu từ một lời giải khởi tạo, Tabu Search sẽ thực hiện lặp đi lặp lại việc tìm kiếm trong miền không gian tìm kiếm của bài toán để tìm ra lời giải tối ưu, tại mỗi bước lặp, thuật giải Tabu Search sẽ tìm kiếm và chọn ra một lời giải tốt nhất trong các 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. Lời giải tốt nhất được chọn có thể không cải thiện được chất lượng lời giải hiện có nhưng
22
nó có khả năng giúp tìm kiếm trong một không gian tìm kiếm lớn hơn và cho phép thoát khỏi tối ưu cục bộ.
Ngoài ra, giải thuật này ngăn chặn lời giải tối ưu cục bộ bằng cách sử dụng cấu trúc ghi nhớ là một danh sách Tabu List giúp ngăn chặn trường hợp chọn lại lời giải đã xem xét. Mục đích chính của Tabu List là ghi nhận lại các lời giải đã được duyệt qua, tránh sự quay vòng trong quá trình duyệt. Tuy nhiên, sẽ rất tốn kém để lưu lại toàn bộ các lời giải, nên Tabu List chỉ giữ lại một số lời giải được duyệt gần nhất và tuỳ bài toán cụ thể mà kích thước Tabu List được xác định lớn hay nhỏ. Việc này giúp tránh tìm kiếm lặp đi lặp lại quanh những lời giải nhất định nhưng đồng thời cũng không loại bỏ hoàn toàn những lời giải này, giúp cho thuật giải không bị bế tắc và có thể thực hiện tiếp được. Hơn nữa, thường thì ta không thể lưu hết toàn bộ cấu trúc giải pháp vào Tabu List mà chỉ ghi nhận lại những thuộc tính đặc trưng cho lời giải (ví dụ như y tá, ngày bắt đầu, danh sách ca làm việc, độ dài danh sách này). Thuật giải còn dùng tiêu chuẩn mong đợi (aspiration criteria) để tránh việc bỏ sót những lời giải có chất lượng tốt nhưng bị bỏ qua do có những thuộc tính nằm trong danh sách Tabu List. Tiêu chuẩn được sử dụng phổ biến nhất là nếu lời giải s có chất lượng tốt hơn lời giải tốt nhất hiện tại thì dù các thuộc tính đặc trưng của lời giải s đã có trong Tabu List, lời giải s vẫn được chọn.
Giả sử s0 là lời giải khởi tạo của bài toán, s là lời giải đầu vào cho mỗi vòng lặp, với vòng lặp đầu tiên thì s=s0, lời giải tốt nhất hiện hành là current. Danh sách các lời giải láng giềng của lời giải s là N(s) và f(s) là hàm đánh giá chất lượng lời giải s, f(s) càng nhỏ thì lời giải càng tối ưu. Ta sẽ lặp lại các bước sau cho đến khi gặp điều kiện dừng. Điều kiện dừng của thuật giải Tabu Search có thể là tổng số lần lặp tối đa, hoặc số lần lặp tối đa mà không cải thiện được chất lượng lời giải. Các bước như sau:
- Bước 1: Tạo tập lời giải láng giềng z thuộc N(s) của lời giải s, với một trong hai tiêu chuẩn sau:
o Các lời giải láng giềng z này chưa có trong Tabu List.
o Lời giải láng giềng cải thiện được chất lượng của lời giải current. f(z)<f(current).
23
- Bước 2: Chọn lời giải s là lời giải tối ưu nhất trong tập lời giải trên. Lời giải này cũng là lời giải đầu vào cho lần lặp kế tiếp.
- Bước 3: Nếu lời giải s tốt hơn current thì gán current = s. - Bước 4: Cập nhật danh sách Tabu List.
2.4.3 Thuật giải Variable Neighborhood Search
Thuật giải Variable Neighborhood Search (gọi tắt là VNS) là một phương pháp Metaheuristic được đề xuất lần đầu tiên bởi Mladenović và Hansen vào năm 1997 [56] cho phép thăm dò không gian tìm kiếm tốt hơn. Trong khi hầu hết các thuật giải tìm kiếm cục bộ chỉ sử dụng một tập láng giềng duy nhất, thì thuật giải VNS lại cho phép tìm kiếm trên nhiều tập láng giềng khác nhau, nhờ đó tăng tính đa dạng lời giải trong quá trình tìm kiếm. Thuật giải VNS còn kết hợp với các thuật giải local search để nâng cao chất lượng tìm kiếm. Ý tưởng của thuật giải là cho các tập láng giềng được định nghĩa sẵn và được sắp thứ tự theo độ ưu tiên cho trước, tại mỗi bước lặp, các tập láng giềng sẽ được duyệt lần lượt, nếu lời giải láng giềng tốt nhất (lời giải tối ưu cục bộ) của tập láng giềng đó không thể cải thiện chất lượng lời giải hiện tại, thì tập láng giềng kế tiếp sẽ được chọn. Hình 2.1 bên dưới minh hoạ thuật giải VNS với ba tập lời giải láng giềng Nk1, Nk2, Nk3.
Ta giả sử Nk là danh sách các tập láng giềng với k là biến đếm, k=1,2,…,kmax. Lời giải khởi tạo của bài toán là s0, và Nk(s) là danh sách các lời giải trong tập láng giềng thứ k
của lời giải s. Ta sẽ lặp lại các bước sau cho đến khi đạt đến điều kiện dừng. Điều kiện dừng của thuật giải VNS có thể là thời gian chạy tối đa cho phép, số lần lặp tối đa, hoặc số lần lặp tối đa giữa hai lời giải có cải thiện chất lượng. Các bước như sau:
- Bước 1 (Khởi tạo k): chọn tập láng giềng đầu tiên (k=1).
- Bước 2: Lặp lại thứ tự sau cho đến khi duyệt xong tập láng giềng cuối cùng ( ≤ ).
o Bước 2.1: Shaking (tạm dịch là bước rung chuyển): chọn lời giải ngẫu nhiên s trong các lời giải thuộc tập láng giềng thứ k của lời giải hiện tại current.
24
o Bước 2.2: Local search (bước tìm kiếm cục bộ): áp dụng thuật giải tìm kiếm cục bộ cho lời giải đầu vào s, tìm ra s* là lời giải tối ưu cục bộ của tập láng giềng thứ k này.
o Bước 2.3: Move neighborhood (bước này so sánh chất lượng lời giải và chuyển sang tập láng giềng khác): nếu lời giải tối ưu cục bộ s* ở bước
2.2 tốt hơn lời giải current thì current=s* và bắt đầu lại từ tập láng giềng đầu tiên, ngược lại thì chuyển qua tập láng giềng kế tiếp.
Hình 2.1. Minh hoạ thuật giải VNS[56]
Về cơ bản, thuật giải VNS dễ áp dụng, dễ dùng và hiệu quả cao trong việc tạo ra lời giải gần với lời giải tối ưu trong thời gian tính toán vừa phải, hoặc ít nhất là thời gian hợp lý [37]. Tuy nhiên với những bài toán rất lớn thì thời gian tìm kiếm là một thử thách lớn cho thuật giải này. Ngoài ra, trong một số trường hợp, khi lời giải s tìm được đã tốt hoặc rất tốt, thì phải đi khá xa để tìm một thung lũng lời giải lớn khác, và hơn nữa, lúc này việc shaking có thể làm cho xác suất tìm thấy một lời giải tốt hơn so với s sẽ thấp. Điều này cho thấy điểm yếu của thuật giải VNS cơ bản. Tuy nhiên, đây là một thuật giải tốt về ý tưởng và chất lượng lời giải, thu hút được nhiều nhà nghiên cứu. Sau này, nhiều cải tiến cho thuật giải đã được đưa ra và có kết quả tốt hơn như các bài báo của Crainic, Gendreau, Hansen, Hoeb và Mladenović [59], Hansen, Jaumard,
Nk1 Nk2
Nk3
Shaking
Lời giải khởi tạo
25
Mladenović và Parreira [57], Hansen, Mladenović và Perez-Brito [58], Lopez, Batista, Pérez và Vega [53].
Procedure Basic Variable Neighborhood Search 1. input: starting solution, s0
2. input: neighborhood operators, {Nk}, k = 1, …, kmax
3. input: Local Search procedure LS, using a different neighborhood operator
4. input: evaluation function, f
5. current s0
6. while stopping criterion not met do
7. k 1;
8. while k ≤ kmax do
9. s a random solution in Nk(current)
10. s* LS(s) 11. if f(s*) < f(current) then 12. current s* 13. k 1 14. else 15. k k + 1 16. end if 17. end while 18. end while
Hình 2.2. Mã giả của thuật giải VNS[37]
2.4.4 Thuật giải Iterated Local Search
Ý tưởng đơn giản của thuật giải này được đề xuất lần đầu tiên bởi Baxter vào năm 1981 [48], nhưng cho đến năm 1998, Stützle [60] mới chính thức phổ biến thuật giải và đặt tên là Lặp tìm kiếm cục bộ Iterated Local Search (gọi tắt là ILS). ILS là một phương pháp Metaheuristic, hay chính xác hơn là một trong những Metaheuristic dựa trên Local Search, vì nó yêu cầu cần có sẵn một thuật giải Local Search. Ý tưởng là khi các thuật giải Local Search bị dừng lại tại một lời giải tối ưu cục bộ s*, thì một
phương thức lặp cho phép sử dụng lại Local Search này cho lời giải s’ được tạo bởi
26
bộ. Việc làm nhiễu perturbation được kiểm soát thông qua history nhằm tạo ra những lời giải đầu vào tốt hơn cho Local Search, làm tăng khả năng tìm được lời giải cải
thiện chất lượng hơn lời giải tối ưu cục bộ. Tại mỗi lần lặp, những history trước đó, có thể là những thông tin về lời giải tối ưu cục bộ trước đó, sẽ không được sử dụng lại.
Hình 2.3. Minh hoạ thuật giải ILS[37]:
Từ lời giải tối thiểu cục bộ s*, ta áp dụng perturbation tạo thành lời giải s’ khác. Sau đó áp dụng thuật giải Local Search, ta tìm ra lời giải s*’ có thể tốt hơn s*.
Gọi s0 là lời giải khởi tạo của bài toán, và s* là lời giải tối ưu cục bộ sau khi áp dụng thuật giải Local Search. Ta sẽ lặp lại các bước sau cho đến khi đạt điều kiện dừng. Điều kiện dừng của thuật giải ILS có thể là số lần lặp tối đa hoặc thời gian lặp tối đa cho phép. Các bước như sau:
- Bước 1: Perturbation (tạm dịch là bước nhiễu loạn): làm thay đổi lời giải s* dựa trên thông tin history tạo ra lời giải mới s’.
- Bước 2: Local Search (bước tìm kiếm cục bộ): áp dụng thuật giải tìm kiếm cục bộ cho lời giải đầu vào s’, tìm ra s*’ là lời giải tối ưu cục bộ tiếp theo.
- Bước 3: AcceptanceCriterion (bước chọn lời giải): nếu s*’ thoả tiêu chuẩn chọn thì s*’ sẽ trở thành lời giải đầu vào cho vòng lặp tiếp theo, nếu không lời giải
đầu vào vẫn sẽ là s*. Có nhiều tiêu chí để chọn lời giải làm lời giải đầu vào s* cho vòng lặp tiếp theo, cụ thể như sau:
27
o Chỉ chuyển qua lời giải tối ưu nhất, nghĩa là nếu lời giải tối ưu cục bộ
s*’ ở bước 2 tốt hơn lời giải tối ưu cục bộ trước đó thì s*=s*’ ngược lại
dùng tiếp tục lời giải s* cũ. Đây là tiêu chí chọn có tính chuyên sâu cao, còn được gọi là better acceptance criterion.
o Luôn chuyển qua lời giải tối ưu vừa tìm được và không chú trọng đến chất lượng lời giải, nghĩa là luôn luôn s*=s*’. Đây là tiêu chí chọn có
tính đa dạng hoá với tên gọi random walk acceptance criterion.
o Tiêu chí còn lại cho phép lựa chọn giữa hai tiêu chí trên.
Procedure Iterated Local Search 1. s0 = GenerateInitialSolution 2. s* = LocalSearch(s0) 3. repeat 4. s’ = Perturbation(s*, history) 5. s*’ = LocalSearch(s’) 6. s*= AcceptanceCriterion(s*, s*’, history)
7. until termination condition met
Hình 2.4. Mã giả của thuật giải ILS[37]
Cần lưu ý rằng trong khi Local Search tập trung tìm kiếm trong không gian lời giải rộng lớn S, thì ILS chỉ cần tập trung tìm kiếm trong không gian lời giải nhỏ hơn gồm các lời giải tối ưu cục bộ. Hơn nữa, thuật giải ILS đơn giản, dễ áp dụng và dễ thực hiện, có thể nói tính đơn giản là một ưu điểm lớn của thuật giải này. ILS được đánh giá cao về hiệu quả [37] trong việc tạo ra lời giải gần với lời giải tối ưu. Thuật giải ILS vừa giữ được tính đơn giản của Heuristic và vừa giữ được tính tổng quát chung của Metaheuristic. Ngoài ra, thuật giải này rất linh động, cho phép người dùng chọn thuật giải Local Search theo ý muốn. Gần đây, thuật giải này được sử dụng khá nhiều như các bài báo của Ilina Stoilkovska [45], M. Stølevik và các cộng sự [40], F. Bellanti và các cộng sự [36], E.K Burke và các cộng sự [25]…
28
C ương 3. Thuật giải đề nghị
Luận văn đề nghị một thuật giải Metaheuristic để giải quyết bài toán xếp lịch y tá. Thuật giải gồm hai giai đoạn: xếp lịch làm việc ban ngày cho các y tá và xếp lịch trực cho các y tá. Trong giai đoạn đầu tiên, bài toán có nhiều ràng buộc cứng, trong đó một số ràng buộc cứng khó thực hiện là H1 về số ca làm việc bắt buộc của y tá trong một tuần, và H3, H4, H5 quy định về trình tự các ca làm việc. Ràng buộc H1 rất dễ bị vi phạm. Nên luận văn đề nghị dùng thuật giải lai Hybrid Metaheuristic, lai giữa Lặp tìm kiếm cục bộ Iterated Local Search và Xáo trộn tham lam Greedy Shuffling. Thuật giải Lặp tìm kiếm cục bộ tập trung giải quyết các vi phạm ràng buộc cứng, sau đó Xáo trộn tham lam cải tiến lịch của tất cả y tá. Trong giai đoạn thứ hai, luận văn dùng Thuật giải Tham lam để tạo lời giải ban đầu và dùng Steepest Descent để cải tiến lời giải.
Nhằm đáp ứng những yêu cầu cá nhân có tính thay đổi theo ngày của các y tá trong bệnh viện, luận văn dùng mô hình xếp lịch không theo chu kỳ (Non-cyclic Schedule) với những thông tin cố định như sau:
- Các ca làm việc trong tuần gồm: ca sớm, ca sáng, ca trễ, và ca cuối tuần.
- Các ca trực trong tuần gồm: trực đêm và trực cuối tuần.
- Các loại y tá gồm: y tá làm việc chính thức full time, y tá làm việc chính thức part time, y tá full time thuộc nhóm Flying Squad, y tá part time thuộc nhóm Flying Squad, y tá nghỉ hưu. Số ngày làm việc trong từng tuần của y tá làm full time là năm ngày/tuần.
- Các ràng buộc cứng, ràng buộc mềm, và những mục tiêu của bài toán. Những thông tin có thể linh hoạt thay đổi gồm:
- Chu kỳ xếp lịch cho y tá: số tuần cần xếp lịch.
- Quy mô của bệnh viện: số lượng y tá của từng loại, số ngày làm việc trên từng tuần của y tá làm part time, lượng y tá cần cho mỗi ca làm việc.
- Sở thích và yêu cầu cá nhân của từng y tá: những ca làm việc thích hoặc không thích làm, số ngày xin nghỉ.
29
3.1 Các bước chuyển được dùng trong thuật giải 3.1.1 Bước chuyển đơn
Bước này sẽ chuyển ca làm việc của một y tá cho y tá chưa được phân làm việc trong cùng một ngày. Đây là bước chuyển cơ bản và đơn giản nhất được dùng trong Local Search của thuật giải Lặp tìm kiếm cục bộ trong giai đoạn xếp lịch làm việc cho y tá.