Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 44 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
44
Dung lượng
174 KB
Nội dung
CHƯƠNG BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT 1/43 NỘI DUNG Bài toán đường ngắn Đường có trọng số bé Thuật toán Dijsktra Đường đồ thị phi chu trình Đường ngắn cặp đỉnh Tâm đồ thị 2/43 8.1 BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT Bài toán: Cho đồ thị G = (V, E) hai đỉnh a, b Tìm đường ngắn (nếu có) từ đỉnh a đến đỉnh b đồ thị G Ý nghĩa thực tế: Bài toán giúp chọn hành trình tiết kiệm (quãng đường, thời gian, chi phí ) giao thông, lập lịch thi công công trình cách tối ưu, xử lý truyền tin 3/43 8.1 BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT (tiếp) Thuật toán duyệt đồ thị theo chiều rộng cho ta lời giải toán Song ta có thêm thuật toán sau 4/43 TÌM ĐƯỜNG ĐI NGẮN NHẤT 1) Lần lượt gán nhãn cho đỉnh đồ thị, đỉnh không lần, sau: - Đỉnh a gán nhãn số - Những đỉnh kề với đỉnh a gán số - Những đỉnh kề với đỉnh gán nhãn số 1, gán số - Tương tự, đỉnh kề với đỉnh gán số i gán nhãn số i+1 5/43 TÌM ĐƯỜNG ĐI NGẮN NHẤT (tiếp) 2) Thực gán nhãn cho đỉnh b không gán nhãn Nếu đỉnh b gán nhãn k kết luận có đường ngắn từ đỉnh a tới đỉnh b với độ dài k, ngược lại trả lời 6/43 TÌM ĐƯỜNG ĐI NGẮN NHẤT (tiếp) Khôi phục đường Nếu bước b gán nhãn k ta ngược lại theo quy tắc sau đây: Nếu đỉnh y gán nhãn j với j ≥ có đỉnh x gãn nhãn j-1 cho có cạnh từ x tới y Đi ngược lại gặp đỉnh a, ta nhận đường ngắn cần tìm 7/43 BÀI TOÁN SÓI, DÊ VÀ BẮP CẢI Một sói, dê bắp cải bờ sông Người lái đò phải đưa chúng sang sông Nhưng thuyền bé nên chuyến chở “hành khách” Vì lý mà biết, bỏ mặc sói với dê dê với bắp cải mà người trông Vậy người lái đò phải xử trí mà đưa sói, dê bắp cải sang bên sông 8/43 BÀI TOÁN SÓI, DÊ VÀ BẮP CẢI (tiếp) Xây dựng đồ thị vô hướng với đỉnh thể hành khách lại bên phía xuất phát thời điểm khác Cạnh nối hai đỉnh thể chuyến đò qua sông LSDB a SB LSD D LDB S LSB B LD Ø B Hình 8.1 Hành trình qua sông sói, dê bắp cải 9/43 8.2 ĐỒ THỊ CÓ TRỌNG SỐ Định nghĩa 8.1: Đồ thị G gọi đồ thị có trọng số cạnh (i, j) đồ thị gán số nguyên không âm c(i,j) Nhãn c(i,j) cạnh (i, j) đồ thị thường biểu diễn “chi phí” thực tế để qua cạnh Ký hiệu đồ thị có trọng số (G, c) 10/43 8.6 ĐƯỜNG ĐI NGẮN NHẤT GIỮA CÁC CẶP ĐỈNH (tiếp) Bài toán giải cách sử dụng thuật toán Dijkstra với đỉnh đồ thị đỉnh xuất phát Ta giải toán trực tiếp thuật toán Floyd 30/43 8.6 ĐƯỜNG ĐI NGẮN NHẤT GIỮA CÁC CẶP ĐỈNH (tiếp) Sử dụng ma trận Dn x n để tính độ dài đường ngắn tất cặp đỉnh 1) Bắt đầu gán D := C - ma trận trọng số 2) Thực n lần lặp D Sau bước lặp thứ k, D[i,j] chứa độ dài đường ngắn từ đỉnh i đến đỉnh j mà qua đỉnh có số không vượt k: D(k)[i,j] := ( D(k-1)[i,j] , D(k-1)[i,k] + D(k-1)[k,j] ) , với k = 1, 2, , n 31/43 VÍ DỤ 8.4 Xét đồ giao thông sau đây: a b c Hình 8.4 Bản đồ giao thông Kết tính toán: ∞ D1 ∞ 0 ∞ D2 D3 0 32/43 D4 THUẬT TOÁN FLOYD Thuật toán 8.5 (Floyd) Dữ liệu: Ma trận trọng số C đồ thị Kết quả: Ma trận D cho biết khoảng cách tất cặp đỉnh 33/43 THUẬT TOÁN FLOYD (tiếp) BEGIN for i := to n for j := to n begin D[i,j] := C[i,j] ; TRUOC[i,j] := end ; for k := to n for i := to n for j := to n if D[i,k] + D[k,j] < D[i,j] then begin 10 D[i,j] := D[i,k] + D[k,j] ; 11 TRUOC[i,j] := k 12 end 13 END 34/43 THUẬT TOÁN FLOYD (tiếp) Khôi phục đường - Nếu TRUOC[i,j] = đưòng ngắn từ đỉnh i đến đỉnh j cạnh (i, j) - Để in đỉnh trung gian đường ngắn từ đỉnh i đến đỉnh j ta dùng thủ tục đệ quy sau 35/43 THUẬT TOÁN FLOYD (tiếp) procedure Duong_di ( i, j ) ; begin k := TRUOC[i,j] ; if k = then Exit ; Duong_di ( i, k ) ; write( k ) ; Duong_di ( k, j ) end ; 36/43 THUẬT TOÁN FLOYD (tiếp) Chẳng hạn, ma trận TRUOC ví dụ là: 0 0 Để xác định đường ngắn từ đỉnh đến đỉnh ta lấy k = TRUOC[1,2] = Vậy đường ngắn là: < 1, 3, > 37/43 8.7 TÂM CỦA ĐỒ THỊ Giả sử G = (V, E) đồ thị có trọng số không âm cạnh Ký hiệu: d(x,y) khoảng cách đỉnh x đỉnh y đồ thị G Đại lượng d(a) = max { d(x,a)x ∈ V } gọi độ lệch đỉnh a đồ thị G 38/43 8.7 TÂM CỦA ĐỒ THỊ (tiếp) Định nghĩa 8.2 - Bán kính R đồ thị G độ lệch bé đỉnh: R = { d(a) a ∈ V} - Tâm đồ thị G đỉnh a có độ lệch bé nhất: ∀ x ∈ V, d(a) ≤ d(x) 39/43 8.7 TÂM CỦA ĐỒ THỊ (tiếp) - Đường kính đồ thị G khoảng cách dài cặp đỉnh đồ thị: d = max { d(x,y) x, y ∈ V } 40/43 VÍ DỤ 8.5 Cho đồ thị G sau: a c b e Độ lệch ∞ – bán kính d Đỉnh a b c d e Hình 8.5 Đồ thị có trọng số Vậy tâm đồ thị đỉnh d 41/43 8.7 TÂM CỦA ĐỒ THỊ (tiếp) Ý nghĩa tâm đồ thị: Dùng để xác định: - Thủ đô nước - Nút giao thông quan trọng thành phố - Vị trí đặt máy chủ mạng máy tính 42/43 THUẬT TOÁN TÌM TÂM CỦA ĐỒ THỊ Thuật toán 8.5: Dùng thuật toán Floyd để tính ma trận D khoảng cách cặp đỉnh Tìm giá trị lớn cột, cho ta độ lệch đỉnh tương ứng Tìm đỉnh với độ lệch bé nhất, tâm đồ thị 43/43 VÍ DỤ 8.6 Ma trận khoảng cách D ví dụ là: a b c d e ∞ ∞ ∞ ∞ 3 5 7 ∞ Tâm: d Bán kính: Đường kính: ∞ Nếu vẽ vòng tròn có tâm bán kính định nghĩa tất đỉnh đồ thị nằm vòng tròn 44/43 [...]... hoặc tìm đường đi dài nhất trên đồ thị định hướng phi chu trình có trọng số 27/43 VÍ DỤ 8.3 Tìm đường đi dài nhất trên đồ thị định hướng phi chu trình có trọng số dưới đây: 7 8 3 5 1 1 1 4 2 5 9 5 6 7 1 2 2 4 6 5 3 Hình 8.3 Đường đi dài nhất trên đồ thị phi chu trình có trọng số 28/43 8.6 ĐƯỜNG ĐI NGẮN NHẤT GIỮA CÁC CẶP ĐỈNH Bài toán: Cho một đồ thị có trọng số (G, c) Hãy tìm đường đi ngắn nhất giữa...8.3 ĐƯỜNG ĐI CÓ TRỌNG SỐ BÉ NHẤT Độ dài của đường đi trong đồ thị có trọng số bằng tổng các trọng số của các cạnh trên đường đi đó - - Độ dài đường đi có trọng số bé nhất đi từ đỉnh a đến đỉnh b được gọi là khoảng cách từ đỉnh a đến đỉnh b - Nếu không có đường đi từ a đến b thì đặt khoảng cách bằng ∞ 11/43 8.3 ĐƯỜNG ĐI CÓ TRỌNG SỐ BÉ NHẤT (tiếp) Bài toán Cho đồ thị có trọng số... đỉnh Bài toán này thường gặp trong việc xây dựng bảng khoảng cách giữa các thành phố, bảng giá cước vận chuyển giữa các nhà ga 29/43 8.6 ĐƯỜNG ĐI NGẮN NHẤT GIỮA CÁC CẶP ĐỈNH (tiếp) Bài toán này có thể giải quyết bằng cách sử dụng thuật toán Dijkstra với mỗi đỉnh của đồ thị lần lượt là các đỉnh xuất phát Ta có thể giải quyết bài toán trực tiếp bằng thuật toán Floyd 30/43 8.6 ĐƯỜNG ĐI NGẮN NHẤT... c) và hai đỉnh a, b thuộc G Hãy tìm đường đi có trọng số bé nhất (nếu có) đi từ đỉnh a đến đỉnh b 12/43 8.4 THUẬT TOÁN DIJKSTRA Năm 1959 E W Dijkstra đưa ra một thuật toán rất hiệu quả để giải bài toán đường đi ngắn nhất Thuật toán thực hiện việc gán và giảm giá trị của nhãn l(i) tại mỗi đỉnh i của đồ thị G như sau: 13/43 8.4 THUẬT TOÁN DIJKSTRA (tiếp) Thuật toán 8.2 1 Với đỉnh xuất phát a, gán... 8.5 ĐƯỜNG ĐI TRÊN ĐỒ THỊ PHI CHU TRÌNH (tiếp) Tính đúng đắn của thuật toán suy từ chi tiết sau đây: - Tất cả các đỉnh trung gian trên đường đi ngắn nhất từ v1 tới vj có chỉ số nhỏ hơn j - Mỗi cạnh (vi,vj) được xét trong dòng lệnh 5 đúng một lần Độ phức tạp của thuật toán là O(m) 26/43 8.5 ĐƯỜNG ĐI TRÊN ĐỒ THỊ PHI CHU TRÌNH (tiếp) Ta cũng có thể áp dụng thuật toán trên để tìm đường đi dài nhất. .. là độ dài của đường đi ngắn nhất 18/43 VÍ DỤ 8.2 Xét đồ thị có trọng số sau đây: 1 1 0 a 1 2 3 5 5 2 2 1 3 3 1 1 2 1 3 1 5 b 4 Hình 8.2 Đồ thị có trọng số Độ dài đường đi ngắn nhất từ đỉnh a đến đỉnh b là 5 19/43 8.4 THUẬT TOÁN DIJKSTRA (tiếp) Để đơn giản việc tính toán, ta xây dựng ma trận trọng số C : c(i,j) , nếu (i, j) ∈ E, C[i,j] = ∞ 0 , nếu (i, j) ∉ E, , nếu i = j 20/43 8.4 THUẬT TOÁN DIJKSTRA... gán hoặc giảm nhãn được nữa 14/43 8.4 THUẬT TOÁN DIJKSTRA (tiếp) Định lý 8.1: Tại mỗi đỉnh b giá trị nhãn l(b) cuối cùng (nếu có) chính là độ dài của đường đi ngắn nhất từ đỉnh a đến đỉnh b Chứng minh: Sau khi đã thực hiện xong thuật toán trên, nếu nhãn l(b) xác định thì ta có đường đi từ đỉnh a tới đỉnh b 15/43 8.4 THUẬT TOÁN DIJKSTRA (tiếp) Khôi phục đường đi từ a đến b như sau: Xuất phát từ đỉnh b,... begin 10 D[i,j] := D[i,k] + D[k,j] ; 11 TRUOC[i,j] := k 12 end 13 END 34/43 THUẬT TOÁN FLOYD (tiếp) Khôi phục đường đi - Nếu TRUOC[i,j] = 0 thì đưòng đi ngắn nhất từ đỉnh i đến đỉnh j chính là cạnh (i, j) - Để in ra các đỉnh trung gian trên đường đi ngắn nhất từ đỉnh i đến đỉnh j ta dùng thủ tục đệ quy sau đây 35/43 THUẬT TOÁN FLOYD (tiếp) 1 procedure Duong_di ( i, j ) ; 2 begin 3 k := TRUOC[i,j] ; 4... toán Floyd 30/43 8.6 ĐƯỜNG ĐI NGẮN NHẤT GIỮA CÁC CẶP ĐỈNH (tiếp) Sử dụng ma trận Dn x n để tính độ dài đường đi ngắn nhất giữa tất cả các cặp đỉnh 1) Bắt đầu gán D := C - ma trận trọng số 2) Thực hiện n lần lặp trên D Sau bước lặp thứ k, D[i,j] chứa độ dài đường đi ngắn nhất từ đỉnh i đến đỉnh j mà chỉ đi qua các đỉnh có chỉ số không vượt quá k: D(k)[i,j] := min ( D(k-1)[i,j] , D(k-1)[i,k] + D(k-1)[k,j]... := T \ {i} ; 21/43 8.4 THUẬT TOÁN DIJKSTRA (tiếp) 10 for j ∈ T do 11 if L[j] > L[i] + C[i, j] then 12 begin 13 L[j] := L[i] + C[i, j] ; 14 Truoc[j] := i ; 15 end 18 end 19 end ; Biến mảng Truoc dùng để khôi phục đường đi 22/43 8.5 ĐƯỜNG ĐI TRÊN ĐỒ THỊ PHI CHU TRÌNH Sử dụng Thuật toán 4.1 để đánh số các đỉnh trên đồ thị định hướng phi chu trình, ta xây dựng được thuật toán ngắn gọn hơn để tìm khoảng cách ...NỘI DUNG Bài toán đường ngắn Đường có trọng số bé Thuật toán Dijsktra Đường đồ thị phi chu trình Đường ngắn cặp đỉnh Tâm đồ thị 2/43 8.1 BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT Bài toán: Cho... truyền tin 3/43 8.1 BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT (tiếp) Thuật toán duyệt đồ thị theo chiều rộng cho ta lời giải toán Song ta có thêm thuật toán sau 4/43 TÌM ĐƯỜNG ĐI NGẮN NHẤT 1) Lần lượt gán... ĐƯỜNG ĐI NGẮN NHẤT GIỮA CÁC CẶP ĐỈNH (tiếp) Bài toán giải cách sử dụng thuật toán Dijkstra với đỉnh đồ thị đỉnh xuất phát Ta giải toán trực tiếp thuật toán Floyd 30/43 8.6 ĐƯỜNG ĐI NGẮN NHẤT