nhất giữa hai đỉnh làm việc thực sự hiệu quả hơn những thuật toán tìm đđnn từ một đỉnh đến tất cả các đỉnh còn lại.... Tính chất của ĐĐNN, Giảm cận trên.[r]
(1)BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT
(2)Nội dung
5.1 Bài toán đường ngắn (ĐĐNN)
5.1 Bài toán đường ngắn (ĐĐNN)
5.2 Tính chất ĐĐNN, Giảm cận trên 5.3 Thuật toán Bellman-Ford
5.4 Thuật toán Dijkstra
(3)5.1 Bài toán đường ngắn nhất
Cho đơn đồ thị có hướng G = (V,E) với hàm trọng số
w: E R (w(e) gọi độ dài hay trọng số
cạnh e)
Độ dài đường P = v1 v2 … vk số
Đường ngắn nhất từ đỉnh u đến đỉnh v đường có
độ dài ngắn số đường nối u với v.
Độ dài đường ngắn từ u đến v gọi
là khoảng cách từ u tới v ký hiệu (u,v).
1
1
( ) k ( ,i i )
i
w P w v v
(4)Ví dụ
weight
s a b c d e f
Cho đồ thị có trọng số G = (V, E), đỉnh nguồn sV, tìm đường ngắn từ s đến đỉnh lại.
(5)Các ứng dụng thực tế
Giao thông (Transportation)
Truyền tin mạng (Network routing) (cần hướng gói tin đến đích mạng theo đường nào?)
Truyền thông (Telecommunications)
Speech interpretation (best interpretation of a spoken sentence)
Điều khiển robot (Robot path planning) Medical imaging
(6)Các dạng toán ĐĐNN
1. Bài tốn nguồn đích: Cho hai đỉnh s và t, cần tìm đường ngắn từ s đến t.
2. Bài tốn nguồn nhiều đích: Cho s đỉnh nguồn, cần tìm đường ngắn từ s đến tất đỉnh cịn lại.
3. Bài tốn cặp: Tìm đường ngắn giữa cặp đỉnh đồ thị
(7)Nhận xét
Các toán xếp theo thứ tự từ đơn giản
đến phức tạp
Hễ có thuật toán hiệu để giải ba
(8)5.1 Bài toán đường ngắn (ĐĐNN) 5.2 Tính chất ĐĐNN, Giảm cận trên
5.2 Tính chất ĐĐNN, Giảm cận trên
5.3 Thuật toán Bellman-Ford 5.4 Thuật toán Dijkstra
(9)Các tính chất ĐĐNN
Tính chất Đường ngắn ln tìm
số đường đơn
• CM: Bởi việc loại bỏ chu trình độ dài khơng âm khỏi đường không làm tăng độ dài
Tính chất Mọi đường ngắn đồ thị G
đều qua không n-1 cạnh, n số đỉnh.
• Như hệ tính chất 1
u v
C
(10)Các tính chất ĐĐNN
Tính chất 3: Giả sử P = ‹v1, v2, …, vk› đđnn từ v1 đến vk Khi đó, Pij = ‹vi, vi+1, …, vj› đđnn từ vi đến vj, với i j k
Tính chất 3: Giả sử P = ‹v1, v2, …, vk› đđnn từ v1 đến vk Khi đó, Pij = ‹vi, vi+1, …, vj› đđnn từ vi đến vj, với i j k
(Bằng lời: Mọi đoạn đường đường ngắn đường ngắn nhất)
CM Phản chứng Nếu Pij không đđnn từ vi đến vj, tìm
P’ij đường từ vi đến vj thoả mãn w(P’ij) < w(Pij) Khi gọi P’ là đường thu từ P việc thay đoạn Pij P’ij, ta có
w(P’) < w(P) ?!
v1 vk
P’ij
Pij vj
(11)Hệ quả: Giả sử P đđnn từ s tới v, P = s u v
Khi δ(s, v) = δ(s, u) + w(u, v).
Hệ quả: Giả sử P đđnn từ s tới v, P = s u v
Khi δ(s, v) = δ(s, u) + w(u, v).
Các tính chất ĐĐNN
p'
Tính chất 4: Giả sử s V Đối với cạnh (u,v) E, ta có
δ(s, v) δ(s, u) + w(u,v).
Tính chất 4: Giả sử s V Đối với cạnh (u,v) E, ta có
δ(s, v) δ(s, u) + w(u,v).
(12)Đường ngắn xuất phát từ đỉnh
(13)Biểu diễn đường ngắn nhất
d(v) = độ dài đường từ s đến v ngắn nhất biết (cận cho độ dài đường ngắn thực sự)
p(v) = đỉnh trước v đường nói trên
(sẽ sử dụng để truy ngược đường từ s đến v)
Các thuật tốn tìm đường ngắn làm việc với hai mảng:
(14)Giảm cận (Relaxation)
Sử dụng cạnh (u, v) để kiểm tra xem đường đến v tìm có thể làm ngắn nhờ qua u hay không.
s v u p(v) s z v u p(v)
d[v] > d[u] + w(u, v) Relax(u, v)
if d[v] > d[u] + w(u, v)
then d[v] d[u] + w(u, v) p[v] u
Các thuật tốn tìm đđnn khác số lần dùng cạnh trình tự duyệt chúng để thực giảm cận
(15)Nhận xét chung
Việc cài đặt thuật toán thể nhờ thủ tục gán
nhãn:
Mỗi đỉnh v có nhãn gồm thành phần (d[v], p[v]) Nhãn
sẽ biến đổi q trình thực thuật tố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 toán cho phép tìm đđnn
(16)Nội dung
5.1 Bài toán đường ngắn (ĐĐNN) 5.2 Tính chất ĐĐNN, Giảm cận trên
5.3 Thuật toán Bellman-Ford
5.3 Thuật toán Bellman-Ford
5.4 Thuật toán Dijkstra
(17)Thuật toán Ford-Bellman
Richard Bellman
(18)Thuật tốn Ford-Bellman
Thuật 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.
Đầu vào: Đồ thị G=(V,E) với n đỉnh xác định ma
trận trọng số w[u,v], u,v V, đỉnh nguồn s V;
Đầu ra: Với v V
d[v] = (s, v);
(19)Mơ tả thuật tốn
procedure Ford_Bellman;
begin
for v V begin (* khởi tạo *) d[v] := w[s,v] ; p[v]:=s;
end;
d[s]:=0; p[s]:=s;
for k := to n-2 (* n = |V| *) for v V \ {s}
for u V
if d[v] > d[u] + w[u,v] then begin d[v] := d[u] + w[u,v] ; p[v] := u ;
(20)Nhận xét
Tính đắn thuật tốn chứng minh
trên sở nguyên lý tối ưu quy hoạch động
Độ phức tạp tính tốn thuật tốn O(n3)
Có thể chấm dứt vịng lặp theo k phát
trong trình thực hai vòng lặp
(21)(22)Ví dụ: Tìm đường ngắn từ đỉnh s đến tất các đỉnh lại đồ thị
(23)Nội dung
5.1 Bài toán đường ngắn (ĐĐNN) 5.2 Tính chất ĐĐNN, Giảm cận trên 5.3 Thuật tốn Bellman-Ford
5.4 Thuật toán Dijkstra
5.4 Thuật toán Dijkstra
(24)Thuật toán Dijkstra
Trong trường hợp trọng số cung
khơng âm, thuật tốn Dijkstra đề nghị hữu hiệu nhiều so với thuật toán
Ford-Bellman
Thuật toán dựa thủ tục gán nhãn Thoạt đầu
nhãn đỉnh tạm thời Ở bước lặp có nhãn tạm thời trở thành nhãn cố
định Nếu nhãn đỉnh u trở thành cố
định d[u] cho ta độ dài đđnn từ đỉnh s đến u Thuật toán kết thúc nhãn tất các đỉnh trở thành cố định.
(25)Thuật toán Dijkstra
Đầu vào: Đồ thị có hướng G=(V,E) với n đỉnh,
s V đỉnh xuất phát,
w[u,v], u,v V - ma trận trọng số;
Giả thiết: w[u,v] > 0, u, v V.
Đầu ra: Với v V
d[v] = (s, v);
(26)Thuật toán Dijkstra
procedure Dijkstra; begin
for v V begin (* Khởi tạo *) d[v] := w[s,v] ; p[v]:=s; end;
d[s] := 0; S := {s}; (* S – tập đỉnh có nhãn cố định *)
T := V \ {s}; (* T tập đỉnh có nhãn tạm thời *) while T (* Bước lặp *)
begin
Tìm đỉnh u T thoả mãn d[u] = min{ d[z] : z T};
T := T \ {u}; S:= S {u}; (* Cố định nhãn đỉnh u *)
for v T (* Gán nhãn lại cho đỉnh T *)
if d[v] > d[u] + w[u,v] then begin d[v] := d[u] + w[u,v] ; p[v] := u ;
end;
end;
(27)Thuật toán Dijkstra
Chú ý: Nếu cần tìm đường ngắn
từ s đến t chấm dứt thuật toán
đỉnh t trở thành có nhãn cố định
Định lý Thuật tốn Dijkstra tìm đường
đi ngắn từ đỉnh s đến tất đỉnh lại đồ thị sau thời gian O(n2).
(28)Chứng minh tính đắn Thuật toán Dijkstra
Ta CM với v S, d(v) = (s, v).
• Qui nạp theo |S|
• Cơ sở qui nạp: Với |S| = 1, rõ ràng • Chuyển qui nạp:
giả sử thuật toán Dijkstra bổ sung v vào S d(v) độ dài đường từ s đến v
nếu d(v) khơng độ dài đđnn từ s đến v, gọi P* đđnn từ s đến v P* phải sử dụng cạnh khỏi S, chẳng hạn (x, y)
khi d(v)> (s, v) giả thiết
= (s, x) + w(x, y) + (y, v) tính chất
(s, x) + w(x, y) (y, v) không âm = d(x) + w(x, y) giả thiết quy nạp
d(y) theo thuật tốn
vì thuật tốn Dijkstra phải chọn y thay chọn v ?!
(29)Ví dụ
Đỉnh 1 Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6
Khởi
tạo [0, 1] [1, 1]* [, 1] [, 1] [, 1] [, 1] 1 - - [6, 2] [3, 2]* [, 1] [8, 2]
2 - - [4, 4]* - [7, 4] [8, 2]
3 - - - - [6, 3] [5, 3]*
4 - - - - [6, 3]*
-Tìm đường ngắn nhất từ đỉnh đến tất cả đỉnh lại
(30)(31)Bài tập
(32)Cây đường ngắn nhất
Tập cạnh {(p(v), v): vV \ {s} } tạo thành có gốc đỉnh nguồn s gọi đđnn xuất phát từ đỉnh s.
1 1 2 2 1 10 7 5 4 3 1 2 3 4 6 5 2 1 4 3 5 6
• Các cạnh màu đỏ tạo thành đđnn xuất phát từ đỉnh
(33)Nội dung
5.1 Bài toán đường ngắn (ĐĐNN) 5.2 Tính chất ĐĐNN, Giảm cận trên 5.3 Thuật tốn Bellman-Ford
5.4 Thuật toán Dijkstra
5.5 Đường ngắn đồ thị khơng có chu
5.5 Đường ngắn đồ thị khơng có chu
trình
trình
(34)Đường đồ thị khơng có chu trình
(35)Đường đồ thị khơng có chu trình Một trường hợp riêng tốn đường ngắn
giải nhờ thuật toán với độ phức tạp tính tốn O(n2),
đó tốn đồ thị khơng có chu trình (cịn trọng số cung số thực tuỳ ý) Kết sau đây sở để xây dựng thuật tốn nói trên:
Định lý Giả sử G đồ thị khơng có chu trình Khi
(36)Thuật toán đánh số đỉnh
Trước hết nhận thấy rằng: Trong đồ thị khơng có chu trình
cũng tìm đỉnh có bán bậc vào Thực vậy, đỉnh v1 có cung vào từ v2 ta lại chuyển sang xét đỉnh
v2 Nếu có cung từ v3 vào v2, ta lại chuyển sang xét v3, Do
đồ thị khơng có chu trình nên sau số hữu hạn lần chuyển như ta phải đến đỉnh khơng có cung vào
Thuật toán xây dựng dựa ý tưởng đơn giản sau:
(37)Thuật toán đánh số đỉnh
Đầu vào: Đồ thị có hướng G=(V,E) với n đỉnh
khơng chứa chu trình cho danh sách kề Ke(v), v V.
Đầu ra: Với đỉnh v V số NR [v]
(38)Thuật toán đánh số đỉnh procedure Numbering;
begin
for v V Vao[v] := 0;
for u V (* Tính Vao[v] = bán bậc vào v *) for v Ke(u) Vao[v] := Vao[v] + ;
QUEUE := ; for v V
if Vao[v] = then QUEUE v ; num := 0;
while QUEUE do begin
u QUEUE ; num := num + ; NR[u] := num ; for v Ke(u) begin
Vao[v] := Vao[v] - ;
if Vao[v] = then QUEUE v ; end;
(39)Thuật toán đánh số đỉnh
Rõ ràng bước khởi tạo ta phải duyệt qua tất
các cung đồ thị tính bán bậc vào đỉnh, vì ta tốn cỡ O(m) phép tốn, m số cung đồ thị Tiếp theo, lần đánh số đỉnh, để thực việc loại bỏ đỉnh đánh số với cung khỏi nó, lại duyệt qua tất cung Suy để đánh số tất đỉnh đồ thị chúng ta phải duyệt qua tất cung đồ thị một lần
(40)Thuật tốn tìm đđnn đồ thị khơng có chu trình Do có thuật tốn đánh số trên, nên xét đồ thị khơng có chu
trình ta giả thiết đỉnh đánh số cho cung từ đỉnh có số nhỏ đến đỉnh có số lớn Thuật tốn tìm đường ngắn từ đỉnh nguồn v[1] đến tất
cả đỉnh lại đồ thị khơng có chu trình
Đầu vào: Đồ thị G=(V, E), V={ v[1], v[2], , v[n] }. Đối với cung (v[i], v[j]) E, ta có i < j.
Đồ thị cho danh sách kề Ke(v) , v V. Đầu ra: Khoảng cách từ v[1] đến tất đỉnh lại
(41)Thuật tốn tìm đđnn đồ thị khơng có chu trình
procedure Critical_Path; begin
d[v[1]] := 0;
for j:=1 to n d[v[j]] := ; for v[j] Ke[v[1]]
d[v[j]] := w(v[1], v[j]) ; for j:= to n
for v Ke[v[j]]
d[v] := ( d[v], d[v[j]] + w(v[j], v) ) ; end;
Độ phức tạp tính tốn thuật toán O(m), cung đồ thị
(42)Ví dụ
0
r s t u v w
5 –1 –2
6
3
2
Cần tìm đường ngắn từ ss đến tất đỉnh đạt
(43)Ví dụ
0
r s t u v w
5 –1 –2
6
3
(44)Ví dụ
0 2 6
r s t u v w
5 –1 –2
6
3
(45)Ví dụ
0 2 6 6 4
r s t u v w
5 –1 –2
6
3
(46)Ví dụ
0 2 6 5 4
r s t u v w
5 –1 –2
6
3
(47)Ví dụ
0 2 6 5 3
r s t u v w
5 –1 –2
6
3
(48)Ví dụ
0 2 6 5 3
r s t u v w
5 –1 –2
6
3
2
Kết quả: Cây đường ngắn từ s thể
(49)Ứng dụng: PERT
Xây dựng phương pháp giải toán điều khiển việc thực dự án lớn, gọi tắt PERT (Project
Evaluation and Review Technique) hay CDM (Critical path Method)
Việc thi cơng cơng trình lớn chia làm n công
đoạn, đánh số từ đến n Có số cơng đoạn mà việc thực tiến hành sau số cơng
đoạn hồn thành Đối với công đoạn i biết
(50)Ứng dụng: PERT
Các liệu với n = cho bảng sau đây
Công đoạn t[i] Các cơng đoạn phải hồn thành trước nó 1 15 Khơng có
2 30 1
3 80 Khơng có 4 45 2, 3
(51)Ứng dụng: PERT
Bài toán PERT: Giả sử thời điểm bắt đầu tiến hành thi công
cơng trình Hãy tìm tiến độ thi cơng cơng trình (chỉ rõ cơng đoạn phải bắt đầu thưc vào thời điểm nào) cơng trình hồn thành xong thời điểm sớm
Ta xây dựng đồ thị có hướng n đỉnh biểu diễn ràng buộc
về trình tự thực hiệc công việc sau:
Mỗi đỉnh đồ thị tương ứng với công việc
Nếu công việc i phải thực trước công đoạn j
(52)Thuật toán PERT
Thêm vào đồ thị đỉnh n+1 tương ứng với hai kiện đặc
biệt:
đỉnh số tương ứng với cơng đoạn Lễ khởi cơng, phải
thực trước tất công đoạn khác,
đỉnh n+1 tương ứng với công đoạn Cắt băng khánh thành cơng
trình, phải thực sau tất công đoạn,
với t[0] = t[n+1] = (trên thực tế cần nối đỉnh với tất
các đỉnh có bán bậc vào nối tất đỉnh có bán bậc ra với đỉnh n+1)
Gọi đồ thị thu G
Rõ ràng tốn đặt dẫn tốn tìm đường dài từ
(53)Thuật toán PERT
Do đồ thị G không chứa chu trình, nên để giải tốn
đặt áp dụng thuật tốn Critical_Path chỉ cần đổi toán tử thành toán tử max
Kết thúc thuật toán, ta thu d[v] độ dài đường
dài từ đỉnh đến đỉnh v
Khi d[v] cho ta thời điểm sớm bắt đầu
(54)PERT: Ví dụ minh hoạ
Qui tốn PERT tìm đường dài đồ
thị chu trình
(55)Nội dung
5.1 Bài tốn đường ngắn (ĐĐNN) 5.2 Tính chất ĐĐNN, Giảm cận trên 5.3 Thuật toán Bellman-Ford
5.4 Thuật toán Dijkstra
5.5 Đường ngắn đồ thị khơng có chu trình
5.6 Thuật toán Floyd-Warshal
(56)ĐƯỜNG ĐI NGẮN NHẤT GIỮA MỌI CẶP ĐỈNH
(57)Đường ngắn cặp đỉnh
Bài toán Cho đồ thị G = (V, E), với trọng số cạnh e w(e), cặp đỉnh u, v V, tìm đường ngắn
từ u đến v
Đầu ma trận: phần tử dòng u cột v độ dài đường đi ngắn từ u đến v.
Cho phép có trọng số âm
Giả thiết: Đồ thị khơng có chu trình âm
(58)Ví dụ 2 1 5 3 4
2 -5
6 -4
Đầu vào
0 -4 -5
n n ma trận W = (w ) vớiij w =
0 i = j
w (i, j) i j & (i, j) E
lại
(59)Tiếp 2 1 5 3 4
2 -5
6 -4
0 1 -3 -4 -4 -1 -1 -5 -2 8 - -
Đường đi: 1- - - -
4 - 1-
Đầu ra
(60)Thuật toán Floyd-Warshall
d = độ dài đường ngắn từ i đến j sử dụng đỉnh trung gian tập đỉnh { 1, 2, …, m } ij
(m)
i m m m j
(61)Cơng thức đệ qui tính d(h)
i j
d = w ij(0) ij
d = ( d , d + d ) h (h) (h-1) (h-1) (h-1)ij ij ih hj
i j
h
d(h-1)
(62)Thuật toán Floyd-Warshall
Floyd-Warshall(n, W) D(0) W
for k 1 to n do
for i to n do
for j 1 to n do
d (d , d + d ) return D(n)
(k) (k-1) (k-1) (k-1)
Thời gian tính (n3) !
(63)Xây dựng đường ngắn nhất Predecessor matrix P = (p ) : ij(k)
đường ngắn từ i đến j qua đỉnh trung gian {1, 2, …, k}
i, (i, j) E
NIL, (i, j) E
p = ij(k) p d d + d ij ij
(k-1)
ik kj
(k-1) (k-1) (k-1)
p trái lại(k-1)
(k)
i
j k
p ij(0) =
(64)Ví dụ 1 3 4 2
D (0)
P(0) NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL
D (1) 6 P(1) NIL NIL NIL 2 2NIL
(65)Ví dụ (tiếp)
D (2) 64 9
8
P(2) NIL 2 2
NIL NIL NIL NIL NIL 2 NIL
D
6
3
(3)
P(3) NIL NIL NIL 2 3 3
NIL NIL NIL NIL
(4)
D 67 3 6 9
P(4)
NIL 4 NIL
(66)Ví dụ (tiếp)
3
1 2
1 2 2
(67)Bài tập
(68)Bài tập
(69)Chú ý
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)