Thủ tục chọn cạnh phân nhánh (r,c)

Một phần của tài liệu phát triển các kỹ thuật nhánh cận và ứng dụng (Trang 55 - 58)

3. Hƣớng nghiên cứu của đề tài

3.2.Thủ tục 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ố rút gọn theo dòng r cột c là beta. procedure BestEdge(A,k,r,c,beta); [5] (* Thủ 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]>;

mine := <phần tử nhỏ nhất trên cột j khác với a[i,j]>;

total := minr + mine;

if total > beta then begin beta := total;

r := i;(*chỉ số dòng của cạnh tốt nhất*)

51

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

c := j; (* chỉ số cột của cạnh tốt nhất *)

end; end;

end;

Trong ma trận rút gọn 5x5 của nhánh bên trái ở hình 5, số không ở 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ố không 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 4 x 4, vì rằng ta phải loại bỏ dòng 4 và cột 6. Tình huống phân nhánh này đƣợc mô tả trong hình 6.

1 2 4 5 1 2 4 5 6 1 ∞ 0 2 30 1 ∞ 0 2 30 6 2 0 ∞ 30 17 2 0 ∞ 30 17 12 3 29 1 12 0 3 29 1 12 0 ∞ 5 3 21 0 ∞ 4 0 51 ∞ 17 ∞ 5 3 21 0 ∞ 0 Hình 5. Minh họa rút gọn hành trình 2

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ố không ở vị trí này có tổng các hằng số rút gọn là 17 + 3 = 20 (theo

Tập các hành trình qua cạnh (6,3) Hành trình chứa (6,3), (4,6) Hành trình chứa (6,3) không chứa (4,6) Cận dƣới = 81 Cận dƣới = 113 Cận dƣới = 81

52

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ đò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à 3x3. Vì đã đi qua (2, 1) nên ta cấm cạnh (1,2) bằng cách đặt c12 = ∞, ta thu đƣợc ma trận sau: 2 4 5 1 ∞ 2 30 3 1 ∞ 0 5 21 0 ∞ 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: 2 4 5 1 ∞ 0 28 3 0 ∞ 0 5 20 0 ∞

Ta có cận dƣới của nhánh tƣơng ứng là 81 + 1 + 2 = 84..

Chú ý rằng 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

2 5

3 ∞ 0

5 0 ∞

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à 104.

Chú ý: Trong quá trình tìm kiếm mỗi một nút của cây tìm kiếm sẽ tƣơng ứng với một ma trận chi phí A. ở bƣớc đầu tiên ma trận chi phí tƣơng ứng với gốc chính là ma trận c. Khi chuyển động từ gốc theo nhánh bên trái

53

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ 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. Dễ thấy rằng ma trận rút gọn cuối cùng này chỉ có thể có một trong hai dạng sau:

x y x y

U 0 ∞ u ∞ 0

V ∞ 0 v 0 ∞ (adsbygoogle = window.adsbygoogle || []).push({});

trong đó u, x, w, y có thể là 4 đỉnh khác nhau hoặc chỉ có 3 đỉnh khác nhau. 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[1,1] = ∞ then

Kết nạp cạnh (u,y) và (v,x) else

Kết nạp cạnh (u,x) và (v,y);

Một phần của tài liệu phát triển các kỹ thuật nhánh cận và ứng dụng (Trang 55 - 58)