MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ

8 407 0
MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ

Đang tải... (xem toàn văn)

Thông tin tài liệu

Trong đời sống, chúng ta thường gặp những tình huống như sau: để đi từ địa điểm A đến địa điểm B trong thành phố, có nhiều đường đi, nhiều cách đi; có lúc ta chọn đường đi ngắn nhất (theo nghĩa cự ly), có lúc lại cần chọn đường đi nhanh nhất (theo nghĩa thời gian) và có lúc phải cân nhắc để chọn đường đi rẻ tiền nhất (theo nghĩa chi phí), v.v...Có thể coi sơ đồ của đường đi từ A đến B trong thành phố là một đồ thị, với đỉnh là các giao lộ (A và B coi như giao lộ), cạnh là đoạn đường nối hai giao lộ. Trên mỗi cạnh của đồ thị này, ta gán một số dương, ứng với chiều dài của đoạn đường, thời gian đi đoạn đường hoặc cước phí vận chuyển trên đoạn đường đó, ...

MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ 5.1 ĐỒ THỊ CÓ TRỌNG SỐ VÀ BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT 5.1.1 Mở đầu: Trong đời sống, thường gặp tình sau: để từ địa điểm A đến địa điểm B thành phố, có nhiều đường đi, nhiều cách đi; có lúc ta chọn đường ngắn (theo nghĩa cự ly), có lúc lại cần chọn đường nhanh (theo nghĩa thời gian) có lúc phải cân nhắc để chọn đường rẻ tiền (theo nghĩa chi phí), v.v Có thể coi sơ đồ đường từ A đến B thành phố đồ thị, với đỉnh giao lộ (A B coi giao lộ), cạnh đoạn đường nối hai giao lộ Trên cạnh đồ thị này, ta gán số dương, ứng với chiều dài đoạn đường, thời gian đoạn đường cước phí vận chuyển đoạn đường đó, Đồ thị có trọng số đồ thị G=(V,E) mà cạnh (hoặc cung) e∈E gán số thực m(e), gọi trọng số cạnh (hoặc cung) e Trong phần này, trọng số cạnh xét số dương gọi chiều dài cạnh Mỗi đường từ đỉnh u đến đỉnh v, có chiều dài m(u,v), tổng chiều dài cạnh mà qua Khoảng cách d(u,v) hai đỉnh u v chiều dài đường ngắn (theo nghĩa m(u,v) nhỏ nhất) đường từ u đến v Có thể xem đồ thị G đồ thị có trọng số mà cạnh có chiều dài Khi đó, khoảng cách d(u,v) hai đỉnh u v chiều dài đường từ u đến v ngắn nhất, tức đường qua cạnh 5.1.2 Bài toán tìm đường ngắn nhất: Cho đơn đồ thị liên thông, có trọng số G=(V,E) Tìm khoảng cách d(u 0,v) từ đỉnh u0 cho trước đến đỉnh v G tìm đường ngắn từ u0 đến v Có số thuật toán tìm đường ngắn nhất; đây, ta có thuật toán E Dijkstra, nhà toán học người Hà Lan, đề xuất năm 1959 Trong phiên mà ta trình bày, người ta giả sử đồ thị vô hướng, trọng số dương Chỉ cần thay đổi đôi chút giải toán tìm đường ngắn đồ thị có hướng Phương pháp thuật toán Dijkstra là: xác định đỉnh có khoảng cách đến u0 từ nhỏ đến lớn Trước tiên, đỉnh có khoảng cách đến a nhỏ a, với d(u 0,u0)=0 Trong đỉnh v ≠ u0, tìm đỉnh có khoảng cách k đến u0 nhỏ Đỉnh phải đỉnh kề với u0 Giả sử u1 Ta có: d(u0,u1) = k1 Trong đỉnh v ≠ u0 v ≠ u1, tìm đỉnh có khoảng cách k2 đến u0 nhỏ Đỉnh phải đỉnh kề với u0 với u1 Giả sử u2 Ta có: 67 d(u0,u2) = k2 Tiếp tục trên, tìm khoảng cách từ u đến đỉnh v G Nếu V={u0, u1, , un} thì: = d(u0,u0) < d(u0,u1) < d(u0,u2) < < d(u0,un) 5.1.3 Thuật toán Dijkstra: procedure Dijkstra (G=(V,E) đơn đồ thị liên thông, có trọng số với trọng số dương) {G có đỉnh a=u0, u1, , un=z trọng số m(ui,uj), với m(ui,uj) = ∞ (ui,uj) không cạnh G} for i := to n L(ui) := ∞ L(a) := S := V \ {a} u := a while S ≠ ∅ begin for tất đỉnh v thuộc S if L(u) +m(u,v) < L(v) then L(v) := L(u)+m(u,v) u := đỉnh thuộc S có nhãn L(u) nhỏ {L(u): độ dài đường ngắn từ a đến u} S := S \ {u} end Thí dụ 1: Tìm khoảng cách d(a,v) từ a đến đỉnh v tìm đường ngắn từ a đến v cho đồ thị G sau b 1 a n c 2 e 3 d g h m k L(a) L(b) L(c) L(d) L(e) L(g) L(h) L(k) L(m) L(n) ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ − ∞ 68 ∞ ∞ ∞ ∞ − − ∞ ∞ ∞ ∞ − − ∞ ∞ ∞ ∞ − − − ∞ − ∞ ∞ − − − ∞ − ∞ − − − − − 10 − ∞ − − − − − − − − − − − − − − − − − − − − − − − − − − 5.1.4 Định lý: Thuật toán Dijkstra tìm đường ngắn từ đỉnh cho trước đến đỉnh tuỳ ý đơn đồ thị vô hướng liên thông có trọng số Chứng minh: Định lý chứng minh quy nạp Tại bước k ta có giả thiết quy nạp là: (i) Nhãn đỉnh v không thuộc S độ dài đường ngắn từ đỉnh a tới đỉnh này; (ii) Nhãn đỉnh v S độ dài đường ngắn từ đỉnh a tới đỉnh đường chứa đỉnh (ngoài đỉnh này) không thuộc S Khi k=0, tức chưa có bước lặp thực hiện, S=V \ {a}, độ dài đường ngắn từ a tới đỉnh khác a ∞ độ dài đường ngắn từ a tới (ở đây, cho phép đường cạnh) Do bước sở Giả sử giả thiết quy nạp với bước k Gọi v đỉnh lấy khỏi S bước lặp k+1, v đỉnh thuộc S cuối bước k có nhãn nhỏ (nếu có nhiều đỉnh có nhãn nhỏ chọn đỉnh làm v) Từ giả thiết quy nạp ta thấy trước vào vòng lặp thứ k+1, đỉnh không thuộc S gán nhãn độ dài đường ngắn từ a Đỉnh v phải gán nhãn độ dài 69 đường ngắn từ a Nếu điều không xảy cuối bước lặp thứ k có đường với độ dài nhỏ Lk(v) chứa đỉnh thuộc S (vì Lk(v) độ dài đường ngắn từ a tới v chứa đỉnh không thuộc S sau bước lặp thứ k) Gọi u đỉnh đường thuộc S Đó đường với độ dài nhỏ L k(v) từ a tới u chứa đỉnh không thuộc S Điều trái với cách chọn v Do (i) cuối bước lặp k+1 Gọi u đỉnh thuộc S sau bước k+1 Đường ngắn từ a tới u chứa đỉnh không thuộc S chứa v không Nếu không chứa v theo giả thiết quy nạp độ dài Lk(v) Nếu chứa v tạo thành đường từ a tới v với độ dài ngắn chứa đỉnh không thuộc S khác v, kết thúc cạnh từ v tới u Khi độ dài L k(v)+m(v,u) Điều chứng tỏ (ii) Lk+1(u)=min(Lk(u), Lk(v)+m(v,u)) 5.1.5 Mệnh đề: Thuật toán Dijkstra tìm đường ngắn từ đỉnh cho trước đến đỉnh tuỳ ý đơn đồ thị vô hướng liên thông có trọng số có độ phức tạp O(n2) Chứng minh: Thuật toán dùng không n−1 bước lặp Trong bước lặp, dùng không 2(n−1) phép cộng phép so sánh để sửa đổi nhãn đỉnh Ngoài ra, đỉnh thuộc Sk có nhãn nhỏ nhờ không n−1 phép so sánh Do thuật toán có độ phức tạp O(n2) 5.1.6 Thuật toán Floyd: Cho G=(V,E) đồ thị có hướng, có trọng số Để tìm đường ngắn cặp đỉnh G, ta áp dụng thuật toán Dijkstra nhiều lần áp dụng thuật toán Floyd trình bày Giả sử V={v1, v2, , vn} có ma trận trọng số W ≡ W0 Thuật toán Floyd xây dựng dãy ma trận vuông cấp n Wk (0 ≤ k ≤ n) sau: procedure Xác định Wn for i := to n for j := to n W[i,j] := m(vi,vj) {W[i,j] phần tử dòng i cột j ma trận W0} for k := to n if W[i,k] +W[k,j] < W[i,j] then W[i,j] := W[i,k] +W[k,j] {W[i,j] phần tử dòng i cột j ma trận Wk} 5.1.7 Định lý: Thuật toán Floyd cho ta ma trận W*=Wn ma trận khoảng cách nhỏ đồ thị G Chứng minh: Ta chứng minh quy nạp theo k mệnh đề sau: 70 Wk[i,j] chiều dài đường ngắn đường nối đỉnh v i với đỉnh vj qua đỉnh trung gian {v1, v2, , vk} Trước hết mệnh đề hiển nhiên với k=0 Giả sử mệnh đề với k-1 Xét Wk[i,j] Có hai trường hợp: 1) Trong đường chiều dài ngắn nối v i với vj qua đỉnh trung gian {v1, v2, , vk}, có đường γ cho vk ∉ γ Khi γ đường ngắn nối vi với vj qua đỉnh trung gian {v1, v2, , vk-1}, nên theo giả thiết quy nạp, Wk-1[i,j] = chiều dài γ ≤ Wk-1[i,k]+Wk-1[k,j] Do theo định nghĩa Wk Wk[i,j]=Wk-1[i,j] 2) Mọi đường chiều dài ngắn nối v i với vj qua đỉnh trung gian {v1, v2, , vk}, chứa vk Gọi γ = vi vk vj đường ngắn v1 vk vk vj đường ngắn qua đỉnh trung gian {v1, v2, , vk-1} Wk-1[i,k]+Wk-1[k,j] = chiều dài(v1 vk) + chiều dài(vk vj) = chiều dài γ < Wk-1[i,j] Do theo định nghĩa Wk ta có: Wk[i,j] = Wk-1[i,k]+Wk-1[k,j] Thí dụ 2: Xét đồ thị G sau: v1 2 v3 1 v4 v2 v5 v6 Áp dụng thuật toán Floyd, ta tìm (các ô trống ∞)        3   W = W0 =   2        71     W1 =   2       3  , W2 =            2       3   10       W3 =   2    11 14   7 3  , W4 = 11  10         2    10 13      11    9  3  W5 =  7 2  4  12   6 3  , W* = W6 = 10    11 9  3 7  7 2  4  4 7 9 5 12    3  10    Thuật toán Floyd áp dụng cho đồ thị vô hướng đồ thị có hướng Ta cần thay cạnh vô hướng (u,v) cặp cạnh có hướng (u,v) (v,u) với m(u,v)=m(v,u) Tuy nhiên, trường hợp này, phần tử đường chéo ma trận W cần đặt Đồ thị có hướng G liên thông mạnh phần tử nằm đường chéo ma trận trọng số ngắn W* hữu hạn 72 BÀI TẬP Dùng thuật toán Dijkstra tìm đường ngắn từ đỉnh a đến đỉnh khác đồ thị sau: c b d 12 k e h 11 a g Dùng thuật toán Dijkstra tìm đường ngắn từ đỉnh a đến đỉnh khác đồ thị sau: b 10 10 c a g e 5 h d f k i Cho đồ thị có trọng số hình Hãy tìm đường ngắn từ đỉnh A đến đỉnh N A F J B 2 K G C L 73 2 H D I E 3 M N Tìm đường ngắn từ B đến đỉnh khác đồ thị có ma trận trọng số (các ô trống ∞): A B C D E F G A   B 3     C    D  4 E  2   2 4 F    G  4  Tìm W* cách áp dụng thuật toán Floyd vào đồ thị sau: B 20 A 13 F C D E 74

Ngày đăng: 09/04/2016, 00:05

Từ khóa liên quan

Mục lục

  • MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan