Ví dụ: Xét đồ thị định hướng có 4 đỉnh và độ dài các cung được cho bởi ma trậ nC như sau

Một phần của tài liệu Giáo trình phân tích thiết kế thuật toán (nghề lập trình máy tính) (Trang 144 - 146)

d(i, S) = (C[i, k] + d(k, S - {k}) (1)

Nghiệm tối ưu cần tìm là d(1, V - {1}) và

d(1, V - {1}) = (C[1, k] + d(k, V - {1, k}) (2)

Như vậy chúng ta sẽ tính được d(1, V - {1}) nếu ta biết được d(k, V - {1} với mọi k = 2, ..., n. Rõ ràng là d(i, ) = C[i, 1] với 2 i n. Sử dụng (1) ta tính được d(i, S) với tất cả S chỉ chứa 1 đỉnh. Từ đó ta tính được d(i, S) với S chỉ chứa 2 đỉnh. Tiếp tục ta tính được d(i, S) với S chứa 3 đỉnh, 4 đỉnh, ... cho tới khi ta tính được các d(k, V - {1, k}) với k = 2, .., n. Từ dó, theo (2) ta tính được độ dài đường đi ngắn nhất của người bán hàng.

Ví dụ : Xét đồ thị định hướng có 4 đỉnh và độ dài các cung được cho bởi ma trận C nhưsau sau 0 10 15 20 5 0 9 10 6 13 0 12 8 8 9 0 Ta có : d(2, ) = C[2, 1] = 5 d(3, ) = C[3, 1] = 6 d(4, ) = C[4, 1] = 8 Sử dụng (2) ta tính được : d(2, {3}) = C[2, 3] + d(3, ) = 15 d(2, {4}) = 18 d(3, {2}) = 18

d(3, {4}) = 20 d(4, {2}) = 13 d(4, {3}) = 15

Tiếp theo ta tính được d(i, S) với i  1, và S gồm hai đỉnh khác 1 và ị d(2, {3, 4}) = min {C[2, 3] + d(3, {4}), C[2, 4] + d(4, {3})} = 25 d(3, {2, 4}) = min {C[3, 2] + d(2, {4}), C[3, 4] + d(4, {2})} = 25 d(4, {2, 4}) = min {C[4, 2] + d(2, {3}), C[4, 3] + d(3, {2}) } = 23 Cuối cùng ta có : d(1, {2, 3, 4}) = min{C[1, 2]+d(2, {3, 4}+C[1, 3]+d(3, {2, 4})+C[1,4]+d(4, {2, 3})} = min {35,40,43} = 35

Như vậy, đường đi ngắn nhất của người bán hàng có độ dài 35. Đường đi ngắn nhất này có thể xây dựng được bằng cách với mỗi d(i, S) ta lưu lại đỉnh j mà tại đó vế phải của (1) đạt min. Gọi J(i, S) là đỉnh j nàỵ Chẳng hạn, từ các kết quả tính toán trên ta có :

J(1, {2, 3, 4}) = 2 J(2, {3,4}) = 4 J(4, {3}) = 3

Do đó đường đi ngắn nhất là (1, 2, 4, 3, 1).

Chúng ta thử đánh giá thời gian thực hiện thuật toán nàỵ Gọi N là số các d(i, S) cần phải tính. Trước hết có n-1 khả năng chọn i (i chạy từ 1 tới n). với mỗi i số các tập S có k phần tử, S không chứa 1 và i, là . Do đó :

N = = (n-1)2n-2

Mặt khác để tính d(i, S) với S gồm k phần tử, theo công thức (1) ta phải thực hiện k-1 phép so sánh để tìm min. Do đó thuật toán đòi hỏi thời gian n22n. So sánh với phương pháp vét cạn n! đường đi để tìm ra đường đi nhắn nhất, thuật toán này tốt hơn.

Một phần của tài liệu Giáo trình phân tích thiết kế thuật toán (nghề lập trình máy tính) (Trang 144 - 146)

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

(186 trang)