ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
NGUYỄN HỮU CHUYÊN
THUẬT TOÁN XẤP XỈ
ỨNG DỤNG VÀO MỘT SỐ BÀI TOÁN LỚP NP
LUẬN VĂN THẠC SỸ KHOA HỌC MÁY TÍNH
Thái Nguyên – 2020
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
NGUYỄN HỮU CHUYÊN
THUẬT TOÁN XẤP XỈ
ỨNG DỤNG VÀO MỘT SỐ BÀI TOÁN LỚP NP
LUẬN VĂN THẠC SỸ KHOA HỌC MÁY TÍNH
Chuyên ngành: KHOA HỌC MÁY TÍNH
Mã số: 84 8 01 01
Người hướng dẫn: TS. Vũ Vinh Qua
72 trang |
Chia sẻ: huong20 | Ngày: 13/01/2022 | Lượt xem: 365 | Lượt tải: 0
Tóm tắt tài liệu Luận văn Thuật toán xấp xỉ ứng dụng vào một số bài toán lớp Np, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ang
Thái Nguyên - 2020
i
LỜI CẢM ƠN
Để hoàn thành luận văn này trước tiên, em xin được gửi lời cảm ơn sâu
sắc tới thầy giáo hướng dẫn TS. Vũ Vinh Quang đã tận tình hướng dẫn và đưa
ra nhiều ý kiến đóng góp cho em trong suốt quá trình thực hiện và hoàn thành
luận văn này.
Em cũng xin được gửi lời cảm ơn đến các thầy giáo, cô giáo Trường
Đại học Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên trực
tiếp giảng dạy và truyền đạt những kiến thức quý báu cho em trong suốt quá
trình học tập tại trường.
Mặc dù đã cố gắng hoàn thành luận văn trong phạm vi và khả năng của
mình, tuy nhiên sẽ không tránh khỏi những thiếu sót. Em rất mong nhận được
sự cảm thông và chỉ bảo của quý thầy cô và các bạn. Em xin chân thành cảm
ơn.
ii
LỜI CAM ĐOAN
Tôi xin cam đoan Luận văn “Thuật toán xấp xỉ ứng dụng vào một số
bài toán lớp NP” là do tôi thực hiện dưới sự hướng dẫn trực tiếp của thầy TS.
Vũ Vinh Quang. Các kết quả, số liệu nêu trong luận văn là trung thực.
Tất cả những tham khảo từ những nghiên cứu liên quan đều được nêu
rõ nguồn gốc trong danh mục tài liệu tham khảo và được chỉ rõ tham khảo
trong tài liệu nào. Mọi sao chép không hợp lệ và vi phạm quy chế đào tạo, tôi
xin chịu hoàn toàn trách nhiệm.
HỌC VIÊN
Nguyễn Hữu Chuyên
iii
MỤC LỤC
LỜI CẢM ƠN ............................................................................................................ I
LỜI CAM ĐOAN .................................................................................................... II
DANH MỤC CÁC BẢNG ....................................................................................... V
DANH MỤC CÁC HÌNH ........................................................................................ V
LỜI MỞ ĐẦU ............................................................................................................ 1
CHƯƠNG 1................................................................................................................ 2
MỘT SỐ KIẾN THỨC CƠ BẢN ............................................................................ 2
1.1 Thuật toán ............................................................................................................ 2
1.1.1 Khái niệm bài toán ........................................................................................ 2
1.1.2. Khái niệm thuật toán .................................................................................... 2
1.1.3. Các yêu cầu của thuật toán .......................................................................... 2
1.1.4 Các phương pháp mô tả thuật toán .............................................................. 3
1.2. Độ phức tạp của thuật toán ............................................................................... 4
1.2.1. Chi phí phải trả cho một quá trình tính toán .............................................. 4
1.2.2. Thời gian thực hiện giải thuật ..................................................................... 4
1.2.3. Độ phức tạp của thuật toán .......................................................................... 5
1.2.4. Các qui tắc xác định độ phức tạp thuật toán .............................................. 6
1.3. Vấn đề phân lớp các bài toán. ........................................................................... 6
1.4 Mô hình Bài toán Knapsack ............................................................................... 7
Hình 1.1 Bài toán xếp ba lô dạng 0-1 ................................................................... 8
CHƯƠNG 2.............................................................................................................. 13
MỘT SỐ THUẬT TOÁN XẤP XỈ ........................................................................ 13
2.1 Khái niệm về thuật toán xấp xỉ ........................................................................ 13
2.2 Phương pháp quy hoạch động ........................................................................ 15
2.2.1 Một số khái niệm ......................................................................................... 15
2.2.2 Các bước thực hiện ..................................................................................... 16
2.3 Phương pháp tham lam .................................................................................... 19
2.3.1 Giới thiệu chung .......................................................................................... 19
2.3.2 Đặc trưng của phương pháp tham lam ...................................................... 20
2.3.3 Các thành phần cơ bản ............................................................................... 20
iv
2.3.4 Các bước xây dựng thuật toán tham lam ................................................... 21
2.3.5 Mô hình thuật toán tham lam ..................................................................... 22
2.4 Thuật toán Di truyền GA ................................................................................. 27
2.4.1 Giới thiệu ..................................................................................................... 27
2.4.2 Các khái niệm cơ bản .................................................................................. 28
2.4.3 Thuật toán GA ............................................................................................. 29
2.4.4 Cơ chế thực hiện GA ................................................................................... 29
CHƯƠNG 3.............................................................................................................. 37
MÔ HÌNH BÀI TOÁN LẬP LỊCH TRONG BỆNH VIỆN ................................ 37
3.1 Đặt vấn đề .......................................................................................................... 37
3.2 Giới thiệu tổng quan bệnh viện A .................................................................... 37
3.3 Các mô hình phân công các ca trực ................................................................. 40
3.3.1 Bài toán phân công trực tại các khoa chuyên môn ................................... 41
3.3.2 Bài toán phân công trực tại các Phòng khám............................................ 45
KẾT LUẬN .............................................................................................................. 60
TÀI LIỆU THAM KHẢO ...................................................................................... 61
PHẦN PHỤ LỤC ..................................................................................................... 62
v
DANH MỤC CÁC BẢNG
STT Tên bảng
1 Bảng 2.1 Mô tả bảng phương án của phương pháp quy hoạch động
2 Bảng 3.1: Ma trận ràng buộc B
3 Bảng 3.2: Ma trận ràng buộc Y
4 Bảng 3.3: Lịch trực các buổi trong tuần
5 Bảng 3.4: Số buổi trực đối với các Bác sĩ – Y tá
6 Bảng 3.5: Bảng các Bác sĩ phù hợp với chuyên môn phòng khám (tham lam)
7 Bảng 3.6: Bảng các Y tá phù hợp với chuyên môn phòng khám (tham lam)
8 Bảng 3.7: Bảng các Bác sĩ sẵn sàng nhận buổi trực (tham lam)
9 Bảng 3.8: Bảng các Y tá sẵn sàng nhận buổi trực (tham lam)
10 Bảng 3.9: Lịch trực tại các phòng trong các buổi (tham lam)
11 Bảng 3.10: Số buổi trực đối với các Bác sĩ (tham lam)
12 Bảng 3.11: Số buổi trực đối với các Y tá (tham lam)
13 Bảng 3.12: Bảng các Bác sĩ phù hợp với chuyên môn phòng khám (GA)
14 Bảng 3.13: Bảng các Y tá phù hợp với chuyên môn phòng khám (GA)
15 Bảng 3.14: Bảng các Bác sĩ sẵn sàng nhận buổi trực (GA)
16 Bảng 3.15: Bảng các Y tá sẵn sàng nhận buổi trực (GA)
17 Bảng 3.16: Lịch trực tại các phòng trong các buổi (GA)
18 Bảng 3.17: Số buổi trực đối với các Bác sĩ (GA)
19 Bảng 3.18: Số buổi trực đối với các Y tá (GA)
DANH MỤC CÁC HÌNH
STT Tên hình Hình
1 Khối bắt đầu (Kết thúc)
2 Khối kiểm tra
3 Khối tính toán
4 Cung định hướng
1
LỜI MỞ ĐẦU
Trong thực tế, lớp các bài toán giải được bằng các thuật toán có thời gian đa
thức là không nhiều mà chủ yếu là chúng ta gặp các bài toán tối ưu mà việc tìm lời
giải đúng của bài toán không trong thời gian đa thức (còn gọi là lớp NP, NPC). Để
giải quyết các bài toán này, nói chung người ta phải xây dựng các thuật toán tìm
nghiệm gần đúng tối ưu cho bài toán. Các thuật toán như vậy thường được gọi là
các thuật toán xấp xỉ hay là các thuật toán gần đúng. Các thuật toán này hiện nay là
mục tiêu nghiên cứu quan trọng trong công nghệ thông tin đặc biệt là đối với lớp
các bài toán dữ liệu lớn.
Nội dung chính của luận văn là nghiên cứu cơ sở toán học của các thuật toán
gần đúng giải lớp các bài toán thuộc lớp NP và NPC, tìm hiểu chi tiết các bước mô
tả thuật toán và các yêu cầu thiết kế các thuật toán. Trên cơ sở các thuật toán đã
nghiên cứu, luận văn phân tích một số các bài toán thuộc lớp NP, NPC, xây dựng
lời giải đúng và gần đúng, đánh giá kết quả.
Dự kiến nội dung báo cáo của luận văn gồm: Phần mở đầu, 3 chương chính,
phần kết luận, tài liệu tham khảo, phụ lục. Bố cục được trình bày như sau:
Phần mở đầu của luận văn đưa ra lý do chọn đề tài và hướng nghiên cứu chính của
luận văn.
Chương 1: Trình bày các kiến thức cơ bản về thuật toán và độ phức tạp thuật toán
bao gồm: khái niệm cơ bản về thuật toán, Vấn đề đánh giá độ phức tạp thuật toán.
Phân lớp các bài toán dựa trên độ phức tạp của thuật toán.
Chương 2: Trình bày cơ sở toán học của một số thuật toán xấp xỉ bao gồm: thuật
toán tham lam, thuật toán quy hoạch động, Thuật toán GA và một số mô hình thực
tế về các bài toán NP, NPC như: Bài toán Knapsack , bài toán đổi tiền, bài toán
Domino cùng với các thuật giải tương ứng.
Chương 3: Nghiên cứu mô hình 2 bài toán lập lịch trực các ca tại bệnh viện A Thái
Nguyên bao gồm: Tìm hiểu xây dựng mô hình bài toán, xây dựng các ràng buộc
thực tế và hàm mục tiêu, thiết lập các điều kiện tối ưu. Xây dựng thuật giải các bài
toán bằng thuật toán tham lam và GA và cài đặt thuật toán trên máy tính điện tử.
Tất cả các thuật toán tình bày trong luận văn được cài đặt trên máy tính điện tử bằng
các ngôn ngữ lập trình C++ và Matlab.
2
CHƯƠNG 1
MỘT SỐ KIẾN THỨC CƠ BẢN
VỀ THUẬT TOÁN VÀ ĐỘ PHỨC TẠP CỦA THUẬT TOÁN
Nội dung chính của chương 1 trình bày các kiến thức cơ bản về thuật toán và
độ phức tạp thuật toán bao gồm: khái niệm cơ bản về thuật toán, Vấn đề đánh giá độ
phức tạp thuật toán. Phân lớp các bài toán dựa trên độ phức tạp của thuật toán. Các
kiến thức cơ bản được tham khảo trong các tài liệu [1, 2, 3, 5, 6, 7]
1.1 Thuật toán
1.1.1 Khái niệm bài toán
Một bài toán trong tin học là một bài toán thỏa mãn: xuất phát từ bộ INPUT đầu
vào, chúng ta phải thu được bộ OUTPUT đầu ra.
Một số vấn đề cần quan tâm
+ Bài toán được giải bằng máy tính điện tử
+ Cần làm rõ: dữ liệu cần được đưa vào máy tính (Input) là gì và cần lấy ra
(Output) thông tin gì?
+ Làm thế nào để từ Input ta có được Output? (Thuật toán giải)
Hiển nhiên đối với bài toán tin học là nghiên cứu thuật toán giải bài toán tương ứng.
1.1.2. Khái niệm thuật toán
Định nghĩa 1.1: Thuật toán là một dãy hữu hạn các thao tác được sắp xếp
theo một trình tự nhất định để sau khi thực hiện dãy các thao tác đó, từ input ta có
output cần tìm [1].
Trong lý thuyết thuật toán, cụm từ “thuật toán” đôi khi người ta dùng bằng một từ
khác là “giải thuật”.
1.1.3. Các yêu cầu của thuật toán
Thuật toán phải đảm bảo được các yêu cầu sau đây:
- Tính tổng quan: thuật toán phải đúng đối với mọi bộ dữ liệu đầu vào.
3
- Tính xác định: Các bước của thuật toán phải được trình bày rõ ràng, mạch
lạc, đảm bảo cho người đọc chỉ hiểu theo một nghĩa duy nhất.
- Tính khả thi: Thuật toán phải thực hiện được, nghĩa là ta có thể sử dụng
máy tính kết hợp giữa các ngôn ngữ lập trình để thể hiện thuật toán trong thời gian
hữu hạn.
- Tính dừng: Nếu dữ liệu vào thỏa mãn điều kiện đầu vào thì thuật toán phải
kết thúc và cho ra kết quả sau một số hữu hạn bước.
- Tính chính xác (tính đúng đắn): Thuật toán phải cho kết quả chính xác và
thể hiện đúng đắn trên cơ sở toán học.
- Tính tối ưu: Thuật toán phải có chi phí về không gian bộ nhớ ít nhất và
chạy trong thời gian nhanh nhất.
1.1.4 Các phương pháp mô tả thuật toán
Thuật toán được thể hiện bằng một trong các cách sau:
Phương pháp liệt kê:
Liệt kê lần lượt các bước để thực hiện thuật toán, tại mỗi bước ta sử dụng các ký
hiệu toán học kết hợp với ngôn ngữ tự nhiên (cách này ít khi dùng).
Phương pháp sử dụng sơ đồ khối
Sử dụng ba loại hình khối để thể hiện là: hình elip chỉ điểm bắt đầu hay kết thúc,
hình thoi chỉ khối kiểm tra và hình chữ nhật chỉ khối tính toán. Có một cung định
hướng để chỉ hướng đi của thuật toán.
Khối bắt đầu (kết thúc) Khối kiểm tra Khối tính toán Cung định hướng
Ta kết hợp ba loại hình khối và cung định hướng này để biểu diễn thuật toán.
Mô tả thuật toán bằng các chương trình
Sử dụng ngôn ngữ lập trình để thể hiện thuật toán, cấu trúc chặt chẽ của các ngôn
ngữ lập trình cho phép chúng ta thể hiện thuật toán một cách rõ ràng và dễ hiểu.
Phương pháp này được áp dụng rộng rãi nhất. Trong các tài liệu, các thủ tục thể
hiện thuật toán thường được mô tả bằng ngôn ngữ tựa Algol.
4
1.2. Độ phức tạp của thuật toán
1.2.1. Chi phí phải trả cho một quá trình tính toán
Xét một quá trình tính toán, chi phí phải trả cho một quá trình tính toán bao gồm:
+ Chi phí về không gian: bộ nhớ - số ô nhớ cần sử dụng trong quá trình tính
toán.
+ Chi phí về thời gian: thời gian cần sử dụng cho một quá trình tính toán.
Nếu cho một thuật toán A. Thuật toán này thực hiện trên bộ dữ liệu e. Khi đó
thuật toán A phải trả 2 giá: giá về không gian là LA(e), giá về thời gian là TA(e), e là
bộ dữ liệu vào.
Nhận xét: cùng một thuật toán A mà xác định thực hiện trên các bộ dữ liêu khác
nhau sẽ trả các giá khác nhau. Khi đó ta có các khái niệm về chi phí phải trả trong
các trường hợp như sau:
+ Chi phí phải trả trong trường hợp xấu nhất ứng với bộ dữ liệu xấu nhất so
với Output
+ Chi phí phải trả trung bình: là tổng số các chi phí khác nhau ứng với các bộ
số liệu chia cho tổng số số bộ số liệu.
+ Chi phí phải trả tiệm cận: Đó là biểu thức biểu diễn tốc độ tăng của chi phí
thực tế phải trả. Nó có giá trị tiệm cận với chi phí thực tế.
Nhận xét: Ngày nay do sự phát triển không ngừng của khoa học công nghệ kỹ thuật
điện tử nên chi phí về bộ nhớ không còn là vấn đề cần thiết phải bàn tới mà ta chỉ
quan tâm tới chi phí phải trả về thời gian thực hiện giải thuật. Từ đây ta chỉ xét đến
thời gian thực hiện giải thuật T(n), hay đó chính là độ phức tạp của thuật toán.
1.2.2. Thời gian thực hiện giải thuật
Với một bài toán, không chỉ có một giải thuật. Chọn một giải thuật đưa tới
kết quả nhanh là một đòi hỏi thực tế. Nhưng căn cứ vào đâu để có thể nói được giải
thuật này nhanh hơn giải thuật kia?
Có thể thấy ngay: thời gian thực hiện một giải thuật, (hay chương trình thể
hiện một giải thuật đó) phụ thuộc vào rất nhiều yếu tố. Một yếu tố cần chú ý trước
tiên đó là kích thước của dữ liệu đưa vào. Chẳng hạn thời gian sắp xếp một dãy số
5
phải chịu ảnh hưởng của số lượng các số thuộc dãy số đó. Nếu gọi n là số lượng
này (kích thước của dữ liệu vào) thì thời gian thực hiện T của một giải thuật phải
được biểu diễn như một hàm của n: T(n).
Các kiểu lệnh và tốc độ xử lý của máy tính, ngôn ngữ viết chương trình và
chương trình dịch ngôn ngữ ấy đều ảnh hưởng tới thời gian thực hiện; nhưng những
yếu tố này không đồng đều với mọi loại máy trên đó cài đặt giải thuật, vì vậy không
thể đưa chúng vào khi xác lập T(n). Điều đó có nghĩa là T(n) không thể được biểu
diễn thành đơn vị thời gian bằng giây, bằng phút được. Tuy nhiên, không phải vì thế
mà không thể so sánh được các giải thuật về mặt tốc độ. Nếu như thời gian thực
2
hiện của một giải thuật là T1(n) = c.n và thời gian thực hiện một giải thuật khác là
T2(n) = k.n (với c và k là một hằng số nào đó), thì khi n khá lớn, thời gian thực hiện
giải thuật T2 rõ ràng ít hơn so với thời gian thực hiện giải thuật T1. Như vậy, nếu nói
thời gian thực hiện giải thuật bằng T(n) tỉ lệ với n2 hay tỉ lệ với n cũng cho ta ý
niệm về tốc độ thực hiện giải thuật đó khi n khá lớn (với n nhỏ thì việc xét T(n)
không có ý nghĩa). Cách đánh giá thời gian thực hiện giải thuật độc lập với máy tính
và các yếu tố liên quan với máy như vậy sẽ dẫn tới khái niệm về cấp độ lớn của thời
gian thực hiện giải thuật hay còn gọi là độ phức tạp tính toán của giải thuật.
1.2.3. Độ phức tạp của thuật toán
Định nghĩa 1.2 : Một hàm f(n) được xác định là O(g(n)), kí hiệu f(n) = O(g(n)) nếu
tồn tại các hằng số C và số nguyên n0 sao cho f(n) ≤ Cg(n) với mọi n ≥ n0
Thông thường các hàm thể hiện độ phức tạp tính toán của giải thuật có dạng:
2 3 n n n n
O(log2n), O(n), O(nlog2n), O(n ), O(n ), O(2 ), O(n!), O(n ). Các hàm như 2 , n
3 2
được gọi là hàm loại mũ. Các dạng như n , n , nlog2n, log2n được gọi là các hàm
loại đa thức. Giải thuật với thời gian thực hiện có cấp hàm đa thức thì thường hiệu
quả và chấp nhận được.
6
1.2.4. Các qui tắc xác định độ phức tạp thuật toán
Quy tắc tổng: Giả sử T1(n) và T2(n) là thời gian thực hiện của 2 đoạn
chương trình P1 và P2 kế tiếp nhau T1(n) = O(f(n)); T2(n) = O(g(n)) thì thời gian
thực hiện P1 rồi P2 tiếp theo sẽ là:T1(n)+ T2(n)=O(max(f(n), g(n))).
Quy tắc nhân: Nếu tương ứng với P1 và P2 là T1(n)=O(f(n)); T2(n) =
O(g(n)) thì thời gian thực hiện P1 và P2 lồng nhau sẽ là: T1(n).T2(n) = O(f(n).g(n)).
Chú ý: Trong các ngôn ngữ lập trình, chúng ta có thể đánh giá
+ Thời gian thực hiện mỗi câu lệnh Gán, Read, Write là O(1).
+ Thời gian thực hiện mỗi chuỗi tuần tự các câu lệnh được tính theo quy tắc cộng.
+ Thời gian thực hiện cấu trúc If (điều kiện) then ... được tính bằng thời gian thực
hiện câu lệnh sau then hoặc sau else. Còn câu lệnh điều kiện thường là O(1).
+ Thời gian thực hiện vòng lặp được tính là tổng trên tất cả số lần lặp thời gian thực
hiện thân vòng lặp. Nếu thời gian thực hiện thân vòng lặp là hằng số thì thời gian
thực hiện vòng lặp là tích của số lần lặp với thời gian thực hiện thân vòng lặp.
1.3. Vấn đề phân lớp các bài toán.
Xét một bài toán tin học bất kì, chúng ta quan tâm đến các bài toán có lời giải.
Vì độ phức tạp giải thuật đối với mỗi bài toán là khác nhau, trên cơ sở đó các bài
toán cũng được phân chia thành các lớp thông qua độ phức tạp thuật toán giải
chúng. Chúng ta xét các khái niệm sau:
Lớp bài toán P (Lớp P-Polynomial time): là lớp các bài toán có thể giải
được bằng thuật toán đơn định đa thức có độ phức tạp đa thức
Lớp bài toán NP (Lớp NP - Nondeterministic Polynomial ): là lớp các bài
toán có thể giải được bằng các thuật toán không đơn định đa thức.
Hiện nay chúng ta đang chấp nhận P NP.
Lớp NPC
+ Khái niệm dẫn về được: Bài toán B được gọi là dẫn về được bài toán A một
cách đa thức nếu có một thuật toán đơn định đa thức để giải bài toán A thì cũng có
một thuật toán đơn định đa thức để giải bài toán B. ký hiệu B A.
7
+ Bài toán NP – khó (NP hard): Bài toán A được gọi là NP – khó nếu có bài toán
L A với L NP.
+ Bài toán NP đầy đủ: Bài toán A được gọi là NP đầy đủ (NP-Complate) nếu:
A là NP-khó và ANP.
Từ đây chúng ta định nghĩa về lớp NPC như sau:
Định nghĩa 1.3: Lớp NPC là lớp các bài toán NP đầy đủ, có độ phức tạp hàm
mũ. Qua đó cho thấy: P NPC = Ø
1.4 Mô hình Bài toán Knapsack
Mô hình bài toán Knapsack là vấn đề đã được nghiên cứu trong hơn một thế
kỷ từ năm 1897 cho đến nay. Việc nghiên cứu bài toán Knapsack đã được đưa ra
đầu tiên trong các công trình của nhà toán học Tobias Dantzig (1884-1956). Các
công trình tiếp theo được giới thiệu lần đầu tiên bởi Gallo, Hammer và Simeone vào
năm 1960.
Một công trình nghiên cứu các tác giả thuộc Đại học Stony Brook năm 1998
cho thấy rằng trong số 75 vấn đề về các bài toán NPC, bài toán Knapsack là 1 trong
18 bài toán quan trọng nhất trong lĩnh vực Toán và Công nghệ thông tin.
Bài toán KNAPSACK - Bài toán xếp ba lô là một bài toán tối ưu tổ hợp.
Bài toán được đặt tên từ vấn đề chọn những gì quan trọng có thể nhét vừa vào trong
một cái túi (với giới hạn khối lượng) để mang theo trong một chuyến đi. Các bài
toán tương tự thường xuất hiện trong ngành kinh doanh, lý thuyết tổ hợp, lý thuyết
độ phức tạp tính toán, lý thuyết mật mã học và một số lĩnh vực trong toán ứng dụng.
Bài toán được phát biểu tổng quát như sau:
Có N đồ vật kí hiệu là xx1,..., n . Mỗi đồ vật xj có một giá trị p j và một thể
tích w j , jN1, . Thể tích mà có thể chứa trong ba lô là M . Hãy xác định phương
án chọn các đồ vật để sao cho: số đồ vật chứa vừa trong ba lô và tổng giá trị các đồ
vật được chọn là lớn nhất có thể được.
8
Hình 1.1 Bài toán xếp ba lô dạng 0-1
Hình 1.1 trên là ví dụ về một bài toán xếp ba lô giới hạn 1 chiều: chọn các
hộp nào để làm cực đại lượng tiền trong khi giữ được tổng khối lượng dưới 15 kg?
Bài toán đa chiều có thể xét đến khối lượng riêng và kích thước của các hộp, đó là
bài toán xếp vali điển hình
Trong lớp các bài toán Knapsack, người ta thường đưa ra một số dạng bài
toán điển hình như sau:
+ Bài xếp ba lô 0-1 là bài toán không hạn chế số đồ vật thuộc mỗi loại, bài
toán được mô hình hóa như sau:
n n
Cực đại hóa hàm F(X ) p j x j sao cho w j x j M trong đó
j1 j1
X x1, x2 ,..., xn , x j 0,1,j 1,n .
+ Bài xếp ba lô bị chặn hạn chế số đồ vật thuộc mỗi loại không được vượt
quá một lượng xác định. Bài xếp ba lô bị chặn có thể được phát biểu bằng mô hình
toán học như sau:
n n
Cực đại hóa hàm F(X ) p j x j sao cho w j x j M trong đó
j1 j1
X x1, x2 ,..., xn , x j 0,1,
.
x j 0,bj ,bj N,j 1,n.
9
Một trường hợp đặc biệt của bài toán Knapsack là bài toán thỏa mãn các tính
chất sau đây:
Là một bài toán quyết định
Là một bài toán xếp ba lô dạng 0-1
Phương án tối ưu là số đồ vật xếp vừa khít ba lô.
Đối với dạng bài toán này, trong thực tế thường xuất hiện ở các dạng sau
đây:
Dạng 1: Cho trước một tập các số nguyên, tồn tại hay không một tập con có
tổng đúng bằng 0?
Dạng 2: Cho một tập các số nguyên dương, tồn tại hay không một tập con có
tổng đúng bằng M ?
Các bài toán này được gọi là bài toán tổng các tập con (subset sum problem)
được sử dụng nhiều trong ngành mật mã học.
Tổng quát hóa, từ mô hình bài toán KNAPSACK cũng có rất nhiều cách phát
biểu khác nhau. Sau đây là một số cách phát biểu bài toán:
Bài toán tập con cực đại: Cho một tập hữu hạn Uuin i,1,... , mỗi phần
tử uUi có kích cỡ Su()i và số tự nhiên B . Hãy xác định một tập con UU' sao
cho SuB() . Trong đó, uU ' .
i i
Knapsack thuộc lớp bài toán NPC. Nói chung không có thuật toán hữu hiệu
nào để giải nó cho trường hợp bất kỳ. Điều này không có nghĩa là tất cả các trường
hợp đều có cùng độ phức tạp.
Nhận xét:
+ Bài toán trên có thể xác định lời giải chính xác bẳng thuật toàn duyệt toàn
bộ theo tư tưởng như sau: Hãy duyệt mọi tổ hợp của các đồ vật, ứng với mỗi tổ hợp
(i1,i2,..,ik) thử điều kiện w(i1)+w(i2)++w(ik) = M để xác định nghiệm đúng. Khi đó
1 2n- 1 n n
số phương án được duyệt chính bằng CCCCn+ n +... n + n ; 2 tức là chúng
ta có độ phức tạp của thuật toán là hàm mũ.
10
+ Chúng ta có thể giải bài toán bằng thuật toán không đơn định đa thức như
sau: sử dụng hàm: CHOICE(0,1): là hàm chọn các đồ vật. Khi đó bài toán được đưa
về bài toán sau đây
Liệu có tồn tại tập chỉ số T {1,2,.. ,n} thỏa mãn wi M .
iT
Khi đó bài toán được giải bằng thuật toán sau đây:
For i:=1 to n do
xi:= CHOICE({0,1});
n
if xi ai =B then TRUE else FALSE
i1
Thuật toán trở thành thuật toán không đơn định đa thức với độ phức tạp O(n).
+ Bài toán trên có thể đưa về dạng tổng quát hơn bằng cách thay Output bằng:
“Hãy xác định nhóm đồ vật đặt trong balo sao cho phần thừa còn lại là ít
nhất”. Khi đó việc giải bài toán cũng được thực hiện tương tự, tuy nhiên chúng ta
phải đưa thêm hàm mục tiêu f=b-(a(i1)+a(i2)++a(ik)). Khi đó phương án cần xác
định là phương án thỏa mãn f đạt giá trị nhỏ nhất (f>=0).
Bài toán KNASPACK mở rộng
Input: + Cho n đồ vật, đồ vật thứ i có thể tích là wi, có giá trị là pi
+ Cho 1 ba lô có thể tích M
Output: Hãy xác định nhóm đồ vật thỏa mãn: tổng thể tích không vượt quá ba lô
đồng thời tổng giá trị là lớn nhất
Nhận xét:
+ Bài toán trên có thể xác định lời giải chính xác bằng thuật toán duyệt toàn
bộ theo tư tưởng như sau: Kí hiệu (x12 , x ,... xn ) là một phương án lựa chọn các đồ
vật với xi Î {0,1} . Khi đó hãy duyệt mọi phương án , ứng với mỗi
phương án xác định điều kiện w1x 1+ w 2 x 2 + ... + wnn x £ M . Nếu thỏa mãn thì
11
xác định tiếp giá trị hàm mục tiêu fXp()... xpxpx=+++1122 nn từ đó xác định
phương án tốt nhất. Hiển nhiên bài toán đưa về bài toán duyệt mọi dãy nhị phân có
độ dài n với độ phức tạp hàm mũ.
Thuật toán giải được mô tả như sau:
using namespace std;
int X[N],W[N],M,P[N],n,fmax,Xluu[N];
void input()
{
cout>n;
cout>M;
cout<<"Nhap the tich cac do vat: ";printf("\n");
for (int i=1;i>W[i];}
cout<<"Nhap gia tri cac do vat : ";printf("\n");
for (int i=1;i>P[i];}
fmax=0;
}
void output()
{ int f,T;
f=0;T=0;
for (int i=1;i<=n;i++) {T=T+X[i]*W[i];f=f+X[i]*P[i];}
if ((Tfmax))
{ fmax=f;
for (int i=1;i<=n;i++) Xluu[i]=X[i];}
}
void Try(int k)
{
int j;
for (j=0;j<=1;j++)
{ X[k]=j;if (k==n) output();else Try(k+1);}
}
int main()
{ input();
Try(1);
cout<<"Phuong an toi uu: ";
for (int i=1;i<=n;i++) cout<<Xluu[i]<<" ";
cout<<"Gia tri toi uu fmax= "<<fmax;
}
+ Tương tự, chúng ta có thể giải bài toán bằng thuật toán không đơn định đa
thức như sau: sử dụng hàm: CHOICE(0,1): là hàm chọn các đồ vật. Khi đó bài toán
12
được đưa về bài toán sau đây: Liệu có tồn tại tập chỉ số T {1,2,.. ,n} thỏa mãn
n n
wiixM và pi xi đạt max. Khi đó bài toán được giải bằng thuật toán sau
i1 i1
đây:
For i:=1 to n do
xi:= CHOICE({0,1});
n
if xiiw else FALSE
i1
Thuật toán trở thành thuật toán không đơn định đa thức với độ phức tạp O(n).
+ Bài toán Knaspack có thể giải bằng thuật toán GA với cấu trúc gen là dãy
nhị phân và toán tử lai ghép đa điểm hoặc lai ghép mặt nạ được trình bày trong
chương 2.
Kết luận: Trong chương 1, luận văn trình bày những khái niệm cơ bản về bài
toán - thuật toán trong tin học, khái niệm về độ phức tạp của thuật toán và các
nguyên tắc đánh giá độ phức tạp. Trên cơ sở đó đưa ra nguyên tắc phân lớp các bài
toán để tiến hành lựa chọn giải thuật tốt nhất giải các lớp bài toán trong thực tế. Đưa
ra mô hình bài toán Knaspack là một mô hình điển hình của lớp các bài toán NP.
Các kiến thức này làm cơ sở để phân tích và thiết kế các thuật toán được trình bày
trong các chương tiếp sau.
13
CHƯƠNG 2
MỘT SỐ THUẬT TOÁN XẤP XỈ
Nội dung chính của chương 2 sẽ nghiên cứu một số thuật toán xấp xỉ đã được
nghiên cứu trong các kĩ thuật thiết kế thuật toán như: Thuật toán tham lam, thuật
toán quy hoạch động, thuật toán di truyền GA, cùng các bài toán mẫu mực trong
thực tế. Các thuật toán đã được tham khảo trong các tài liệu [3, 4, 5, 6, 7, 8]. Việc
mô phỏng các thuật toán được thực hiện trên nền ngôn ngữ lập trình C++ hoặc
Matlab.
2.1 Khái niệm về thuật toán xấp xỉ
Nhiều bài toán có ý nghĩa rất quan trọng trong thực tiễn lại là NP đầy đủ.
Nếu là một bài toán NP đầy đủ, ta không thể tìm một thuật toán thời gian đa thức để
giải nó chính xác. Có hai cách tiếp cận để khắc phục tính đầy đủ NP.
Thứ nhất: nếu các đầu vào thực tế là nhỏ, một thuật toán có thời gian thực
hiện hàm mũ có thể hoàn toàn chấp nhận được
Thứ hai: vẫn có thể tìm các giải pháp gần tối ưu trong thời gian đa thức
(hoặc trong trường hợp xấu nhất hoặc tính trung bình). Trong thực tế để tính gần tối
ưu thường là đủ. Một thuật toán trả về các giải pháp gần tối ưu được gọi là một
thuật toán xấp xỉ.
Xét một bài toán tối ưu hóa, ở đó mỗi giải pháp có thể đưa ra có một mức
hao phí dương, và ta muốn tìm giải pháp gần tối ưu. Tùy thuộc vào bài toán, một
giải pháp gần tối ưu có thể được định nghĩa là một giải pháp có mức hao phí khả dĩ
cực đại hoặc một giải pháp có mức hao phí khả dĩ cực tiểu, bài toán có thể là bài
toán cực đại hóa hoặc cực tiểu hóa.
Một số thuật toán xấp xỉ cho bài toán có một cận tỷ số P(n) nếu với bất kỳ
đầu vào có kích cỡ n , mức hao phí C của giải pháp mà thuật toán xấp xỉ tạo sẽ nằm
trong một thừa số p(n) của mức hao phí C* của một giải pháp tối ưu: Max
C C *
, ≤ p(n)
*
C C
14
Định nghĩa này áp dụng cả bài toán cực đại hóa lẫn cực tiểu hóa. Với một bài
C *
toán cực đại hóa, 0 < C ≤ C*, và tỷ số cho ra thừa số qua đó với mức hao phí
C
của một giải pháp tối ưu lớn hơn mức hao phí của một giải pháp xấp xỉ. Cũng vậy,
C
với một bài toán cực tiểu hóa, 0 < C* ≤C, và tỷ số cho ra thừa số qua đó mức
C *
hao phí của một giải pháp xấp xỉ lớn hơn mức hao phí của một giải pháp tối ưu. Bởi
tất cả các giải pháp được mặc nhận có mức hao phí dương, các tỷ số này luôn được
định nghĩa rõ ràng. Cận tỷ số của một thuật toán xấp xỉ không bao giờ nhỏ hơn 1,
C
bởi 1. Một thuật toán xấp xỉ có một cận lỗi tương đối ε(n) nếu
C*
C C *
n
C *
Một lược đồ xấp xỉ cho một bài toán tối ưu hóa là một thuật toán xấp xỉ chấp
nhận không những một bộ dữ liệu vào của bài toán, mà còn một giá trị ε>0 làm đầu
vào sao cho với bất kỳ ε, cố định, lược đồ là một thuật toán xấp xỉ có cận lỗi tương
đối ε. Ta nói rằng một lược đồ xấp xỉ có thời gian đa thức nếu với bất kỳ ε > 0 cố
định, lược đồ chạy trong thời gian đa thức trong kích cỡ n củ...N
s1=s1+A(l)*con1(l);
33
end;
if s1<=b
socon=socon+1;
Quan_the(socon,:)=con1;
end;
s2=0;
for l=1:N
s2=s2+A(l)*con2(l);
end;
if s2<=b
socon=socon+1;
Quan_the(socon,:)=con2;
end;
end;
end; %Ket thuc lai ghep
% Chon loc
for i=1:socon
f(i)=0;
for j=1:N
f(i)=f(i)+Quan_the(i,j)*C(j);
end;
end;
for i=1:socon-1
for j=i+1:socon
if f(i)<f(j)
tgf=f(i);f(i)=f(j);f(j)=tgf;
tgz=Quan_the(i,:);Quan_the(i,:)=Quan_the(j,:);Quan_the(j,:)=tgz;
end;
end;
end;
end; %ket thuc GA
% Phuong an toi uu
phuong_an_toi_uu=Quan_the(1,:)
gia_tri_toi_uu=f(1)
Ví dụ 2.5: Bài toán quân cờ DOMINO
Định nghĩa 1: Một quân bài Domino là một bộ (a,b) trong đó được gọi a là số hàng
trên, b là số hàng dưới.
Định nghĩa 2: Phép lật quân được hiểu là một phép biến đổi bộ (a,b) thành bộ (b,a)
Bài toán:
Input: Cho n quân bài Domino (a1,b1),(a2,b2),...(an,bn) xếp thành một hàng ngang.
34
Output: Hãy xác định các phép lật quân để sao cho độ chênh lệnh giữa tổng các số
hàng trên so với tổng các số hàng dưới đạt giá trị nhỏ nhất.
a1 a2 .... an-1 an
b1 b2 bn-1 bn
Có thể thấy rằng mô hình bài toán trên cũng là bài toán thuộc lớp NP.
Phân tích
+ Kí hiệu một phương án lật quân là một bộ X=(x1,x2,,xn) trong đó xk=1
tức là lật quân thứ k, xk=0 tức là không lật quân thứ k. Khi đó để tìm phương án lật
quân tối ưu, chúng ta có thể sử dụng thuật toàn duyệt toàn bộ tất cả các phương án
từ đó xác định phương án có độ chênh lệch nhỏ nhất. Kí hiệu hàm mục tiêu
n
fXcxab()os()()=-p
å ikk
k= 1
Chú ý: co s(0 )=1 ứng với trạng thái không lật quân, co s(p ) = -1 ứng với trạng thái
lật quân
Khi đó sử dụng thuật toán duyệt tất cả các dãy nhị phân độ dài n bằng thuật toán
quay lui, ta có thể tìm được lời giải chính xác của bài toán. Tuy nhiên khi n là lớn
thì thuật toán không khả thi vì độ phức tạp của thuật toán là O(n!)
Sau đây chúng ta thiết kế thuật toán GA tìm lời giải xấp xỉ.
+ Kí hiệu 1 cá thể là X=(x1,x2,,xn) ứng một phương án lật quân trong đó xk=1 tức
là lật quân thứ k, xk=0 tức là không lật quân thứ k.
+ Sử dụng phương pháp toán tử lai ghép đa điểm hoặc lại ghép mặt nạ
+ Quá trình chọn lọc luôn sử dụng hàm mục tiêu f(X).
Khi đó thuật toán GA được mô tả bằng ngôn ngữ Matlab như sau
function domino=domino(tren,duoi,KK)
clc;
N=length(tren);M=10;%popsize
z=round(rand(M,N));
for i=1:M
for j=1:N
if z(i,j)==0
A(i,j)=tren(j);
B(i,j)=duoi(j);
else
A(i,j)=duoi(j);
B(i,j)=tren(j);
end;
end;
35
end;
% thuat toan GA
count=0;k=3;
while count<KK
count=count+1;
socon=M;
for i=1:M-1
for j=i+1:M
bo=[A(i,:);B(i,:)];me=[A(j,:);B(j,:)];
for j1=1:k
con1(:,j1)=bo(:,j1);
con2(:,j1)=me(:,j1);
end;
for j2=k+1:N
con1(:,j2)=me(:,j2);
con2(:,j2)=bo(:,j2);
end;
socon=socon+1;
A(socon,:)=con1(1,:);
B(socon,:)=con1(2,:);
socon=socon+1;
A(socon,:)=con2(1,:);
B(socon,:)=con2(2,:);
end;
end;
for i=1:socon
sa=0;
sb=0;
for j=1:N
sa=sa+A(i,j);
sb=sb+B(i,j);
end;
f(i)=abs(sa-sb);
end;
% Phep chon loc
for i=1:socon-1
for j=i+1:socon
if f(i)>f(j)
tgf=f(i);f(i)=f(j);f(j)=tgf;
tgA=A(i,:);A(i,:)=A(j,:);A(j,:)=tgA;
tgB=B(i,:);B(i,:)=B(j,:);B(j,:)=tgB;
end;
end;
end;
% Dot bien con thu 7 vi tri so 5
36
tg=A(7,5);A(7,5)=B(7,5);B(7,5)=tg;
end;
phuong_an_toi_uu=A(1,:) B(1,:)
Gia_tri_toi_uu=f(1)
Nhận xét: Qua 2 ví dụ trên chúng ta có thể thấy
+ Thuật toán GA được thiết kế rất đơn giản, dễ hiểu, các bài toán tương tự thì
cấu trúc của các chương trình là như nhau
+ Thuật toán chỉ sử dụng 1 vòng lặp duy nhất nên độ phức tạp là rất thấp
+ Các thao tác lai ghép, đột biến, thích nghi đều thao tác trên vector nên khả
năng thiết kế thuật toán song song trên máy tính có bộ nhớ vector là rất khả thi
+ Vì là thuật toán xác suất nên lời giải là gần đúng và với các lần thử nghiệm
khác nhau thì kết quả có thể là khác nhau.
Kết luận:
Nội dung chương 2 đã nghiên cứu một số nguyên tắc thiết kế các thuật toán
giải bài toán tối ưu theo tư tưởng Heuristic tìm nghiệm xấp xỉ của các bài toán thuộc
lớp NP. Các ví dụ minh họa chứng tỏ tính khả thi của các thuật toán ứng dụng cho
các bài toán trong thực tế.
37
CHƯƠNG 3
MÔ HÌNH BÀI TOÁN LẬP LỊCH TRONG BỆNH VIỆN
3.1 Đặt vấn đề
Trong thực tế hiện nay thì lớp các bài toán lập lịch là một lớp các bài toán
quan trọng vì tính thời sự của nó, có thể kể đến các mô hình: Lập lịch kế hoạch sản
xuất trong các xí nghiệp, lập lịch giảng dạy trong các trường học, lập lịch bay cho
các sân bay, lập lịch trực cho các nhà máy, bệnh viện Đặc điểm chung của các bài
toán lập lịch là do rất nhiều các ràng buộc từ điều kiện thực tế nên khó có thể tìm
được lịch biểu tối ưu, trong khi đó lịch biểu vẫn phải lập và thực hiện do nhu cầu
thường ngày của các đơn vị nhà trường và doanh nghiệp. Do đó việc sử dụng các
thuật toán xấp xỉ để tìm lịch biểu gần tối ưu luôn luôn là một lựa chọn hợp lý nhiều
khi là bắt buộc.
Trong các mô hình thực tế hiện nay, mô hình phân công các ca trực tại các
phòng khám của các bệnh viện là một mô hình đã và đang diễn ra thường xuyên
liên tục. Mô hình này là mô hình chung cho tất cả các bênh viện tuy rằng với mỗi
bệnh viện lại có những ràng buộc đặc thù riêng biệt. Vì lý do đó, trong luận văn,
chúng tôi sẽ nghiên cứu chi tiết hai mô hình bài toán lập lịch các ca trực tại các
bệnh viện. Mô hình được tham khảo từ bệnh viện A tỉnh Thái Nguyên.
3.2 Giới thiệu tổng quan bệnh viện A
- Lịch sử phát triển
Ngày 4/9/1965 Ty Y tế Bắc Thái thành lập Ban kiến thiết Bệnh viện dã chiến
(tiền thân của Bệnh viện A) tại xã Vô Tranh, huyện Phú Lương. Ngày 31/12/1965,
Uỷ ban Hành chính tỉnh Bắc Thái chính thức có Quyết định số 657/TCDC về việc
tiếp nhận và điều động 73 cán bộ nhân viên do UBHC Khu chuyển giao về và cho
thành lập Bệnh viện tỉnh Bắc Thái với quy mô 100 giường bệnh và chỉ tiêu biên chế
62 cán bộ, bao gồm: 02 bác sỹ, 01 dược sỹ đại học, 14 y sỹ, 17 y tá, 02 nữ hộ sinh,
02 dược tá, 01 xét nghiệm viên, 11 hộ lý.
38
Được sự quan tâm của Tỉnh uỷ, UBND tỉnh và Bộ Y tế, Chính Phủ đã quyết
định đầu tư cho tỉnh một bệnh viện phụ sản quy mô 200 giường bệnh, diện tích xây
dựng 14.000m2 với tổng vốn xây lắp 43 tỷ đồng và trang thiết bị 16 tỷ đồng, trên
một phần đất trước đây đã được cấp tại tổ 19, phường Thịnh Đán, T.P Thái Nguyên.
Từ năm 2012, số bệnh nhân điều trị nội trú tăng lên nhiều, số giường bệnh phải tăng
lên hàng năm: Năm 2012: 380 giường, năm 2013: 420 giường, năm 2014: 470
giường, năm 2015: 510 giường.
- Cơ cấu tổ chức
Cơ cấu tổ chức các khoa phòng hiện tại: 31 khoa/phòng, gồm: phòng Tổ
chức - Hành chính, phòng Tài chính - Kế toán, phòng Kế hoạch - Tổng hợp, phòng
Vật tư thiết bị y tế, phòng Điều dưỡng, phòng Công tác xã hội, phòng Quản lý chất
lượng, phòng Đào tạo và chỉ đạo tuyến. Các khoa trong Bệnh viện gồm: khoa Khám
bệnh, khoa Hồi sức cấp cứu, khoa Nội tổng hợp, khoa Nội Tim mạch - Bảo vệ sức
khỏe cán bộ, khoa Ngoại Tổng hợp, Khoa Ngoại Chấn thương, Khoa Sản, Khoa
Nhi, Khoa Phẫu thuật - Gây mê hồi sức, Khoa Hồi sức cấp cứu, khoa Mắt, khoa
Răng - Hàm - Mặt, khoa Tai - Mũi - Họng, khoa Dược, khoa Truyền nhiễm, Khoa
Y học cổ truyền - Vật lý trị liệu, khoa Da liễu, khoa Hỗ trợ sinh sản, khoa Giải phẫu
bệnh, khoa Kiểm soát nhiễm khuẩn, khoa Chẩn đoán hình ảnh, khoa Huyết học
truyền máu, khoa Sinh hóa - Vi sinh.
- Đội ngũ
Hiện nay, tổng số cán bộ viên chức trong biên chế của Bệnh viện là 610, bao
gồm 138 bác sĩ, trong đó có 16 bác sĩ chuyên khoa cấp II, 37 bác sĩ chuyên khoa
cấp I, 5 thạc sĩ; 80 bác sĩ đa khoa, 28 dược sĩ , 351 điều dưỡng, kỹ thuật viên, hộ
sinh và 66 đại học.
39
- Quy trình Điều trị, khám bệnh
BỆNH NHÂN PHÒNG KHÁM
NHẬP KHOA
DỰ TRÙ VÀ HOÀN TRẢ HAO PHÍ THEO KHOA CHỈ ĐỊNH TẠM VIỆN PHÍ
PHÒNG NỘI ỨNG
TRÚ
CÔNG NỢ
CHỈ ĐỊNH CẬN LÂM SÀNG PHẪU THUẬT, THỦ
DỰ TRÙ VÀ HOÀN TRẢ HAO PHÍ THEO BỆNH THUẬT
NHÂN
THỰC HIỆN CẬN LÂM SÀNG
DƯỢC XUẤT TỪ TRỰC
XUẤT KHOA
VIỆN PHÍ
KẾT THÚC
QUÁ TRÌNH NỘI TRÚ
40
- Quy trình xếp lịch thủ công
Ca trực được phân thành 2 ca: Ca ngày từ 7h – 17h cùng ngày; Ca đêm từ
17h – 5h sáng hôm sau. Người trực ca đêm thì hôm sau được nghỉ; Nếu trong ca
trực có người nghỉ đột xuất thì sẽ đôn người ở ca trực tiếp theo vào thay thế.
Đối với điều dưỡng thì điều dưỡng trưởng của từng khoa phân công lịch trực
nộp lên phòng kế hoạch tổng hợp để báo cáo và tổng hợp.
Lịch trực Bác sĩ, trực hành chính, trực cận lâm sàng (siêu âm, X quang, xét
nghiệm, nội soi), do phòng kế hoạch tổng hợp sắp xếp.
+ Tiếp nhận danh sách nhân sự: Họ tên, ngày sinh, giới tính, điện thoại, khoa, chức
vụ.
+ Tiếp nhận danh sách ràng buộc:
- Yêu cầu xếp lịch từ các khoa (số lượng Bác sĩ, y tá, điều dưỡng).
- Yêu cầu cấp trực: trực lãnh đạo, ca trực, chức danh và khoa.
+ Thời gian ca trực: ca ngày, ca đêm.
+ Xếp lịch trực.
+ Cập nhật lịch trực.
- Hiện trạng
Việc xếp lịch trực của Bác sĩ hiện nay được thực hiện bằng tay (thủ công) và
được lưu trữ thông tin trên giấy nên không thể tránh khỏi những sai sót như: trùng
lặp người trực, mất thông tin, Cho nên để có được lịch trực chính xác, không xảy
ra những sai sót thì chỉ có những người thực hiện công việc xếp lịch là người có
kịnh nghiệm và thực hiện công việc này trong thời gian dài, nên việc xây dựng thuật
toán lập lịch trên máy tính điện tử và ứng dụng vào công việc nêu trên là cần thiết,
nâng cao chất lượng công việc.
3.3 Các mô hình phân công các ca trực
Xuất phát từ tìm hiểu thực tế, tại bệnh viện tồn tại 2 mô hình phân công các
bác sĩ và y tá trực tại các lịch trực, đó là:
1. Mô hình phân công trực tại các khoa chuyên môn
2. Mô hình phân công trực tại các phòng khám
41
Hai mô hình trên có tính chất chuyên môn cũng như độ phức tạp là hoàn toàn khác
nhau. Sau đây chúng ta phân tích chi tiết 2 mô hình và tìm lời giải tối ưu trên từng
mô hình
3.3.1 Bài toán phân công trực tại các khoa chuyên môn
Giả sử tại một khoa chuyên môn (Nội, Ngoại, Nhi, Sản,) qua khảo sát thu được
các thông tin như sau:
+ Tập BS={1,2,3,..,NB} các bác sĩ được mã số thứ tự từ 1 đến NB
+ Tập YT={1,2,3,..,NY} các y tá được mã số thứ tự từ 1 đến NY
+ Tập T={1,2,3,.,NT} danh sách các ca trực được mã số thứ tự từ 1 đến
NT
Các bác sĩ và y tá đều phải tham gia vào các ca trực cấp cứu tại khoa theo các yêu
cầu sau đây:
+ Mọi bác sĩ và y tá đều có nghĩa vụ, trách nhiệm cũng như quyền lợi như
nhau
+ Mỗi bác sĩ và y tá đều có thể đưa ra yêu cầu được nghỉ một số buổi trong
lịch tùy theo hoàn cảnh mỗi người.
+ Tại mọi thời điểm tại phòng trực cấp cứu luôn luôn phải đảm bảo có 1
bác sĩ và 1 y tá trực.
Yêu cầu: Hãy lên lịch phân công trực cấp cứu cho các khoa trong bệnh viện sao cho
các yêu cầu của mọi người đều thỏa mãn đồng thời số buổi trực của các bác sĩ là
tương đương, số buổi trực của các Y tá là tương đương.
Phân tích:
+ Hiển nhiên mô hình các khoa là tương đương đồng thời giữa các khoa là
hoạt động độc lập nên chúng ta chỉ cần xây dựng thuật toán phân lịch cho 1 khoa
làm đại diện từ đó suy rộng cho toàn bệnh viện.
+ Do Bác sĩ và Y tá trong 1 khoa là độc lập nên chúng ta cũng chỉ cần phân
lịch L1 cho bác sĩ và phân lịch L2 cho Y tá sau đó kết hợp lại chúng ta sẽ được lịch
chung toàn khoa. Hiển nhiên 2 bài toán lập lịch L1 và L2 là tương đương.
Như vậy chúng ta chỉ cần xét bài toán phân lịch cho các bác sĩ là đủ:
42
Kí hiệu L=(L(1),L(2),.,L(NB)) là lịch trực cần tìm trong đó L(i)=k (k=1..NB)
được hiểu là bác sĩ k sẽ trực vào ca trực thứ i trong lịch (i=1..NT)
Kí hiệu B=(B(i,j)) là ma trận ràng buộc yêu cầu trong đó B(i,j)=0 được hiểu là Bác
sĩ thứ i không sẵn sàng trực tại ca thứ j trong lịch, B(i,j)=1 được hiểu là Bác sĩ thứ i
sẵn sàng nhận nhiệm vụ.
Hiển nhiên bài toán cần xây dựng phương án trực L thỏa mãn ràng buộc B sao cho
số buổi trực của các bác sĩ là xấp xỉ bằng nhau.
Để giải quyết bài toán trên, có nhiều phương pháp đưa ra lời giải gần đúng. Trong
trường hợp này chúng ta sẽ xây dựng thuật toán gần đúng (theo tư tưởng tham
lam) giải bài toán như sau:
Tư tưởng: Lần lượt xếp các bác sĩ vào lịch trực (mỗi bác sĩ 1 lần) sao cho thỏa mãn
điều kiện. Quá trình lặp đi lặp lại cho đến khi kín lịch thì dừng lại. Hiển nhiên do
xếp lần lượt các bác sĩ (mỗi bác sĩ 1 lần) nên số các ca trực của các bác sĩ chỉ chênh
lệnh nhiều nhất là 1 buổi, do đó ta đạt được nghiệm theo yêu cầu.
Thuật toán
Input: + NB, NY, NT
+ Ma trận B
Output: L
Bước 1: Xuất phát L=(0,0,..,0) Chưa xếp bác sĩ nào vào lịch
Bước 1: (Bước lặp)
k=1; %Xuất phát từ bác sĩ thứ nhất
+ Tìm ca chưa xếp đầu tiên mà bác sĩ k không bận xếp bác sĩ k vào lịch
+ Dich chuyển đến ca tiếp theo
+ k:=k=1; Lấy bác sĩ tiếp sau.
Bước 2 Kiểm tra điều kiện dừng (Lịch đầy)
Quay lại bước 1
Hiển nhiên độ phức tạp của thuât toán là O(NB.NT)
43
Thuật toán được mô tả chi tiết bằng ngôn ngữ Matlab
function lap_lich=Tham_lam_1
clear all;
clc;NT=14;NB=5;
load d:\chuyen_dai_tu\B;
% Phan lich truc cho bac si
while KT(X)>0
k=1;
while and(k0)
i=1;ok=0;
while and(i<=NT,ok==0)
if and((X(i)==0),(B(k,i)==1))
X(i)=k;ok=1;
else i=i+1;
end;
end;
k=k+1;
end;
end;
CB=zeros(1,NB);CY=zeros(1,NY);
for k=1:NB
for i=1:NT
if (X(i)==k) CB(k)=CB(k)+1;end;
end;
end;
Lich_truc_bac_si=X
So_ca_truc=CB
function KT=KT(X)%Hàm kiem tra
s=0;
for i=1:length(X)
if X(i)==0
s=s+1;
end;
end;
KT=s;
44
Sau đây là kết quả xếp lịch trực cho các bác sĩ và y tá tại 1 khoa chuyên môn với
các số liệu như sau
+ Số bác sĩ là 5
+ Số y tá là 7
+ Số ca trực là 14
Ma trận ràng buộc của các bác sĩ và y tá được cho bởi bảng
Bảng 3.1: Ma trận ràng buộc B
(1-Sẵn sàng, 0-Không sẵn sàng)
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14
BS 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1
BS 2 1 0 1 1 0 1 1 1 1 0 1 1 1 1
BS 3 1 0 0 1 1 0 1 1 1 1 0 1 1 1
BS 4 1 1 1 0 1 1 0 1 1 1 1 0 1 1
BS 5 1 1 1 1 0 1 1 1 1 0 1 1 1 0
Bảng 3.2: Ma trận ràng buộc Y
(1-Sẵn sàng, 0-Không sẵn sàng)
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14
Yta 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1
Yta 2 1 1 0 1 0 1 1 1 1 1 1 0 1 1
Yta 3 0 1 1 1 1 1 0 1 1 1 1 1 0 1
Yta 4 1 0 1 1 0 1 1 1 1 1 1 0 1 1
Yta 5 1 1 0 1 1 1 1 1 1 0 1 1 1 0
Yta 6 0 1 1 1 1 0 1 1 1 1 1 1 1 1
Yta 7 1 1 0 1 1 1 1 1 1 0 0 1 1 1
Kết quả chạy chương trình được đưa ra trong bảng 3.3 và 3.4
(Lap_lich_tham_lam_1.m)
Bảng 3.3: Lịch trực các buổi trong tuần
(Số hiệu bác sĩ – Số hiệu y tá)
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14
2-1 1-2 4-3 3-4 2-5 5-7 3-6 1-1 4-2 5-3 2-4 3-5 1-6 4-7
Bảng 3.4: Số buổi trực đối với các bác sĩ – y tá
Bs1 Bs 2 Bs3 Bs4 Bs5 Yta1 Yta2 Yta3 Yta4 Yta5 Yta6 Yta7
3 3 3 3 2 2 2 2 2 2 2 2
45
Nhận xét:
+ Thuật toán cho kết quả là chấp nhận được tức là số buổi trực của các bác sĩ là
đồng đều nhau, số buổi trực các Y tá là đồng đều nhau.
+ Mô hình bài toán là đơn giản, dễ giải quyết trong thực tế vì số ràng buộc là ít
+ Mô hình áp dụng tốt cho tất cả các khoa tại bệnh viện A Thái Nguyên
3.3.2 Bài toán phân công trực tại các Phòng khám
Chúng ta xét bài toán: Giả sử tham khảo thông tin tại phòngTổ chức cán bộ tại
bệnh viện A, ta thu được các thông tin sau:
Thông tin cơ bản
+ Bảng 1 gồm NBS các bác sĩ: (Số hiệu, tên, chuyên môn đào tạo)
+ Bảng 2 gồm NYT các y tá: (Số hiệu, tên, chuyên môn đào tạo)
+ Bảng 3 gồm NPK các phòng khám (Số hiệu, tên phòng khám)
+ Bảng 4 gồm NBT các buổi trực (Số hiệu, thời gian, ngày)
Trong đó số hiệu được đánh số từ 1,2,,N
Để đảm bảo về chất lượng chuyên môn: Ban giám đốc yêu cầu mỗi Bác sĩ
và Y tá chỉ được trực tại một số phòng khám phù hợp với chuyên môn đã được đào
tạo (thông tin trong bảng gồm: Số hiệu bác sĩ (Y tá), Số hiệu phòng khám 1- Phù
hợp, 0 – Không phù hợp)
Để tạo điều kiện thuận lợi, cho phép mỗi Bác sĩ và Y tá được đăng kí các
buổi trực mà cá nhân sẵng sàng nhận trực theo lịch phân công trong một số buổi xác
định (thông tin trong bảng gồm: Số hiệu bác sĩ (Y tá), Số hiệu ca trực 1- Phù hợp, 0
– Không phù hợp)
Yêu cầu hãy xếp lịch trực cho tất cả các Bác sĩ và Y tá tại tất cả các phòng
khám trong danh sách tất cả các ca trực để sao cho tại mọi buổi, tất cả các phòng
khám phải có đầy đủ 1 Bác sĩ và 1 Y tá trực phù hợp với chuyên môn đào tạo đồng
thời số ca trực của các Bác sĩ là tương đương nhau, các Y tá là tương đương nhau.
Hiển nhiên bài toán này là phức tạp hơn rất nhiều bài toán trực tại các khoa
chuyên môn bởi vì một bác sĩ hoặc y tá có thể trực tại nhiều phòng khám khác nhau
tại nhiều ca khác nhau (Bài toán 2 chiều)
46
Xuất phát từ bài toán trên, chúng ta có mô hình toán học chi tiết cho bài toán
như sau:
Sử dụng các kí hiệu
- Tập BS={1,2,,NBS} số hiệu các Bác sĩ.
- Tập YT={1,2,,NTY} số hiệu các Y tá.
- Tập PK={1,2,,NPK} số hiệu các phòng khám.
- Tập BT={1,2,,NBT} số hiệu các buổi trong lịch toàn lịch trực.
- Mảng PBS(s,p) biểu diễn sự phù hợp chuyên môn giữa các Bác sĩ và phòng khám
trong đó: PBS(s,p)=1 chuyên môn Bác sĩ số hiệu s phù hợp với phòng khám p,
PBS(s,p)=0 – Không phù hợp.
- Mảng PYT(s,p) biểu diễn sự phù hợp chuyên môn giữa các Y tá và phòng khám
trong đó: PYT(s,p)=1 chuyên môn Y tá số hiệu s phù hợp với phòng khám p,
PYT(s,p)=0 – Không phù hợp.
- Mảng trạng thái MBS(s,t) trạng thái sẵn sàng nhận trực của Bác sĩ có số hiệu s
trong ca trực thứ t trong đó MBS(s,t)=1 là sẵng sàng, MBS(s,t)=0 là không sẵn sàng
- Mảng trạng thái MYT(s,t) trạng thái sẵn sàng nhận trực của Y tá có số hiệu s trong
ca trực thứ t trong đó MYT(s,t)=1 là sẵng sàng, MYT(s,t)=0 là không sẵn sàng
Các biến số cần xác định
- Các biến XBS(p,t)=k – bác sĩ số hiệu k được xếp vào phòng khám p trong buổi
trực t.
- Các biến XYT(p,t)=k – y tá số hiệu k được xếp vào phòng khám p trong buổi trực
t.
- Các biến CBS(s) - Ghi lại tổng số buổi trực của bác sĩ s trong toàn lịch phân công
trực tại các phòng khám.
- Các biến CYT(s) - Ghi lại tổng số buổi trực của y tá s trong toàn lịch phân công
trực tại các phòng khám.
Các điều kiện ràng buộc:
R1: Tại một thời điểm t, 1 Bác sĩ chỉ được trực nhiều nhất là 1 phòng khám.
R2: Tại một thời điểm t, 1 Y tá chỉ được trực nhiều nhất là 1 phòng khám.
47
R3: Chỉ xếp lịch trực cho các Bác sĩ sẵn sàng trong buổi trực.
R4: Chỉ xếp lịch trực cho các Y tá sẵn sàng trong buổi trực.
R5: Các Bác sĩ và Y tá chỉ được phép trực tại các phòng khám phù hợp về chuyên
môn.
R6: Tại mọi thời điểm, các phòng khám đều phải có đầy đủ 1 Bác sĩ và 1 Y tá trực
Yêu cầu: Hãy xây dựng bảng phân công trực tại các phòng khám cho tất cả các Bác
sĩ và Y tá trong bệnh viện thỏa mãn tất cả các ràng buộc R1,,R6 sao cho tổng số
các buổi trực của các Bác sĩ được phân công là tương đương nhau, số các buổi trực
của các Y tá được phân công là tương đương nhau.
Nhận xét: Bài toán trên là một dạng bài toán quy hoạch rời rạc. Để nhận được lời
giải đúng là rất khó thực hiện và trong nhiều trường hợp chúng ta không thể xác
định được lịch biểu tối ưu (Phụ thuộc vào 2 ma trận sẵn sàng là TBS và TYT). Sau
đây chúng ta sẽ nghiên cứu hai phương án thiết kế giải bài toán
Phương án 1: Thuật toán tham lam
Phân tích:
+ Do Bác sĩ và Y tá trong 1 bênh viện là độc lập nên chúng ta cũng chỉ cần
phân lịch L1 cho bác sĩ và phân lịch L2 cho Y tá sau đó kết hợp lại chúng ta sẽ được
lịch chung toàn khoa. Hiển nhiên 2 bài toán lập lịch L1 và L2 là tương đương.
Như vậy chúng ta chỉ cần xét bài toán phân lịch cho các bác sĩ là đủ:
+ Kí hiệu L1=(L1(i,j)) là lịch trực cần tìm trong đó L1(i,j)=k (k=1..NB) được
hiểu là bác sĩ k sẽ trực tại phòng khám i (i=1..NP) trong ca trực thứ i trong lịch
(i=1..NT)
+ Kí hiệu BT=(BT(i,j)) là ma trận ràng buộc yêu cầu trong đó B(i,j)=0 được
hiểu là Bác sĩ thứ i không sẵn sàng trực tại ca thứ j trong lịch, B(i,j)=1 được hiểu là
Bác sĩ thứ i sẵn sàng nhận nhiệm vụ.
+ Kí hiệu BP=(BP(i,j)) là ma trận ràng buộc yêu cầu trong đó B(i,j)=0 được
hiểu là Bác sĩ thứ i không đáp ứng chuyên môn tại phòng khám thứ j, B(i,j)=1 được
hiểu là Bác sĩ thứ i đáp ứng chuyên môn
48
Hiển nhiên bài toán cần xây dựng phương án trực L1 thỏa mãn 2 ràng buộc
BT và BP sao cho số buổi trực của các bác sĩ là xấp xỉ bằng nhau.
Chúng ta sẽ xây dựng thuật toán gần đúng (theo tư tưởng tham lam) giải bài
toán như sau:
Tư tưởng:
Bước 1: Khởi động ma trận L1 là rỗng (Chưa xếp lịch)
Bước lặp: Lần lượt xét các bác sĩ k= 1..NB
+ Xét 1 ô L1(i,j) còn trống (Chưa xếp bác sĩ)
+ Nếu Bác sĩ k thỏa mãn yêu cầu tại ô (i,j): BT(k,j)=1; BP(i,k)=1 thì xếp bác sĩ k
vào ô (i,j)
+ Tăng k=k+1;
Quay lại bước lặp.
Quá trình dừng lại khi tất cả các ô L1(i,j) đã đầy
Hiển nhiên do xếp lần lượt các bác sĩ theo dạng quay vòng nên số các ca trực là xấp
xỉ bằng nhau. Quá trình xếp các y tá là hoàn toàn tương tự
Thuật toán
Input: + NB, NY, NT
+ Ma trận B
Output: L
Bước 1: Xuất phát L=(0,0,..,0) Chưa xếp bác sĩ nào vào lịch
Bước 1: (Bước lặp)
k=1; %Xuất phát từ bác sĩ thứ nhất
+ Tìm ca chưa xếp đầu tiên mà bác sĩ k không bận xếp bác sĩ k vào lịch
+ Dich chuyển đến ca tiếp theo
+ k:=k=1; Lấy bác sĩ tiếp sau.
Bước 2 Kiểm tra điều kiện dừng (Lịch đầy)
Quay lại bước 1
Hiển nhiên độ phức tạp của thuật toán là O(NB.NT.NP)
Thuật toán được mô tả chi tiết bằng ngôn ngữ Matlab
49
function lap_lich=Tham_lam_2
clc;NT=14;NB=10;NY=14;NP=7;BT=ones(NB,NT);BP=ones(NB,NP);YT=ones(N
Y,NT);YP=ones(NY,NP);
load d:\chuyen_dai_tu\BT;
load d:\chuyen_dai_tu\BP;
load d:\chuyen_dai_tu\YT;
load d:\chuyen_dai_tu\YT;
X=zeros(NP,NT);
Z=zeros(NP,NT);
count=0;
while KT(X)>0
k=1;
while k<=NB
i=0;
while i<NP
i=i+1;j=0;ok=0;
while and(j<NT,ok==0)
j=j+1;
if
and((X(i,j)==0),and((BP(k,i)==1),and((BT(k,j)==1),(KT1(X(:,j),k)==0))))
X(i,j)=k;ok=1;
end;
end;
end;
k=k+1;
end;
end;
CB=zeros(1,NB);
for k=1:NB
for i=1:NP
for j=1:NT
if (X(i,j)==k) CB(k)=CB(k)+1;end;
end;
end;
end;
count=0;
while KT(Z)>0
k=1;
while k<=NY
i=0;
while i<NP
i=i+1;j=0;ok=0;
while and(j<NT,ok==0)
50
j=j+1;
if
and((Z(i,j)==0),and((YP(k,i)==1),and((YT(k,j)==1),(KT1(Z(:,j),k)==0))))
Z(i,j)=k;ok=1;
end;
end;
end;
k=k+1;
end;
end;
CY=zeros(1,NY);
for k=1:NY
for i=1:NP
for j=1:NT
if (Z(i,j)==k) CY(k)=CY(k)+1;end;
end;
end;
end;
Lich_truc_bac_si=X
So_ca_truc=CB
Lich_truc_Y_ta=Z
So_ca_truc=CY
function KT=KT(X)%Hàm kiem tra
NP=7;NT=14;
s=0;
for i=1:NP
for j=1:NT
if X(i,j)==0
s=s+1;
end;
end;
end;
KT=s;
function KT1=KT1(Z,k)%Hàm kiem tra
NP=7;
s=0;
for i=1:NP
if (Z(i)==k)
s=s+1;
end;
end;
KT1=s;
51
Bộ số liệu Test
+ Số các bác sĩ tham gia trực NBS=10.
+ Số các y tá tham gia trực NYT=14.
+ Số các phòng khám NP=7.
+ Số các buổi trong lịch: NT=14.
Bảng 3.5: Bảng các bác sĩ phù hợp chuyên môn với phòng khám
(1-Phù hợp, 0-Không phù hợp)
Phòng 1 Phòng 2 Phòng 3 Phòng 4 Phòng 5 Phòng 6 Phòng 7
Bs 1 0 1 1 0 1 1 1
Bs 2 1 0 1 1 1 1 0
Bs 3 1 1 0 0 1 1 1
Bs 4 0 1 1 1 1 0 1
Bs 5 1 0 1 1 1 0 1
Bs 6 0 1 1 0 1 1 1
Bs 7 1 0 1 1 1 1 0
Bs 8 0 1 0 1 1 1 1
Bs 9 0 1 1 1 1 1 1
Bs 10 1 1 1 0 1 1 1
Bảng 3.6: Bảng các y tá phù hợp chuyên môn với phòng khám
(1-Phù hợp, 0-Không phù hợp)
Phòng 1 Phòng 2 Phòng 3 Phòng 4 Phòng 5 Phòng 6 Phòng 7
Yta 1 0 1 1 0 1 1 1
Yta 2 1 0 1 1 1 1 0
Yta 3 1 1 0 0 1 1 1
Yta 4 0 1 1 1 1 0 1
Yta 5 1 1 1 0 1 0 1
Yta 6 0 1 1 0 1 1 1
Yta 7 1 0 1 1 1 1 0
Yta 8 0 1 1 1 1 1 1
Yta 9 0 1 1 1 1 1 1
Yta 10 1 1 1 0 1 1 1
Yta 11 1 0 1 1 1 1 1
Yta 12 1 1 1 1 0 1 1
Yta 13 1 1 1 1 1 0 1
Yta 14 1 1 1 1 1 1 1
52
Bảng 3.7: Bảng các Bác sĩ sẵn sàng nhận buổi trực
(1-Sẵn sàng, 0-Không sẵn sàng)
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14
Bs 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1
Bs 2 1 2 1 1 0 1 1 1 1 1 1 1 1 1
Bs 3 1 1 0 1 1 1 1 1 1 0 1 1 1 1
Bs 4 1 1 1 1 1 1 1 1 1 1 0 1 1 1
Bs 5 1 1 1 0 1 1 0 1 1 1 1 1 1 1
Bs 6 0 1 1 1 1 1 1 1 1 1 1 1 1 1
Bs 7 1 1 0 1 1 1 1 1 1 1 1 1 1 1
Bs 8 1 1 1 1 1 1 1 1 1 0 1 1 1 1
Bs 9 1 1 1 1 1 0 1 1 1 1 1 1 1 1
Bs 1 1 1 0 1 1 1 1 1 1 1 1 1 1
10
Bảng 3.8: Bảng các Y tá sẵn sàng nhận buổi trực
(1-Sẵn sàng, 0-Không sẵn sàng)
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14
Yta 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
Yta 2 1 1 0 1 1 0 1 1 1 1 1 1 1 1
Yta 3 1 0 1 1 1 1 1 1 0 1 1 1 1 1
Yta 4 1 1 1 1 1 1 1 1 1 1 0 1 0 1
Yta 5 1 1 1 0 1 1 0 1 1 1 1 1 1 1
Yta 6 0 1 1 1 1 1 1 1 1 1 1 1 1 1
Yta 7 1 1 0 1 1 1 1 1 1 1 1 1 1 1
Yta 8 1 1 1 1 1 1 1 1 1 0 1 1 1 1
Yta 9 1 1 1 1 1 0 1 1 1 1 1 1 1 1
Yta10 1 1 1 0 1 1 1 1 1 1 1 1 1 1
Yta11 1 1 1 1 0 1 1 1 1 1 1 1 1 1
Yta12 1 0 1 1 1 1 1 1 1 1 1 1 1 1
Yta13 1 1 1 1 1 1 0 1 1 1 1 1 1 1
Yta14 1 1 1 1 1 1 1 1 1 1 1 1 1 1
53
Kết quả chạy chương trình trên bộ số liệu thực tế được đưa ra trong các bảng 3.9 và
3.10 và 3.11 (Lap_lich_tham_lam_2)
Bảng 3.9: Lịch trực tại các phòng trong các buổi
(Số hiệu bác sĩ – Số hiệu y tá)
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14
P1 2-2 3-5 5-3 7-7 10-10 2-11 3-12 5-13 7-14 10-2 2-3 3-5 5-7 7-10
P2 1-4 4-1 6-6 8-8 9-9 1-1 4-4 6-6 8-8 9-9 1-12 4-13 6-14 8-1
P3 9-11 10-2 2-4 1-6 4-5 5-7 6-8 7-9 9-10 1-11 10-13 2-12 4-1 5-14
P4 8-7 7-4 8-8 9-2 5-12 4-13 2-9 8-11 2-2 7-14 9-7 5-4 7-8 4-9
P5 3-3 6-6 10-5 3-3 1-1 3-10 10-3 1-5 6-6 6-10 3-11 8-14 9-13 10-2
P6 7-12 1-7 9-1 2-9 3-3 6-6 8-10 10-8 3-11 2-12 6-14 1-1 8-2 9-3
P7 4-5 5-13 4-9 4-4 6-4 10-5 1-6 3-10 5-12 6-13 8-8 9-11 10-3 1-14
Bảng 3.10: Số buổi trực đối với các bác sĩ
Bs1 Bs 2 Bs3 Bs4 Bs5 Bs6 Bs7 Bs8 Bs9 Bs10
11 9 10 10 10 10 8 10 10 10
Bảng 3.11: Số buổi trực đối với các y tá
YT1 YT2 YT3 YT4 YT5 YT6 YT7 YT8 YT9 YT10 YT11 YT12 YT13 YT14
7 7 8 8 7 7 6 7 7 7 7 7 7 6
Nhận xét: Kết quả nhận được là kết quả gần đúng. Điều kiện tối ưu chưa
đảm bảo tốt vì thuật toán không xét đến hàm mục tiêu (Chỉ xét theo thứ tự lần lượt
các bác sĩ và các y tá để xếp vào lịch mà không đánh giá hàm mục tiêu)
Phương án 2: Thuật toán GA
Xây dựng cấu trúc dữ liệu
Lựa chọn cấu trúc cá thể: Kí hiệu 1 phương án xếp lịch là cặp 2 ma trận
[ZBS(NPK,NBT) ;ZYT(NPK,NBT] trong đó
- ZBS(p,t)=k : Phân công bác sĩ có số hiệu k trực phòng khám p, tại buổi t,
- ZYT(p,t)=k : Phân công Y tá có số hiệu k trực phòng khám p, pPK tại
buổi t.
Như vậy tập hợp các phương án chính là tập hợp các cặp ma trận các phần tử
là các số nguyên dương có giá trị là các số hiệu của các Bác sĩ hoặc của các Y tá.
Điều kiện phân công hợp lệ là trên một cột của các ma trận ZBS và ZYT không có
54
các phần tử có giá trị trùng nhau tức là tại 1 thời điểm mỗi bác sĩ hoặc y tá chỉ được
trực tại 1 phòng khám.
Hàm CBS(k) có giá trị bằng tổng tất cả các phần tử trong ma trận phương án
ZBS thỏa mãn điều kiện ZBS(p,t)=k, với mọi 1;1;pNPKtNBT Như vậy
CBS(k) chính là tổng số buổi trực của bác sĩ k trong toàn lịch trực.
Hàm CYT(k) có giá trị bằng tổng tất cả các phần tử trong ma trận phương án
ZYT thỏa mãn điều kiện XYT(p,t)=k, với mọi 1;1;pNPKtNBT Như vậy
CYT(k) chính là tổng số buổi trực của y tá s trong toàn lịch trực.
Các ràng buộc của bài toán
+ R1: Tại một thời điểm t, 1 bác sĩ chỉ được trực nhiều nhất là 1 phòng khám
sẽ tương đương với điều kiện: Trên một cột của ma trận ZBS không tồn tại 2 phần
tử bằng nhau. Xây dựng hàm R1(ZBS) để kiểm tra điều kiện R1 trong phương án
ZBS.
+ R2: Tại một thời điểm t, 1 y tá chỉ được trực nhiều nhất là 1 phòng khám sẽ
tương đương với điều kiện: Trên một cột của ma trận ZYT không tồn tại 2 phần tử
bằng nhau. Xây dựng hàm R2(ZYT) để kiểm tra điều kiện R2 trong phương án XY.
+ R3: Chỉ xếp lịch trực cho các bác sĩ sẵn sàng trong buổi trực tương ứng sẽ
tương đương với điều kiện: Nếu ZBS(p,t)=s thì MBS(s,t)=1 hay
MBS(ZBS(p,t),t)=1.
+ R4: Chỉ xếp lịch trực cho các y tá sẵn sàng trong buổi trực tương ứng sẽ
tương đương với điều kiện: Nếu ZYT(p,t)=s thì MYT(s,t)=1 hay
MYT(ZYT(p,t),t)=1.
+ R5: Các bác sĩ và Y tá chỉ được phép trực tại các phòng khám phù hợp về
chuyên môn đào tạo sẽ tương đương với điều kiện: Nếu ZBS(p,t)=s thì PK(s,p)=1
hay PK(ZBS(p,t),p)=1. Nếu ZYT(p,t)=s thì PK(s,p)=1 hay PK(XY(p,t),p)=1.
Kết hợp 3 điều kiện R3,R4 và R5, điều kiện thỏa mãn đồng thời chính là
55
BT(XB(p,t),t)× PBS(XB(p,t),p) × BT(XY(p,t),t)× PYT(X(p,t),p)=1; với mọi
1;1;pNPtNT
Xây dựng hàm R345(X) là hàm kiểm tra điều kiện H3, H4 và H3 trong phương
án Z =[ZBS;ZYT].
+ R6: Tại mọi thời điểm, các phòng khám đều phải có bác sĩ trực và y tá sẽ
tương đương với tất cả các phần tử trong cặp ma trận Z=[ZBS;ZYT] đều dương.
ZBS(p,t)>0; ZYT(p,t)>0; với mọi
Chúng ta kí hiệu hàm R6(X) để kiểm tra điều kiện H6.
Hàm mục tiêu của bài toán: Vì tổng số các buổi trực của các bác sĩ và y tá luôn
bằng NP×NT (Giả thiết tất cả các phòng khám đều phải xếp kín tất cả các buổi), do
đó sử dụng bất đẳng thức Bunhiakovski: “Tổng các phần tử là không đổi thì tích
sẽ đạt giá trị lớn nhất khi tất cả các phần tử bằng nhau”, ta suy ra để đảm bảo yêu
cầu của bài toán: số các buổi trực của các bác sĩ là xấp xỉ bằng nhau sẽ tương đương
với: Hãy xác định phương án Z=[ZBS;ZYT] thỏa mãn tất cả các ràng buộc để sao
cho 2 hàm mục tiêu:
NBS
FBXCBSsm()()ax
s1
NYT
FYXCYTtm()( )ax
t1
Như vậy bài toán lập trực được đưa về bài toán: Hãy xác định phương án X
thỏa mãn cás sĩc ràng buộc mô tả bởi các hàm ràng buộc R1(X), R2(X), R345(X),
R6(X) để sao cho hàm mục tiêu F()()()ax ZFB ZBSFY ZYTm
Thuật toán GA
B1
Các file đính kèm theo tài liệu này:
- luan_van_thuat_toan_xap_xi_ung_dung_vao_mot_so_bai_toan_lop.pdf