Cơ chế thực hiện GA

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 36)

Mã hóa

Để có thể thực hiện GA, vấn đề đầu tiên là xuất phát từ bài toán thực tế, ta cần phải mô tả các phương án của bài toán dưới một dạng nào đó (mô hình toán học, tin học, …). Vấn đề mô tả đó được gọi là các phương pháp mã hóa. Thông thường người ta sử dụng một trong các phương pháp như sau:

+ Mã hoá nhị phân: Mã hoá nhị phân là phương pháp mã hoá NST phổ biến nhất. Trong mã hoá nhị phân, mỗi NST là một chuỗi nhị phân. Khi đó, mỗi chuỗi nhị phân sẽ biểu diễn hàm tại một tập giá trị của các biến. Mã hoá nhị phân tuy là phổ biến nhưng nó có một nhược điểm là có thể tạo ra không gian mã hoá lớn hơn so với không gian giá trị của NST. Do đó, với nhiều bài toán thì biểu diễn nhị phân là không hữu hiệu.

+ Mã hoá hoán vị: Trong mã hoá hoán vị, mỗi NST là một chuỗi các số biểu diễn một thứ tự sắp xếp. Mã hoá hoán vị phù hợp cho các bài toán liên quan đến thứ tự. Đối với các bài toán này. Mã hoá hoán vị có thể được sử dụng trong các bài toán liên quan đến thứ tự như bài toán du lịch hay bài toán lập lịch.

+ Mã hoá số thực: Mã hoá trực tiếp theo giá trị có thể được dùng trong các bài toán sử dụng giá trị phức tạp như trong số thực. Trong đó, mỗi NST là một chuỗi các giá trị thực. Mã hoá số thực thường dùng cho các bài toán đặc biệt. Thông thường mỗi NST được mã hóa là một véc tơ trong không gian. Cách mã hóa này thường sử dụng đối với các bài toán tối ưu số và được phát triển mạnh trong giai đoạn hiện nay.

 Khởi tạo quần thể ban đầu

 Khởi tạo quần thể ban đầu là bước đầu tiên trong GA để tạo ra một cách ngẫu nhiên các lời giải ban đầu. Tuỳ vào từng bài toán cụ thể mà ta có các phương pháp khởi tạo khác nhau. Chất lượng của quần thể ban đầu càng cao thì lời giải mà GA đưa ra càng tốt. Thông thường chúng ta dùng phương pháp ngẫu nhiên để khởi tạo.

 Xác định hàm thích nghi

 Hàm thích nghi được xây dựng sao cho giá trị thích nghi phải phản ánh được giá trị thực của NST trong việc đáp ứng yêu cầu của bài toán. Đối với bài toán tối ưu hóa thì hàm thích nghi chính là hàm mục tiêu của bài toán.

 Cơ chế lựa chọn

 Cơ chế lựa chọn được áp dụng khi chọn các cá thể từ quần thể để thực hiện việc lai ghép và đột biến, tạo ra quần thể ở thế hệ tiếp sau Có nhiều cách để lựa chọn các cá thể từ một quần thể. Tùy từng mô hình bài toán khác nhau, chúng ta có thể xây dựng các phương pháp lựa chọn khác nhau: thông thường người ta sử dụng một trong 2 phương pháp sau để lựa chọn các cá thể vào quá trình lai ghép

 + Lựa chọn ngẫu nhiên theo xác suất từ quần thể lấy N cá thể để thực hiện lại ghép

 Các toán tử di truyền

 Các toán tử di truyền của GA là toán tử lai ghép và đột biến. Đây là hai toán tử có tác động lớn đến chất lượng của giải thuật. Các toán tử này được xây dựng phụ thuộc vào cách mã hoá các NST. Tuỳ thuộc vào các bài toán cụ thể và cách mã hoá NST mà ta xây dựng hai loại toán tử này thích hợp. Thông thường người ta thưởng sử dụng các toán tử lai ghép dưới dạng sau đây

+ Lai ghép đơn điểm:

- Một điểm cắt được chọn tại một vị trí thứ k trên NST.

- Từ đầu NST đến vị trí thứ k, NST con sao chép từ cha, phần còn lại sao chép từ mẹ.

+ Lai ghép hai điểm:

- Hai điểm cắt được chọn .

- Từ đầu cho đến điểm cắt thứ nhất được sao chép từ cha, từ điểm cắt thứ nhất đến điểm cắt thứ hai sao chép từ mẹ và phần còn lại sao chép từ cha.

+ Lai ghép mặt nạ :

- Xây dựng một mặt nạ là một chuỗi nhị phân có chiều dài bằng chiều dài NST, Mặt nạ được phát sinh ngẫu nhiên đối với từng cặp cha mẹ.

- Xây dựng NST mới: Duyệt qua mặt nạ, bit có giá trị 1 thì sao chép gen tại vị trí đó từ NST cha sang con, bit có giá trị 0 thì sao chép từ mẹ.

Sau đây chúng ta nghiên cứu một số bài toán NP mà lời giải xấp xỉ nhận được từ GA

Ví dụ 2.4: Bài toán KNAPSACK

Input: + Cho n đồ vật, đồ vật thứ i có thể tích là ai, có giá trị là pi

+ Cho 1 ba lô có thể tích b

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

Phân tích

Kí hiệu: Một phương án lấy đồ vật là một dãy nhị phân X = ( ,x x1 2, ...,xn)có độ dài n trong đó giá trị bit 0 tương ứng với không lấy đồ vật và giá trị bit 1 là lấy đồ vật tương ứng.

Khi đó: + Hàm mục tiêu của bài toán là 1 ( ) ax n i i k f X x p m = = å ®

+ Điều kiện ràng buộc của bài toán

1 n i i k x a b = £ å

Chúng ta sử dụng toán tử lại ghép nhị phân đơn điểm hoặc đa điểm. Trong quá trình lai ghép và chọn lọc luôn luôn chọn các phương án thỏa mãn điều kiện ràng buộc. Khi đó thuật toán GA được mô tả bằng ngôn ngữ Matlab như sau

function KA = KNAPSACK (A,C,b,KK) clc; N=length(A);M=10;%popsize %Khoi tao M=0; while M<=10 z=round(rand(1,N));s=0; for i=1:N s=s+A(i)*z(i); end; if s<=b M=M+1; Quan_the(M,:)=z; end; end; % thuat toan GA count=0;k=3; while count<KK count=count+1; socon=M;

for i=1:M-1 % Lai ghep for j=i+1:M bo=Quan_the(i,:);me=Quan_the(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; s1=0; for l=1:N s1=s1+A(l)*con1(l);

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:

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

1 ( ) os( )( ) n i k k k f X c px a b = = å -

Chú ý: cos(0)=1 ứng với trạng thái không lật quân, cos( )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;

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;

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ế.

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ý.

Đượ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.

- Quy trình Điều trị, khám bệnh BỆNH NHÂN PHÒNG KHÁM NHẬP KHOA NỘI TRÚ XUẤT KHOA VIỆN PHÍ KẾT THÚC QUÁ TRÌNH NỘI TRÚ DỰ TRÙ VÀ HOÀN TRẢ HAO PHÍ THEO KHOA

PHÒNG

CÔNG NỢ

DỰ TRÙ VÀ HOÀN TRẢ HAO PHÍ THEO BỆNH NHÂN

CHỈ ĐỊNH TẠM

ỨNG VIỆN PHÍ

CHỈ ĐỊNH CẬN LÂM SÀNG PHẪU THUẬT, THỦ THUẬT

THỰC HIỆN CẬN LÂM SÀNG

- 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

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 36)