Bài toán tìm đường đi ngắn nhất

11 5.5K 20
Bài toán tìm đường đi ngắn nhất

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài toán tìm đường đi ngắn nhất

Chương Bài toán tìm đường ngắn CHƯƠNG BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT Những toán tìm đường đồ thị (đặc biệt tìm đường ngắn nhất) kể toán kinh điễn, cổ lý thuyết đồ thị có nhiều ứng dụng 3.1 ĐỊNH NGHĨA Cho G = (X, U) đồ thị có định giá; tương ứng với cung u=(i, j), có chiều dài (hay trọng lượng) l(u) hay lij Bài toán tìm đường ngắn i j tìm đường µ(i, j) từ i đến j cho : l(µ) = ∑ l(u) u ngắn Diễn giải l(µ) : Chi chí vận chuyễn, Chi phí xây dựng, thời gian cần thiết để khắp,… CHÚ Ý Bài toán tìm đường ngắn tương tự với toán tìm đường dài Những thuật toán khác theo tính chất sau : ♦ l(u) ≥ 0, ∀ u ∈ U ♦ l(u) baèng ⇔ l(u) = 1, ∀ u ∈ U.(Bài toán đường ngắn theo số cung) ♦ G chu trình ♦ G l(u) Trương Mỹ Dung 33 Chương Bài toán tìm đường ngắn Và loại toán sau xét : ♦ Tìm đường ngắn từ đỉnh đến đỉnh lại, ♦ Tìm đường ngắn cặp đỉnh 3.2 NGUYÊN LÝ TỐI ƯU Nguyên lý tối ưu phát biểu theo kiện tập đường tập đường ngắn đường ngắn BỔ ĐỀ Xét đồ thị G = (X,U) hàm trọng lượng l : X x X → R, Cho C = « x1, x2,…,xk » đường ngắn từ x1 đến xk với (i, j) cho ≤ i ≤ j ≤ k, Cho Cij = « xi, xi+1,…,xj » đường C từ xi đến xj Khi Cij đường ngắn từ xi đến xj Nguyên lý thuật toán tìm đường ngắn : ♦ Một khoảng cách d(i) tương ứng với đỉnh xi ♦ Ở cuối thuật toán, khoảng cách biểu diễn chiều dài ngắn từ gốc đến đỉnh xét 3.3 CÁC DẠNG CỦA BÀI TOÁN: TỪ MỘT ĐỈNH ĐẾN CÁC ĐỈNH CÒN LẠI Bài toán gọi toán tìm đường ngắn từ gốc Nhiều toán khác dùng thuật toán để giải : ♦ Đường ngắn đến đích ♦ Đường ngắn từ cặp đỉnh cho trước ♦ Đường ngắn cho cặp đỉnh (thuật toán gốc từ đỉnh) Trương Mỹ Dung 34 Chương Bài toán tìm đường ngắn 3.3.1 THUẬT TOÁN DIJKSTRA-MOORE (1959) Giả thiết cạnh (cung) (l(u) ≥ 0) Giả sử G có n đỉnh đánh số thứ tự từ tới n Bài toán đặt tìm đường ngắn từ đỉnh đến đỉnh lại đồ thị Ký hiệu : ♦ n0 = số phần tử chưa chọn; ♦ A = Ma trận kề biểu diễn đồ thị, có trọng lượng, định nghóa sau : A = [ ai,j] = l(i,j) = chieàu dài cạnh cung ứng u=(i,j) ∈ U ∝ u=(i,j) ∉ U 0, i=j ♦ Pr(p) = đỉnh trước đỉnh p theo đường ngắn từ gốc đến đỉnh p ♦ d = khoảng cách ngắn từ gốc đến đỉnh lại đồ thị Qui ước ∞ cho đỉnh đường từ gốc đến ♦ Mark = Tập đỉnh đánh dấu (đã xét rồi), định nghóa sau : Mark[i] = 1, đỉnh xét rồi, 0, ngược lại NGUYÊN LÝ THUẬT TOÁN Khởi tạo : Xuất phát từ ñænh ; n0 = n – : Pr = [1,1,…1] d = a[1,j], j=1 n (Dòng đầu ma trận kề A) Mark = [1,0…0] Ở bước lặp, chọn đỉnh đánh dấu đỉnh có độ dài ngắn đỉnh chưa đánh dấu, nghóa chọn đỉnh k cho : d[k] = Min {d[i] : Mark[i]= } ; Mark[k]=1 Cập nhật lại d[j], Pr[j] với đỉnh j chưa đánh dấu (Mark[j]=0) theo công thức: • d[j] = d[k] + a[k,j] d[j] > d[k] +a[k,j] • Pr[j] = k Nếu tất đỉnh chọn, nghóa n0 = Dừng Nếu không , quay lại THỦ TỤC DIJKSTRA – MOORE ; //Giả sử nhập ma trận chiều dài l theo dạng ma trận kề A //Gán ban đầu cho d, Pr, Mark, n0 For (int j= 1; j≤ n ; j++) { d[j] = a(1,j) ; pr[j]=1 ; Mark[j] = 0;} Mark[1] =1 ; n0 = n-1 ; WHILE (n0 > 0) {d[k] = Min {d[j] : Mark[j]= } ; // Cập nhật lại n0 , d vaø Pr, Mark Mark[k] =1 ; n0 = n0 - ; For (int j= 1; j≤ n ; j++) if (Mark [j] = 0) && (d[k]+ a[k,j] < d[j]) { d[j] = d[k] +a[k,j] ; pr[j]=k} } Độ phức tạp : O(n²) hay O(mlogn) Trương Mỹ Dung 35 Chương Bài toán tìm đường ngắn THÍ DỤ Ma trận kề A : 1 10 A= 6 3 0 ∝ ∝ ∝ 2 10 ∝ ∝ 3 ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ ∝ 1 FIG.3.1 Đồ thị có định hướng, có trọng lượng Gán Ban đầu Cho Mark, d, Pr : Mark = [1, 0, 0, 0, 0, 0] d = [0, 10, 3, ∝, 6, ∝] Pr = [1, 1, 1, 1, 1, 1] Bước Chọn đỉnh s3 Caäp nhaät Mark, d, Pr : Mark = [1, 0, 1, 0, 0, 0] d = [0, 7, 3, ∝, 5, ∝] Pr = [1, 3, 1, 1, 3, 1] Bước Đỉnh thời s3 Chọn đỉnh s5 Cập nhật Mark, d, Pr : Mark = [1, 0, 1, 0, 1, 0] d = [0, 5, 3, ∝, 5, 6] Pr = [1, 5, 1, 1, 3, 5] Bước Đỉnh thời s5 Chọn đỉnh s2 Cập nhật Mark, d, Pr : Mark = [1, 1, 1, 0, 1, 0] d = [0, 5, 3, ∝, 5, 6] Pr = [1, 5, 1, 1, 3, 5] Bước Đỉnh thời s2 Chọn đỉnh s6 Cập nhật Mark, d, Pr : Mark = [1, 1, 1, 0, 1, 1] d = [0, 5, 3, ∝, 5, 6] Pr = [1, 5, 1, 1, 3, 5] Thuật toán kết thúc đỉnh s4, ta có d[s4] = Min {d[j] : Mark[j]= 0}= d[s4] = ∝ Từ thuật toán , ta có kết sau : d = [0, 5, 3, ∝, 5, 6] Pr = [1, 5, 1, 1, 3, 5] Đường ngắn từ s1 đến s2 : s1 → s3 → s5 → s2 độ dài Đường ngắn từ s1 đến s3 : s1 → s3 độ dài độ dài Đường ngắn từ s1 đến s5 : s1 → s3 → s5 độ dài Đường ngắn từ s1 đến s6 : s1 → s5 → s6 Không có đường ngắn từ đỉnh s1 đến s4 (d[s4] = ∝) , đường nối từ s1 đến s4 Trương Mỹ Dung 36 Chương Bài toán tìm đường ngắn GHI CHÚ Giả thiết « Hàm trọng lượng không âm » bắt buộc Chẳng hạn, sử dụng thuật toán Dijktra-Moore cho đồ thị hình FIG.3.2, dẫn đến kết sai ta chọn gốc đỉnh s1 Thật vậy, đầu tiên, ta chọn đỉnh s2, (s1 → s2) đó, đường ngắn đường từ đỉnh s1 đến s2 qua s3 3 FIG -5 2 3.2 Đồ thị có định hướng, có trọng lượng Trương Mỹ Dung 37 Chương Bài toán tìm đường ngắn 3.3.2 THUẬT TOÁN BELLMAN-FORD (1958-1962) Sự diện dấu trọng lượng (hay chiều dài ) cho phép, chẳng hạn, cải tiến chi phí hay lợi nhuận Thuật toán DIJKSTRA-MOORE không cho phép xét tới cạnh (cung) có trọng lượng không âm, trường hợp cạnh đánh dấu, ta thay đổi cho bước lặp Thuật toán DIJKSTRA-MOORE gọi gán nhãn cố định Để giải cho trường hợp đồ thị có trọng lượng bất kỳ, ta xét thuật toán cho phép đánh dấu xác định hoàn toàn thuật toán kết thúc Một kiểu thuật toán gọi điều chỉnh nhãn Thuật toán BELLMAN-FORD có giá trị cho đồ thị chu trình, có trọng lượng Ký hiệu : ♦ ♦ ♦ ♦ Tập đỉnh đánh số thứ tự từ n Pr(p) = đỉnh trước đỉnh p theo đường ngắn từ gốc đến đỉnh p d = khoảng cách ngắn từ gốc đến đỉnh lại đồ thị Mark = Tập đỉnh đánh dấu (đã xét rồi), định nghóa sau : Mark[i] = 1, đỉnh xét rồi, 0, ngược lại Khoảng cách ngắn từ gốc đến đỉnh v tính tất phần tử trước v (Γ -(v)) đánh dấu Một đỉnh bất kỳ, chưa đánh dấu, khoảng cách từ gốc đến đỉnh chưa biết (chưa tính) NGUYÊN LÝ THUẬT TOÁN Gán giá trị ban đầu Chọn đỉnh s1 làm goác Mark = [1,0…0] ; d[1] = ; Pr[1] = Ở bước lặp : Chọn đỉnh k chưa đánh dấu cho tất đỉnh trước k đánh dấu , nghóa : Mark[k] = vaø ∀ j ∈ Γ -(k) : Mark[j]= Cập nhật Mark : Mark[k] =1 ; Tính d[k] = { d[i] + a[i, k]: i ∈ Γ - (k)}, Pr[k] số đạt ĐỘ PHỨC TẠP : O(nm) O(n3) Cho đồ thị dầy, i.e., đồ thị mà m ≈ n² Trương Mỹ Dung 38 Chương Bài toán tìm đường ngắn THÍ DỤ -2 Gán ban đầu : Mark, d, Pr : Mark = [1, 0, 0, 0, 0, 0}, d[1] = ; Pr [1] = Γ - (2) ={1,3};Γ- (3)={1};Γ- (4)={2,3,6} Γ - (5) ={3} ; Γ- (6) ={2,5} -5 -2 -1 FIG.3.1 Đồ thị có định hướng, có trọng lượng bất kỳ, chu trình, gốc đỉnh Bước Chọn đỉnh Γ- (3)={1} Cập nhật Mark[3], Tính d[3] Pr[3] : Mark[3] = ; d[3] = -2 ; Pr[3] = 1; Bước Ở bước lặp này, ta chọn đỉnh (hay đỉnh 2) Cập nhật Mark[5], Tính d[5] Pr[5] : Mark[5] = ; d[5] = ; Pr[5] = 3; Bước Chọn đỉnh Cập nhật Mark[2], Tính d[2] Pr[2] : Mark[2] = ; d[2] = -1 ; Pr[2] = 3; Bước Chọn đỉnh Cập nhật Mark[6], Tính d[6] Pr[6] : Mark[6] = ; d[6] = 1; Pr[6] = Bước Chọn đỉnh Cập nhật Mark[4], Tính d[4] Pr[4] : Mark[4] = ; d[4] = - ; Pr[4] = Thuật toán kết thúc tất đỉnh chọn Từ thuật toán , ta có kết sau : d = [0, -1, -2, -4, 2, 1] Pr = [1, 3, 1, 6, 3, 5] Đường ngắn từ s1 đến s2 : s1 → s3 → s2 Đường ngắn từ s1 đến s3 : s1 → s3 Đường ngắn từ s1 đến s4 : s1 → s3 → s5 → s6 → s4 Đường ngắn từ s1 đến s5 : s1 → s3 → s5 Đường ngắn từ s1 đến s6 : s1 →s3 → s5 → s6 Trương Mỹ Dung 39 độ dài độ dài độ dài độ dài độ dài là là -1 -2 -4 Chương Bài toán tìm đường ngắn 3.4 GIỮA TẤT CẢ CÁC CẶP ĐỈNH: THUẬT TOÁN FLOYD (1962) Ta tính ma trận khoảng cách n x n Nếu tất chiều dài không âm (l(u) ≥ 0) ta áp dụng n lần thuật toán Dijktra-Moore cho đỉnh i Nếu đồ thị có chứa chiều dài âm (l(u) < 0) ta áp dụng n lần thuật toán Bellman-Ford cho mỗiđỉnh i Thuật toán Floyd có cách tiếp cận khác có lợi cho trường hợp ma trận dầy Ký hiệu : A : ma trận trọng lượng, gán giá trị ban đầu sau : i = j A[i,j] = l(i, j) neáu (i, j) ∈ U ∞ ngïc lại P : ma trận đỉnh trước, gán giá trị ban đầu sau : P[i,j] = i, P[i,j] đỉnh trước đỉnh j đường từ gốc i đến j Khi kết thúc thuật toán, ta có : P[i,j] = đỉnh trước j đường ngắn từ gốc i đến đỉnh j, với chiều dài tương ứng A[i,j] THỦ TỤC FLOYD(L, P) For (k =1; k≤ n ; k++) For (i =1 ;i≤ n ; i++) For (j =1 ;j≤ n ; j++) If (a[i,k] + a[k,j] < a[i,j]) { a[i,j] := a[i,k] + a[k,j] ; p[i,j] :=p[k,j] ;} Độ phức tạp : O(n3) Trương Mỹ Dung 40 Chương Bài toán tìm đường ngắn THÍ DỤ 2 -1 -2 -4 5 Gán ban đầu : cho ma traän A, P ∝ ∝ -2 A0 = ∝ -4 -1 ∝ Các bước lặp : k =1 ∝ ∝ -2 A1 = ∝ -4 -2 ∝ k=2 2 ∝ -2 A2 = ∝ -4 -2 -4 k =3 2 ∝ -2 A3 = ∝ -4 -2 -4 k=4 A4 = -1 -2 3 -4 -2 -4 Trương Myõ Dung ∝ ∝ ∝ 5 5 41 P0 = 1 2 3 4 P1 = 1 2 3 4 P2 = 1 2 3 2 4 P3 = 1 0 2 3 2 3 P4 = 1 4 2 1 2 3 Chương Bài toán tìm đường ngắn Cách nhận biết đường ngắn Để nhận đường ngắn từ s1 đến sj , ta sử dụng dòng thứ i ma trận P Chẳng hạn, ta muốn nhận đường ngắn µ : s4 → s3, ta tham khảo ma trận P sau : P[4,3]=2 :s2 đỉnh trước s3 ; P[4,2]=1 : s1 đỉnh trước s2 ; P[4,1]=4 :s4 đỉnh trước s1 Cuối cùng, kết µ = s4 → s1 → s2→ s3 Moät ứng dụng Thuật toán FLOYD tìm đường giũa hai đỉnh Thuật toán WARSHALL phát triễn năm (1962), thuật toán thường mang tên FLOYD-WARSHALL » Ký hiệu : A = ma trận kề đồ thị, gán giá trị ban đầu sau : l neáu (i, j) ∈ U A[i,j] = ngïc lại P = ma trận đỉnh trước, gán giá trị ban đầu sau : a[i,j] = 0, P[i,j] = ngïc lại Khi kết thúc thuật toán : P[i,j] = đỉnh trước j đường từ đỉnh i đến đỉnh j (nghóa a[i,j]=1) THỦ TỤC FLOYD-WARSHAL(A, P) For (k =1 ;k≤ n ; k++) For (i =1 ;i≤ n ; i++) For (j =1 ;j≤ n ; j++) If (a[i,j] = = 0) { a[i,j] = a[i,k] *a[k,j] ; p[i,j] =p[k,j] } Độ phức tạp : O(n3) Trương Mỹ Dung 42 Chương Bài toán tìm đường ngắn THÍ DỤ Gán ban đầu : cho ma trận A, P A0 = 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 P0 = 0 4 0 P1 = 0 4 0 P2 = 0 4 2 2 P3 = 0 3 2 2 3 P4 = 4 4 3 2 2 3 Các bước lặp : k =1 A1 = k=2 A2 = k =3 A3 = k=4 A4 Trương Mỹ Dung = 43 ... BÀI TOÁN: TỪ MỘT ĐỈNH ĐẾN CÁC ĐỈNH CÒN LẠI Bài toán gọi toán tìm đường ngắn từ gốc Nhiều toán khác dùng thuật toán để giải : ♦ Đường ngắn đến đích ♦ Đường ngắn từ cặp đỉnh cho trước ♦ Đường ngắn. .. Bài toán tìm đường ngắn Và loại toán sau xét : ♦ Tìm đường ngắn từ đỉnh đến đỉnh lại, ♦ Tìm đường ngắn cặp đỉnh 3.2 NGUYÊN LÝ TỐI ƯU Nguyên lý tối ưu phát biểu theo kiện tập đường tập đường ngắn. .. P4 = 1 4 2 1 2 3 Chương Bài toán tìm đường ngắn Cách nhận biết đường ngắn Để nhận đường ngắn từ s1 đến sj , ta sử dụng dòng thứ i ma trận P Chẳng hạn, ta muốn nhận đường ngắn µ : s4 → s3, ta tham

Ngày đăng: 22/08/2012, 11:31

Từ khóa liên quan

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

Tài liệu liên quan