THUẬT TOÁN NHÁNH CẬN GIẢI BÀI TOÁN NGƯỜI DU LỊCH

Một phần của tài liệu SLIDE TOÁN RỜI RẠC Chương 2 5 BÀI TOÁN TỐI ƯU TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHÁT (Trang 71 - 102)

w trọng lượng còn lại của tú

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀI TOÁN NGƯỜI DU LỊCH

TỐN NGƯỜI DU LỊCH

Mục này sẽ trình bày một cách thể hiện khác những tư tưởng của thuật toán nhánh cận vào việc xây dựng thuật toán giải bài toán người du lịch.

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Xét bài toán người du lịch phát biểu trong mục trước, Gọi

C = {cij: i, j = 1, 2, …, n}

là ma trận chi phí. Mổi hành trình của người du lịch

T(1) → T(2) →... → T(n) → T(1)

có thể viết lại dưới dạng

((1), (2)), ((2), (3))..., ((n-1), (n)), ((n), (1))

trong đó mỗi thành phần ((j-1), (j)) sẽ được

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH Phân nhánh: Phân tập các hành trình ra thành hai tập con:  một tập gồm những hành trình chứa một cạnh (i, j) nào đó

 cịn tập kia gồm những hành trình khơng chứa cạnh này

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TỐN NGƯỜI DU LỊCH

Sau khi phân nhánh ta sẽ tính cân dưới của giá trị hàm mục tiêu trên mỗi một trong hai tập con nói trên.

Việc tìm kiếm sẽ được tiếp tục trên tập con có giá trị cận dưới nhỏ hơn.

Thủ tục này sẽ được tiếp tục cho đến khi thu được một hành trình đầy đủ, tức là một phương án của bài tốn người du lịch

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Một kỹ thuật cơ bản nữa của thuật tốn là tính cận dưới sẽ được xây dựng dựa trên thủ tục rút gọn

Thủ tục rút gọn

Nếu ta trừ bớt mỗi phần tử của một dòng (hay

cột) của ma trận C đi cùng một số α thì độ dài của tất cả các hành trình sẽ cùng giảm đi α, vì thế hành trình tối ưu cũng sẽ khơng thay đổi.

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

function Reduce(A, k): real;

(*Thủ tục rút gọn ma trận *)

begin

sum := 0;

for i := 1 to k do

(*k - kích thước của A*) begin r[i]:= <phần tử nhỏ nhất trong dòng i>; if r[i] > 0 then begin <Bớt mỗi phần tử của dòng i đi r[i]>;

sum := sum + r[i]; end; end; for j := i to k do begin s[j] := <phần tử nhỏ nhất trong cột j>; if s[j] > 0 then begin <Bớt mỗi phần tử của cột j đi s[j]>; sum := sum + s[j]; end; end; Reduce := sum; end;

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TỐN NGƯỜI DU LỊCH

Thí dụ, Ta có ma trận chi phí của bài tốn người du lịch với n = 6 thành phố sau

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Đầu tiên trừ bớt mỗi phần tử của các dòng 1, 2, 3, 4, 5, 6 cho các hằng số rút gọn tương ứng là 3, 4, 16, 7, 25, 3,

