Cài đặt thuật toán Nhánh cận

Một phần của tài liệu một số thuật toán giải bài toán phủ tập hợp và ứng dụng (Trang 61 - 65)

Khi ứng dụng thuật toán tham lam để giải quyết bài toán phân lịch trực bác sĩ chúng ta luôn tìm đƣợc giải pháp nhanh hơn các thuật toán khác nhƣng kết quả thì chƣa hẳn đó là giải pháp tối ƣu nhất. Vì vậy, trong phần này chúng tôi sẽ cài đặt thuật toán nhánh cận để giải quyết bài toán phân lịch trực bác sĩ, từ đó chúng ta sẽ đối sánh hai giải pháp trong những trƣờng hợp đầu vào của bài toán.

Ta gọi tập tất cả các phƣơng án của bài toán (tập S0) sẽ đƣợc chia nhỏ dần thành nhiều tập con rời nhau, mỗi tập con bao gồm những phƣơng án có sử dụng bác sĩ và không sử dụng bác sĩ i cho các dịch vụ cấp cứu hay không sẽ đƣợc ấn định dần trong quá trình giải bài toán. Mỗi tập con này đƣợc gắn với một số nguyên không âm, biểu thị cận dƣới của chi phí đối với mọi phƣơng án thuộc tập này. Tập con Sk

có cận dƣới nhỏ nhất sẽ có nhiều khả năng chứa phƣơng án tối ƣu, vì thế tập Sk sẽ đƣợc chọn để chi nhỏ tiếp (phân nhánh). Khi phân nhánh Sk Sk1 Sk2 sao cho một tập Sk2 bắt buộc có sử dụng bác sĩ xr nào đó, một tập Sk1 không đƣợc sử dụng bác sĩ

xr. Khi một tập con nào đó chỉ gồm một phƣơng án duy nhất thì ta sẽ tính đƣợc chi

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

biết, giá trị hàm mục tiêu của bài toán ứng với phƣơng án tốt nhất hiện biết gọi là

giá trị kỷ lục. Tập con nào có cận dƣới lớn hơn hay bằng giá trị kỷ lục sẽ bị loại

(không cần xem xét tiếp nữa), vì chắc chắn tập này không chứa phƣơng án nào tốt hơn phƣơng án tốt nhất hiện biết. Quá trình giải kết thúc khi không còn tập con nào cần xem xét tiếp. Khi đó, phƣơng án tốt nhất hiện biết sẽ là phƣơng án tối ƣu của bài toán. Tính hữu hạn của thuật toán đƣợc suy ra từ tính hữu hạn của tập S0.

Giả sử ta cần phân nhánh tập Sp S0. Cách hay dùng là phân chia tập này thành hai tập con rời nhau '

p S , '' p S với ' | , 0 p p r S x x S x , '' | , 1 p p r S x x S x

Trong đó, xr là biến chƣa cố định ở giá trị 0 hay 1 trong tập Sp. Giá trị r dùng để phân nhánh đƣợc chọn sao cho tập ''

p

S có nhiều khả năng chứa phƣơng án tối ƣu, còn tập '

p

S thì không. Nói cách khác, r đƣợc chọn sao cho hiệu số các cận dƣới của ''

p

S và '

p

S là lớn nhất có thể đƣợc.

Để giải quyết vấn đề này, ta chỉ cần xét tập các phƣơng án ban đầu S0 đƣợc chia thành hai tập rời nhau S1 và S2 với

1 | 1, r 0

S x x S x ,

2 | 2, r 1

S x x S x

Trong tập S2 cấu trúc bài toán không thay đổi, trừ ra cột r bị loại. Các cột còn

lại chỉ chứa các phần tử không âm, vì thế ứng với S2 một cận dƣới đối với giá trị hàm mục tiêu tăng thêm là (S2) cr.

Trong tập S1 do cố định xr 0 nên từ các điều kiện của bài toán suy ra phải có một xj 1(j r). Vì thế ( )1 min j

j r

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

thêm. Ta sẽ chọn biến xr sao cho hiệu giữa các cận dƣới này là lớn nhất, nghĩa là đạt

