Microsoft PowerPoint Chương 9 Pa Compatibility Mode LOGO CHƯƠNG 9 BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT 9 1 Các khái niệm mở đầu Cho đơn đồ thị có hướng G = (V,E) với hàm trọng số w E R (w(e) được gọi là độ dài hay trọng số của cạnh e) Độ dài của đường đi P = v1 v2 vk là số Đường đi ngắn nhất từ đỉnh u đến đỉnh v là đường đi có độ dài ngắn nhất trong số các đường đi nối u với v Độ dài của đường đi ngắn nhất từ u đến v còn được gọi là khoảng cách từ u tới v v.
Trang 1CHƯƠNG 9
BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT
Trang 29.1 Các khái niệm mở đầu
Cho đơn đồ thị có hướng G = (V,E) với hàm trọng số w: E R (w(e) được gọi là độ dài hay trọng số của cạnh e)
Độ dài của đường đi P = v1 v2 … vk là số
đường đi có độ dài ngắn nhất trong số các đường
đi nối u với v.
Độ dài của đường đi ngắn nhất từ u đến v còn được gọi là khoảng cách từ u tới v và ký hiệu là
(u,v)
1
1 1
Trang 3Ví dụ
Đường đi s s,a s,a,b s,a,b,c s,a,d s,a,b,e s,a,b,e,f
s a b c d e f
Cho đồ thị có trọng số G = (V, E), và đỉnh nguồn
sV, hãy tìm đường đi ngắn nhất từ s đến mỗi đỉnh
còn lại
as
f
dc
3
3
51
đỉnh nguồn
Trang 49.2 Đường đi ngắn nhất xuất phát
từ một đỉnh
Tính chất 1 Đường đi ngắn nhất luôn có thể tìm trong số các đường đi đơn
Tính chất 2 Mọi đường đi ngắn nhất
trong đồ thị G đều đi qua không quá n-1cạnh, trong đó n là số đỉnh
Trang 59.2 Đường đi ngắn nhất xuất phát
từ một đỉnh
Tính chất 3: Giả sử P = ‹v1, v2, …, vk› làđường đi ngắn nhất từ v1 đến vk
Khi đó, Pij = ‹vi, vi+1, …, vj› là ĐĐNN từ viđến vj, với 1 i j k
(Bằng lời: Mọi đoạn đường con của đường đi ngắn nhất đều là đường đi ngắn nhất)
P’ij
Pij vj
vi
Trang 69.2 Đường đi ngắn nhất xuất phát
Trang 7Biểu diễn đường đi ngắn nhất
d(v) = độ dài đường đi từ s đến v ngắn nhất hiện biết
(cận trên cho độ dài đường đi ngắn nhất thực sự).
p(v) = đỉnh đi trước v trong đường đi nói trên
(sẽ sử dụng để truy ngược đường đi từ s đến v)
Các thuật toán tìm đường đi ngắn nhất làm việc với hai mảng:
Khởi tạo (Initialization)
for v V(G)
do d[v] p[v] NIL d[s] 0
Trang 8Giảm cận trên (Relaxation)
Sử dụng cạnh (u, v) để kiểm tra xem đường đi đến
v đã tìm được có thể làm ngắn hơn nhờ đi qua uhay không
Trang 9Nhận xét chung
Việc cài đặt các thuật toán được thể hiện nhờ thủ tục gán nhãn:
Mỗi đỉnh v sẽ có nhãn gồm 2 thành phần (d[v], p[v]) Nhãn sẽ biến đổi trong quá trình thực hiện thuật toán
Trang 109.3 Thuật toán Dijkstra
Bài toán
Cho G = (V, E) đơn, liên thông, có trọng
số dương (w(uv) > 0 với mọi u khác v).Tìm đường đi ngắn nhất từ u0 đến v và tínhkhoảng cách d(u0,v)
Trang 119.3 Thuật toán Dijkstra
Phương pháp
Xác định tuần tự các đỉnh có khoảng cáchđến u0 từ nhỏ đến lớn
đến u0 là u0
đỉnh kề với u0) giả sử đó là u1
Trang 129.3 Thuật toán Dijkstra
3 Trong V\{u0,u1} tìm đỉnh có khoảng cách
đến u0 nhỏ nhất(đỉnh này phải là mộttrong các đỉnh kề với u0 hoặc u1) giả sử đó
là u2
4 Tiếp tục như trên cho đến bao giờ tìm
được khoảng cách từ u0 đến mọi đỉnh
Nếu G có n đỉnh thì:
0=d(u0,u0)<d(u0,u1) d(u0,u2) … d(u0,un-1)
Trang 13Bước1 i:=0, S:=V\{u0}, L(u0):=0, d(v):= với mọi v
S và đánh dấu đỉnh v bởi(,-).
Nếu n=1 thì xuất d(u0,u0)=0=L(u0)
Bước2 Với mọi vS và kề với ui (nếu đồ thị có hướng thì v là đỉnh sau của ui),
9.4 Cài đặt Thuật toán Dijkstra
Trang 14Bài toán đường đi ngắn nhất
Bài tập 1 Tìm đường đi ngắn nhất từ u0 đến các đỉnh còn lại
1
2
1 4
u
x
w z
y
t
Trang 152
1 4
u
r
x
w z
y
t
Trang 162
1 4
u
r
x
w z
y
t
Trang 171
3
5 3
1
2
1 4
u
r
x
w z
y
t
Trang 181 2
4 u
r
x
w z
y
t
Trang 19Bài toán đường đi ngắn nhất
Cây đường đi
Trang 20Bài toán đường đi ngắn nhất
Trang 21Bài toán đường đi ngắn nhất
Trang 22Đường đi trong đồ thị không có chu trình
Định lý Giả sử G là đồ thị không có chutrình Khi đó các đỉnh của nó có thể đánh
số sao cho mỗi cung của đồ thị chỉ hướng
Trang 23Thuật toán đánh số đỉnh
Thuật toán được xây dựng dựa trên ý tưởng sau:
Ban đầu: tìm các đỉnh có bán bậc vào bằng 0.
Tiếp theo: loại bỏ khỏi đồ thị những đỉnh đã được đánh số cùng các cung đi ra khỏi chúng, ta thu được
đồ thị mới cũng không có chu trình, và thủ tục được lặp lại với đồ thị mới này.
Quá trình đó sẽ được tiếp tục cho đến khi tất cả các đỉnh của đồ thị được đánh số.
Trang 24Thuậ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 được cho bởidanh sách kề Ke(v), vV
Đầu ra: Với mỗi đỉnh vV chỉ số NR[v]thoả mãn: Với mọi cung (u,v) của đồ thị
ta đều có NR[u]<NR[v]
Trang 25Thuật toán đánh số đỉnh
procedure Numbering;
begin
for v V do Vao[v] := 0;
for u V do (* TÝnh Vao[v] = b¸n bËc vµo cña v *)
for v Ke(u) do Vao[v] := Vao[v] + 1 ;
Trang 26Thuật toán tìm đđnn trên đồ thị không có
Đối với mỗi cung (v[i], v[j]) E, ta có i < j.
Đồ thị được cho bởi danh sách kề Ke(v), v V.
Đầu ra: Khoảng cách từ v[1] đến tất cả các đỉnh còn lại được ghi trong mảng d[v[i]], i = 2, 3, , n
Trang 27Thuật toán tìm đđnn trên đồ thị không có
for v Ke[v[j]] do
d[v] := min ( d[v], d[v[j]] + w(v[j], v) ) ;
end;
§é phøc t¹p tÝnh to¸n cña thuËt to¸n lµ O(m), do mçi
Trang 28Cần tìm đường đi ngắn nhất từ s đến tất cả các đỉnh đạt đến được từ nó
Trang 35Ứng dụng: PERT
khiển việc thực hiện những dự án lớn, gọi tắt là PERT (Project Evaluation and Review
Method).
ra làm n công đoạn, đánh số từ 1 đến n Có một số công đoạn mà việc thực hiện nó chỉ được tiến hành sau khi một số công đoạn nào đó đã hoàn thành Đối với mỗi công đoạn i biết t[i] là thời gian cần thiết để hoàn thành nó (i = 1, 2, , n).
Trang 36Ứng dụng: PERT
Các dữ liệu với n = 8 được cho trong bảng sau
Công đoạn t[i] Các công đoạn phải
Trang 37Ứ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 là 0 Hãy tìm tiến độ thi công công trình (chỉ rõ mỗi công đoạn phải được bắt đầu thưc hiện vào thời điểm nào) để cho công trình được hoàn thành xong trong thời điểm sớm nhất có thể được.
Ta có thể 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ác công việc như sau:
Mỗi đỉnh của đồ thị tương ứng với một công việc Nếu công việc i phải được thực hiện trước công đoạn j thì trên đồ thị có cung (i,j), trọng
số trên cung này được gán bằng t[i]
Trang 38Thuật toán PERT
Thêm vào đồ thị 2 đỉnh 0 và n+1 tương ứng với hai sự kiện đặc biệt:
đỉnh số 0 tương ứng với công đoạn Lễ khởi công, nó phải được thực hiện trước tất cả các công đoạn khác,
và
đỉnh n+1 tương ứng với công đoạn Cắt băng khánh thành công trình, nó phải thực hiện sau tất cả các
công đoạn,
với t[0] = t[n+1] = 0 (trên thực tế chỉ cần nối đỉnh 0
với tất cả các đỉnh có bán bậc vào bằng 0 và nối tất
cả các đỉnh có bán bậc ra bằng 0 với đỉnh n+1)
Gọi đồ thị thu được là G
Trang 39Thuật toán PERT
Do đồ thị G không chứa chu trình, nên để giải bài toán đặt ra có thể áp dụng thuật toán Critical_Path trong đó chỉ cần đổi toán tử min thành toán tử max.
Kết thúc thuật toán, ta thu được d[v] là độ dài đường đi dài nhất từ đỉnh 0 đến đỉnh v.
Khi đó d[v] cho ta thời điểm sớm nhất có thể bắt đầu thực hiện công đoạn v, nói riêng d[n+1] là thời điểm sớm nhất có thể cắt băng khánh thành, tức là thời điểm sớm nhất có thể hoàn thành toàn bộ công trình.
Trang 40PERT: Ví dụ minh hoạ
Qui bài toán PERT về tìm đường đi dàinhất trên đồ thị không có chu trình
Trang 41PERT: Ví dụ minh hoạ
Trang 44Bài toán đường đi ngắn nhất
Bài tập3(ĐHKHTN2005)
Cho một ví dụ chứng tỏ rằng thuậttoán Dijkstra để tìm đường đi ngắn nhất
từ một đỉnh đến các đỉnh khác không ápdụng được cho đồ thị có trọng lượng nếu
có cạnh có trọng lượng âm
Trang 45Bài toán đường đi ngắn nhất
Trang 46Bài toán đường đi ngắn nhất
Tìm đường đi ngắn nhất từ u0 đến các đỉnhhoặc chỉ ra đồ thị có mạch âm
Bước 1 L0(u0) =0 và L0(v) = vu0. Đánhdấu đỉnh v bằng ( ,-) ; k=1
Bước 2 Lk(u0) = 0 và
Lk(v) =min{Lk-1(u)+w(uv)/u là đỉnhtrước của v}
Nếu Lk(v)=Lk-1(y)+w(yv)thì đánh dấu đỉnh
v bởi (Lk(v),y)
Thuật toán Ford – Bellman
Trang 47Bài toán đường đi ngắn nhất
Bước 3 Nếu Lk(v) =Lk-1(v) với mọi v,tức Lk(v) ổn định thì dừng Ngược lạiđến bước 4
Bước 4 Nếu k = n thì dừng G có mạch
âm Nếu
k n-1 thì trở về bước 2 với k:=k+1
Trang 48Bài toán đường đi ngắn nhất
Trang 49Bài toán đường đi ngắn nhất
Trang 56Bài toán đường đi ngắn nhất
k = n = 6 Lk(i) chưa ổn định nên đồ thị
có mạch âm Chẳng hạn:
4→2→6→4 có độ dài -3
Trang 57Bài toán đường đi ngắn nhất
Trang 58Áp dụng thuật toán Dijkstra