Sau đó trong ma trận thu được, trừ bớt các phần tử của các cột 3 và 4 cho các hằng số rút gọn tương ứng là 15 và 8, ta thu được ma trận rút gọn sau

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Tổng các hàng số rút gọn là 81, Vì vậy cận dưới cho tất cả các hành trình là 81 (nghĩa là khơng thể tìm

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITỐN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Bây giờ, ta xét cách phân tập các phương án ra thành hai tập. Giả sử là ta chọn cạnh (6, 3) để phân nhánh.

Khi đó tập các hành trình sẽ được phân thành hai tập con, một tập là các hành trình chứa cạnh (6, 3), cịn tập kia là các hành trình khơng chứa cạnh (6, 3).

Vì biết cạnh (6, 3) là khơng được tham gia vào hành trình, nên ta có thể cấm việc đi

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Ma trận thu được sẽ có thể rút gọn bằng cách bớt mỗi phần tử của cột 3 đi 48 và khơng bớt gì các phần tử của dịng 6

 Như vậy ta thu được cận dưới cho các hành trình khơng chứa cạnh (6 , 3) là 81 + 48 = 129

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Đối với tập các hành trình chứa cạnh (6, 3) ta phải loại dòng 6 và cột 3 khỏi ma trận tương ứng với nó, bởi vì đã đi theo cạnh (6, 3) thì khơng thể đi từ 6 sang bất cứ nơi nào khác và cũng không được phép đi từ bất cứ đâu vào 3

Kết quả ta thu được ma trận với bậc giảm

đi 1. Ngoài ra, do đã đi theo cạnh (6, 3) nên không được phép đi từ 3 đến 6 nữa, vì vậy ta cần cấm đi theo cạnh (3, 6) bằng cách đạt C36

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Cạnh (6, 3) được chọn để phân nhánh vì phân nhánh theo nó ta thu được cận dưới của nhánh bên phải là lớn nhất so với việc phân nhánh theo các cạnh khác.

 Trong quá trình tìm kiếm chúng ta ln đi theo nhánh bên trái trước.

 Nhánh bên trái sẽ có ma trận rút gọn với bậc giảm đi một.

 Trong ma trận của nhánh bên phải ta thay một số bởi , và có thể rút gọn thêm được ma trận này khi tính lại các hằng số rút gọn theo dòng và cột tương ứng với cạnh phân nhánh, nhưng kích thước của ma trận

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Do cạnh cần chọn để phân nhánh phải là cạnh làm tăng cận dưới của nhánh bên phải lên nhiều nhất, nên để tìm nó ta sẽ chọn số khơng

nào trong ma trận mà khi thay nó bởi  sẽ

cho ta tổng hằng số rút gọn theo dịng và cột chứa nó là lớn nhất.

Ta có thủ tục sau đây để chọn cạnh phân

nhánh (r,c):

Đầu vào: Ma trận rút gọn A kích thước k x k

Đầu ra: Cạnh phân nhánh (r, c) và tổng hằng số

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH procedure BestEdge(A,k,r,c,beta); (* T hủ tục phân nhánh *) begin beta := -; for i:=1 to k do for j:= 1 to k do if a[i,j] = 0 then begin

minr := <phần tử nhỏ nhất trên dòng i khác với a[i,j]> minc := <phần tử nhỏ nhất trên cột j khác với a[i,j]> total := minr + minc;

if total > beta then begin beta := total; r := i; (* chỉ số dòng của cạnh tốt nhất *) c := j; (* chỉ số cột của cạnh tốt nhất *) end; end; end; 86

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Trong ma trận rút gọn 5 x 5 của nhánh bên trái ở hình 1, số 0 ở vị trí (4, 6 ) sẽ cho tổng hằng số rút gọn là 32 (theo dòng 4 là 32, cột 6 là 0). Đây là giá trị lớn nhất đối với các số 0 của ma trận này.

 Vì vậy, việc phân nhánh tiếp theo sẽ dựa vào cạnh (4, 6).

 Khi đó cận dưới của nhánh bên phải tương ứng với tập các hành trình đi qua cạnh (6,3) nhưng khơng đi qua (4,6) sẽ là 81 + 32 = 113.

 Còn nhánh bên trái sẽ tương ứng với ma trận 4x4, vì rằng ta phải loại bỏ dịng 4 và cột 6. Tinh huống

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TỐN NGƯỜI DU LỊCH

Vì cạnh (4, 6) và (6, 3) đã nằm trong hành trình nên cạnh (3, 4) khơng thể được đi qua nữa (nếu khơng ta sẽ có một hành trình con từ những thành phố này).

Để ngăn ngừa việc tạo thành hành trình con ta sẽ gán cho phần tử ở vị trí (3, 4) giá trị .

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Tiếp tục, ta lại phân nhánh từ đỉnh bên trái bằng cách sử dụng cạnh (2, 1), vì số 0 ở vị trí này có tổng các hàng số rút gọn là 17 + 3 = 20 (theo dòng 2 là 17, theo cột 1 là 3).

 Sau khi phân nhánh theo cạnh (2, 1) ma trận của

nhánh trái có kích thước là 3 x 3. Vì đã đi qua (2, 1) nên ta cấm cạnh (1, 2) bằng cách đặt C12 = , ta thu

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Ma trận này có thể rút gọn được bằng cách bớt 1 từ cột 2 và bớt đi 2 ở dịng 1. Điều đó dẫn đến ma trận

 Ta có cận dưới của nhánh tương ứng là 81 + 1 + 2 = 84. Cây tìm kiếm cho đến bước này được thể

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Sau khi đã chấp nhận n-2 cạnh vào hành trình thì ma trận cịn lại sẽ có kích thước là 2 x 2.

 Hai cạnh cịn lại của hành trình sẽ khơng phải chọn lựa nữa, mà được kết nạp ngay vào chu trình.

 Trong ví dụ của chúng ta ở đây, sau khi đã có các cạnh (6, 3), (4, 6 ), (2, 1) và (1, 4) ma trận của nhánh trái có dạng

 Vì vậy ta kết nạp nốt hai cạnh (3, 5) và (5, 2) vào và thu được hành trình 1, 4, 6, 3, 5, 2, 1 với chi phí là

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Khi chuyển động từ gốc theo nhánh bên trái xuống

phía dưới kích thước của các ma trận chi phí A sẽ giảm dần.

 Cuối cùng khi ma trận A có kích thước 2x2 thì ta

chấm dứt việc phân nhánh và kết nạp 2 cạnh cịn lại để thu được hành trình của người du lịch

 trong đó u, v, w, x có thể là 4 đỉnh khác nhau hoặc

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Trong mọi trường hợp để xác định xem hai

cạnh nào cần phải kết nạp nốt ta chỉ cần xét một phần tử của ma trận A if A [l, l] =  then Kết nạp cạnh (u,x) và (v,w) else Kết nạp cạnh (u,w) và (v,x);

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

 Tất cả các nút của cây có cận dưới lớn hơn 104 có thể loại bỏ vì chúng khơng chứa hành trình rẻ hơn.

 Trên hình 3 ta thấy chỉ cịn nút có cận dưới 101 là cần phải xét tiếp.

 Nút này tương ứng với tập những hành trình chứa

các cạnh (6 , 3), (4, 6 ) và không chứa cạnh (2,1). Ma trận chi phí tương ứng với đỉnh này có dạng

2.5.3. THUẬT TOÁN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Việc phân nhánh sẽ dựa vào cạnh (5, 1) với tổng hằng số rút gọn là 26. Việc rẽ nhánh tiếp theo từ nút này được cho trong hình 4.

2.5.3. THUẬT TỐN NHÁNH CẬN GIẢI BÀITOÁN NGƯỜI DU LỊCH TOÁN NGƯỜI DU LỊCH

Như vậy chúng ta thu được hai hành trình tới ưu với chi phí là 104.

Thí dụ trên cho thấy rằng bài tốn người du lịch có thể có nhiều phương án tối ưu.

Đối với thí dụ trên ta chỉ phải xét 13 nút, trong khi tổng số hành trình của người du lịch là 120.

Một phần của tài liệu SLIDE TOÁN RỜI RẠC Chương 2 5 BÀI TOÁN TỐI ƯU TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHÁT (Trang 71 - 102)

Tải bản đầy đủ (PDF)

(117 trang)