Bài toán phân công trực tại các khoa chuyên môn

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán xấp xỉ ứng dụng vào một số bài toán lớp NP (Trang 48 - 52)

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.

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

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(k<=NB,KT(X)>0) 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;

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

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

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán xấp xỉ ứng dụng vào một số bài toán lớp NP (Trang 48 - 52)