1. Trang chủ
  2. » Công Nghệ Thông Tin

CHƯƠNG 6: BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT

15 14 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 217,5 KB

Nội dung

Các khái niệm Trong chương này chúng ta chỉ xét đồ thị có hướng G =(V,E), |V|=n, |E|=m với các cung được gán trọng số, nghĩa là, mỗi cung (u,v) ∈ E của nó

CHƯƠNG BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT Các khái niệm Trong chương xét đồ thị có hướng G =(V,E), |V|=n, |E|=m với cung gán trọng số, nghĩa là, cung (u,v)  E đặt tương ứng với số thực a(u,v) gọi trọng số Chúng ta đặt a(u,v) =  , (u,v)  E Nếu dãy v0, v1, , vp đường G, độ dài đường tổng trọng số cung nó: p  a (v i , vi ) i 1 (nếu gán trọng số cho tất cung 1, độ dài đường số cung đường đi.) Đường ngắn từ đỉnh s đến đỉnh t đường có độ dài nhỏ từ s đến t, độ dài ký hiệu d(s,t) d(s,t) gọi khoảng cách từ s đến t Nếu khơng có đường từ s đến t ta đặt d(s,t)=  Nếu biết khoảng cách từ s đến t, đường ngắn từ s đến t, trường hợp trọng số khơng âm, tìm cách dễ dàng Để tìm đường đi, cần để ý cặp đỉnh s, t  V tuỳ ý (s  t) ln tìm đỉnh v cho d(s,t) = d(s,v) + a(v,t) Thực vậy, đỉnh v đỉnh trước đỉnh t đường ngắn từ s đến t Tiếp theo ta lại tìm đỉnh u cho d(s,v) = d(s,u) + a(u,v), Từ ta có thuật tốn sau để tìm đường ngắn từ s đến t biết độ dài void Find_Path() /* Đầu vào: d[v] khoảng cách từ đỉnh s đến đỉnh v  V; t đỉnh đích; a[u,v], u, v  V ma trận trọng số cung Đầu ra: Mảng stack chứa dãy đỉnh xác định đường ngắn từ s đến t */ { stack=  ; stack  t; v=t; while (v != s) { u=đỉnh thoả mãn d[v]=d[u]+a[u,v]; stack  u; v=u; } } Nhận xét: - Độ phức tạp tính tốn thuật tốn O(n 2), để tìm đỉnh u ta phải xét qua tất đỉnh đồ thị - Có thể dùng biến mảng Truoc[v], để ghi nhớ đỉnh trước v đường tìm kiếm (khong dùng mảng stack) Đường ngắn xuất phát từ đỉnh Phần lớn thuật tốn tìm khoảng cách hai đỉnh s t xây dựng sau: Tính cận d[v] khoảng cách từ s đến tất đỉnh v  V Mỗi phát d[u] + a[u,v] < d[v] (1) cận d[v] làm tốt lên với giá trị mới: d[v]= d[u] + a[u,v] Q trình kết thúc khơng làm tốt thêm cận Khi đó, rõ ràng giá trị d[v] cho khoảng cách từ đỉnh s đến đỉnh v Cận d[v] gọi nhãn đỉnh v, việc tính lại cận gọi thủ tục gán nhãn Nhận thấy để tính khoảng cách từ s đến t, đây, ta phải tính khoảng cách từ s đến tất đỉnh lại đồ thị Hiện chưa biết thuật tốn cho phép tìm đường ngắn hai đỉnh làm việc thực hiệu thuật tốn tìm đường ngắn từ đỉnh đến tất đỉnh cịn lại Sơ đồ tính tốn mà ta vừa mơ tả cịn chưa xác định, cịn phải thứ tự đỉnh u v để kiểm tra điều kiện (1) Thứ tự chọn có ảnh hưởng lớn đến hiệu thuật tốn Bây ta mơ tả tht tốn Ford-Bellman tìm đường ngắn từ đỉnh s đến tất đỉnh lại đồ thị Thuật toán làm việc trường hợp trọng số cung tuỳ ý, giả thiết đồ thị khơng có chu trình âm void Ford_Bellman() /* Đầu vào: Đồ thị có hướng G=(V,E) với n đỉnh, s đỉnh xuất phát, a[u,v] ma trận trọng số; Giả thiết: Đồ thị khơng có chu trình âm Đầu ra: Khoảng cách từ đỉnh s đến tất đỉnh lại d[v] Trước[v] ghi nhận đỉnh trước v đường ngắn từ s đến v */ { // Khởi tạo for (v  V) { d[v]=a[s,v]; Truoc[v]=s; } d[s]=0; //cac lenh lap for (k=1;k d[u] +a[u,v]) { d[v]=d[u]+a[u,v]; Truoc[v]=u; } } Tính đắn thuật tốn chứng minh sở nguyên lý tối ưu quy hoạch động Rõ ràng độ phức tạp tính toán thuật toán O(n 3) Lưu ý chấm dứt vịng lặp theo k phát q trình thực hai vịng lặp khơng có biến d[v] bị đổi giá trị Việc xảy k d[u] + a[u,v] then Begin D[v]:=d[u]+a[u,v]; Truoc[v]:=u; End; Trong trường hợp ta thu thuật toán với độ phức tạp O(n,m) Thí dụ xét đồ thị hình Các kết tính tốn theo thuật tốn mơ tả bảng A=       3    -5          Hình Minh họa thuật tốn Ford_Bellman k d[1] Truoc[1] d[2] Truoc[2] d[3] Truoc[3] d[4] Truoc[4] d[5] Truoc[5] 0,1 1,1  ,1  ,1 3,1 0,1 1,1 4,2 4,2 -1,3 0,1 1,1 4,2 3,5 -1,3 0,1 1,1 4,2 3,5 S Bảng kết tính tốn theo thuật toán Ford_Bellman Trong mục xét số trường hợp riêng tốn tìm đường ngắn mà để giải chúng xây dựng thuật tốn hiệu thuật tốn Ford_Bellman Đó trọng số tất cung số không âm đồ thị khơng có chu trình TRƯỜNG HỢP MA TRẬN TRỌNG SỐ KHƠNG ÂM - THUẬT TỐN DIJKSTRA Trong trường hợp trọng số cung không âm thuật toán Dijkstra đề nghị làm việc hữu hiệu nhiều so với thuật tốn trình bày mục trước Thuật toán xây dựng dựa sở gán cho đỉnh nhãn tạm thời Nhãn đỉnh cho biết cận độ dài đường ngắn từ s đến Các nhãn biến đổi theo thủ tục lặp, mà bước lặp có nhãn tạm thời trở thành nhãn cố định Nếu nhãn đỉnh trở thành nhãn cố định cho ta cận mà độ dài đường ngắn từ đỉnh s đến Thuật tốn mơ tả cụ thể sau Procedure Dijstra; (* Đầu vào: Đồ thị có hướng G=(v,E) với n đỉnh, s  V đỉnh xuất phát, a[u,v], u,v  V, ma trận trọng số; Giả thiết: a[u,v]≥0, u,v  V Đầu ra: Khoảng cách từ đỉnh s đến tất đỉnh lại d[v], v  V Truoc[v], v  V, ghi nhận đỉnh trước v đường ngắn từ s đến v *) Begin (* Khởi tạo *) for v  V begin d[v]:=a[s,v]; Truoc[v]:=s; end; d[s]:=0; T:=V\ s ; (* T tập đỉnh cá nhãn tạm thời *) (* Bước lặp *) while T  begin tìm đỉnh u  T thoả mãn d[u]=min d[z]:z  T ; T:=T\ u ; (* Cố định nhãn đỉnh u*) For v T If d[v]>d[u]+a[u,v] then Begin d[v]:=d[u]+a[u,v]; Truoc[v]:=u; End; end; End; Định lý Thuật tốn Dijkstra tìm đường ngắn đồ thị sau thời gian cỡ O(n2) Chứng minh Trước hết ta chứng minh thuật tốn tìm đường ngắn từ đỉnh s đến đỉnh lại đồ thị Giả sử bước lặp nhãn cố định cho ta độ dài đường ngắn từ s đến đỉnh có nhãn cố định, ta chứng minh lần gặp đỉnh u* thu nhãn cố định d(u*) độ dài đường ngẵn từ s đến u* Ký hiệu S1 tập hợp đỉnh có nhãn cố định cịn S tập đỉnh có nhãn tạm thời bước lặp xét Kết thúc bước lặp nhãn tạm thời d(u *) cho ta độ dài đường ngắn từ s đến u* không nằm trọng tập S 1, tức qua đỉnh tập S2 Gọi z  S2 đỉnh đường Do trọng số cung không âm, nên đoạn đường từ z đến u* có độ dài L>0 d(z) < d(u*) – L < d(u*) Bất đẳng thức mâu thuẫn với cách xác định đỉnh u* đỉnh có nhãn tạm thời nhỏ Vậy đường ngắn từ s đến u* phải nằm trọn S 1, thế, d[u*] độ dài Do lần lặp S1 =  s sau lần lặp ta thêm vào đỉnh u* nên giả thiết d(v) cho độ dài đường ngắn từ s đến v với v  S với bước lặp Theo qui nạp suy thuật toán cho ta đường ngắn từ s đến đỉnh đồ thị Bây ta đánh giá số phép toán cần thực theo thuật toán Ơû bước lặp để tìm đỉnh u cần phải thực O(n) phép toán, để gán nhãn lại cần thực số lượng phép toán O(n) thuật toán phải thực n-1 bước lặp, thời gian tính tốn thuận tốn cỡ O(n2) Định lý chứng minh Khi tìm độ dài đường ngắn d[v] đường tìm dựa vào nhãn Truoc[v], v V, theo qui tắc giống xét chương Thí dụ Tìm đường ngắn từ đến đỉnh lại đồ thị hình Hình Minh họa thuật tốn Dijkstra Kết tính tốn theo thuật tốn trình bày theo bảng Qui ước viết hai thành phần nhãn theo thứ tự: d[v] Đỉnh đánh dấu * đỉnh chọn để cố định nhãn bước lặp xét, nhãn khơng biến đổi bước tiếp theo, ta đánh dấu - Bước lặp Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh Đỉnh Khởi tạo 0,1 1,1*  ,1  ,1  ,1  ,1 - - 6,2 3,2*  ,1 8,2 - - 4,4* - 7,4 8,2 - - - 7,4 5,3* - - - 6,6* - Chú ý: Nếu cần tìm đường ngắn từ s đến đỉnh t kết thúc thuật tốn đỉnh t trở thành có nhãn cố định Tương tự mục 2, dễ dàng mô tả thuật toán trường hợp đồ thị cho danh sách kề Để giảm bớt khối lượng tính tốn việc xác định đỉnh u bước lặp, sử dụng thuật tốn Heasort (tương tự chương thể thuật toán Kruskal) Khi thu thuật tốn với độ phức tạp tính tốn O(m log n) ĐƯỜNG ĐI TRONG ĐỒ THỊ KHƠNG CĨ CHU TRÌNH Bây ta xét trường hợp riêng thứ hai tốn đường ngắn nhất, mà để giải xây dựng thuật tốn với độ phức tạp tính tốn O(n 2), đồ thị khơng có chu trình (cịn trọng số cung số thực tuỳ ý) Trước hết ta chứng minh định lý sau Định lý Giả sử G đồ thị khơng có chu trình Khi đỉnh đánh số cho cung đồ thị hướng từ đỉnh có số nhỏ đến đỉnh có số lớn hơn, nghĩa cung có biểu diễn dạng (v[i], v[j]), id[v]) then begin u:=v; minp:=d[v]; end; final[u]:=true; if not final[t] then for v:=1 to n if (not final[v]) and (d[u]+a[u,v]

Ngày đăng: 11/05/2021, 01:48

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w