1 2 (adsbygoogle = window.adsbygoogle || []).push({});

ax ( ) ( )

r

m S S

Nếu cr 0 thì ( )S1 0 (do trên cột r của C đều chứa số 0), còn (S2) cr 0, từ đó ( )S1 (S2) 0. Vì thế để có hiệu giữa các cận dƣới này là lớn nhất ta chỉ cần xét r với cr 0. Trong trƣờng hợp này (S2) 0 và ( )S1 0.

Điều này có nghĩa là ta có thể chọn biến xr để phân nhánh theo qui tắc

0 ( ) ax ( ) min p p c p r m p c

Lập luận trên đây cũng đủng cả khi các tập phƣơng án Si về sau đƣợc chia thành các tập S Sr, r 1 nhƣng thay cho mức tăng của các cận dƣới ( )S1 và (S2) ta xét mức tăng của các cận dƣới (Sr) và (Sr 1) tƣơng ứng.

Nếu tập đƣợc xét không phải là S0 mà là

1 2 0 1 2 | , , ,..., k p i i i k S x x S x x x ,

Thì qui tắc chọn biến để phân nhánh về cơ bản vẫn nhƣ trƣớc, tuy nhiên cần tiến hành một số thay đổi. Trƣớc hết, đó là việc thực hiện các lựa chọn bắt buộc. Chẳng hạn, nếu xj 0, j 1,...,v 1,v 1,...,n thì tất nhiên phải có xv 1. Cũng làm vậy đối với các cột.

Một số loại lựa chọn bắt buộc khác: Khi đã cố định xr 1 thì phải có xr 0

bằng cách đặt cr . Hơn nữa, nếu Sp chứa r gồm ít nhất 2 và nhiều nhất n-2 bác sĩ

1 ... 1 ... 1 1

u u v v

i i r i i i

x x x x x (1 v n 3)

ở mỗi bƣớc lặp, trƣớc khi tính các cận dƣới cho các tập mới, cần thực hiện những lựa chọn bắt buộc nêu trên. Có nhƣ vậy mới thu đƣợc những cận dƣới chính

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

xác và tránh đƣợc những phân nhánh vô ích.

Input: Cho tập m danh sách các dịch vụ cấp cứu U e e1, 2,...,em , Tập danh sách các dịch vụ mà n bác sĩ có thể thực hiện: S S1, 2,...,Snvà danh sách các chi phí phải trả cj,j 1,...,n.

Output: Vectơ x 0,1k

Thuật toán:

Bƣớc 1: Xuất phát từ x1, xây dựng một phƣơng án mẫu f*

Bƣớc i: - Đã xây dựng đƣợc nghiệm thành phần x x1, 2,...,xi 1 - Đánh giá cận: tìm g xác định trên xi: 1 1 1 ( ,..., i i) min{ ( ) : ( ,..., n) g c x c x f a a a a thuộc X, cixi=ai, i=1,…,n}

- Giả sử x* là lời giải tốt nhất tại thời điểm đó, f* là giá trị tốt nhất * *

( )

f f x

o Nếu *

f g có thể bỏ đi không cần phát triển lời giải bộ phận 1, 2,..., i

x x x (adsbygoogle = window.adsbygoogle || []).push({});

o Ngƣợc lại: tiến hành bƣớc i+1 để xác định xi+1

Thuật toán nhánh cận giải quyết bài toán phân lịch bác sĩ sẽ cho kết quả tối ƣu nhất đƣợc xác định bởi mảng x. Trong đó với mỗi bác sĩ đƣợc chọn thì x[i] sẽ nhận giá trị là 1 ngƣợc lại là 0. Trong trƣờng hợp chúng ta có n bác sĩ thì trong trƣờng

hợp xấu nhất độ phức tạp tính toán là 2n. Tuy nhiên trong quá trình tìm kiếm các bƣớc chọn kế tiếp x[i+1], x[i+2],.. chúng ta đã loại bỏ sớm những phƣơng án chắc chắn không phải là tối ƣu.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Một phần của tài liệu một số thuật toán giải bài toán phủ tập hợp và ứng dụng (Trang 61 - 65)