Bài giảng Toán rời rạc 2 - Chương 6: Bài toán tìm đường đi ngắn nhất - Ngô Xuân Bách

Học viện Công nghệ Bưu chính Viễn thông  
Khoa Công nghệ thông tin 1  
Toán ri rc 2  
Bài toán tìm đường đi ngn nht  
Ngô Xuân Bách  
Ni dung  
Phát biểu bài toán tìm đường đi ngắn nhất  
Thuật toán Dijkstra  
Thuật toán Bellman-Ford  
Thuật toán Floyd  
2
Bài toán tìm đường đi ngn nht (1/2)  
Khái niệm độ dài đường đi trên đồ thị  
o Xét đồ thị  =< 푉,  > với tập đỉnh  tập cạnh  
o Với mỗi cạnh (푢, 푣)  , ta đặt tương ứng một số thực 푎(푢, )  
được gọi là trọng số của cạnh, 푎(푢, 푣) =  nếu (푢, 푣)    
 
o Nếu dãy 0, 1, . . . ,  là một đường đi trên  thì =1 푎(푣푖−1, )  
được gọi độ dài của đường đi  
Bài toán dạng tổng quát  
o Tìm đường đi (có độ dài) ngắn nhất từ một đỉnh xuất phát     
(đỉnh nguồn) đến đỉnh cuối    (đỉnh đích)?  
o Đường đi như vậy được gọi là đường đi ngắn nhất từ  đến , độ  
dài của đường đi 푑(푠, 푡) được gọi là khoảng cách ngắn nhất từ  
đến  
o Nếu không tồn tại đường đi từ  đến  thì độ dài đường đi  
푑(푠, 푡) =   
3
Bài toán tìm đường đi ngn nht (2/2)  
Trường hợp 1:  cố định,  thay đổi  
o Tìm đường đi ngắn nhất từ  đến tất cả các đỉnh còn lại trên đồ  
thị ?  
o Đối với đồ thị có trọng số không âm, bài toán luôn có lời giải bằng  
thuật toán Dijkstra  
o Đối với đồ thị có trọng số âm nhưng không tồn tại chu trình âm,  
bài toán có lời giải bằng thuật toán Bellman-Ford  
o Trong trường hợp đồ thị có chu trình âm, bài toán không có lời  
giải  
Trường hợp 2:  thay đổi và  cũng thay đổi  
o Tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh của đồ thị  
o Đối với đồ thị có trọng số không âm, bài toán được giải quyết  
bằng cách thực hiện lặp lại  lần thuật toán Dijkstra  
o Đối với đồ thị không có chu trình âm, bài toán có thể giải quyết  
bằng thuật toán Floyd  
4
Ni dung  
Phát biểu bài toán tìm đường đi ngắn nhất  
Thuật toán Dijkstra  
Thuật toán Bellman-Ford  
Thuật toán Floyd  
5
Thut toán Dijkstra (1/2)  
Mục đích  
o Sử dụng để tìm đường đi ngắn nhất từ một đỉnh  tới các đỉnh còn  
lại của đồ thị  
o Áp dụng cho đồ thị hướng với trọng số không âm  
Tư tưởng  
o Gán nhãn tạm thời cho các đỉnh  
. Nhãn của mỗi đỉnh cho biết cận trên của độ dài đường đi ngắn nhất tới  
đỉnh đó  
o Các nhãn này sẽ được biến đổi (tính lại) nhờ một thủ tục lặp  
. Ở mỗi một bước lặp sẽ một nhãn tạm thời trở thành nhãn cố định  
(nhãn đó chính là độ dài đường đi ngắn nhất từ  đến đỉnh đó)  
6
Thut toán Dijkstra (2/2)  
Dijkstra (){  
Bước 1 (Khi to):  
,푠- = 0; //Gán nhãn của đỉnh  là 0  
 = 푉\*푠+; //  là tập đỉnh có nhãn tạm thời  
for (  ){ //Sử dụng  gán nhãn cho các đỉnh còn lại  
,푣- = 푎(푠, );  
푡푟푢표,푣- = ;  
}
Bước 2 (Lp):  
while (   ){  
Tìm đỉnh    sao cho ,푢- = min* ,푧- |   푇+;  
 = 푇\*푢+; //cố định nhãn đỉnh  
for (  ){ //Sử dụng , gán nhãn laị cho các đỉnh  
if (,푣- > ,푢- + 푎(푢, )){  
,푣- = ,푢- + 푎(푢, ); //Gán lại nhãn cho đỉnh ;  
푡푟푢표,푣- = ;  
}
}
}
7
}
Ví d- Dijkstra (1/2)  
Áp dng thut  
toán Dijkstra  
tìm đường đi  
ngn nht từ  
đnh s1 ti  
các đnh còn li  
ca đth.  
7
2
3
6
1
5
1
1
1
2
4
5
1
4
2
3
8
Ví d- Dijkstra (2/2)  
Áp dng thut  
toán Dijkstra  
tìm đường đi  
ngn nht từ  
đnh s1 ti  
các đnh còn li  
ca đth.  
7
2
3
6
1
5
1
1
1
2
4
,푢-  
푡푟푢표,푢-  
5
1
4
2
3
Bước lp Đnh 1 Đnh 2 Đnh 3 Đnh 4 Đnh 5 Đnh 6  
Khi to  
0, 1  
1, 1 *  
∞, 1  
6, 2  
4, 4 *  
-
∞, 1  
∞, 1  
∞, 1  
7, 4  
∞, 1  
8, 2  
8, 2  
5, 3 *  
-
1
2
3
4
5
-
-
-
-
-
-
-
-
3, 2 *  
-
-
-
7, 4  
-
6, 6 *  
9
Ni dung  
Phát biểu bài toán tìm đường đi ngắn nhất  
Thuật toán Dijkstra  
Thuật toán Bellman-Ford  
Thuật toán Floyd  
10  
Thut toán Bellman-Ford (1/2)  
Mục đích  
o Sử dụng để tìm đường đi ngắn nhất từ một đỉnh  tới các đỉnh còn  
lại của đồ thị  
o Áp dụng cho đồ thị hướng không có chu trình âm (có thể có  
cạnh âm)  
Tư tưởng  
o Gán nhãn tạm thời cho các đỉnh  
. Nhãn của mỗi đỉnh cho biết cận trên của độ dài đường đi ngắn nhất tới  
đỉnh đó  
o Các nhãn này sẽ được làm tốt dần (tính lại) nhờ một thủ tục lặp  
. Mỗi khi phát hiện ,푣- > ,푢- + 푎(푢, 푣), cập nhật   = ,푢- + 푎(푢, 푣)  
11  
Thut toán Bellman-Ford (2/2)  
Bellman-Ford(){  
Bước 1 (Khi to):  
for (  ){ //Sử dụng  gán nhãn cho các đỉnh còn lại  
,푣- = 푎(푠, );  
푡푟푢표,푣- = ;  
}
Bước 2 (Lp):  
  = 0;  
for (= 1;   2; 푘 + + ){  
for (  푉\*푠+){  
for (  ){  
if (,푣- > ,푢- + 푎(푢, )){  
,푣- = ,푢- + 푎(푢, );  
푡푟푢표,푣- = ;  
}
}
}
}
}
12  
Ví d: Bellman-Ford (1/2)  
3
5
1
Áp dng thut  
toán Bellman-  
Ford tìm đường  
đi ngn nht từ  
đnh s1 ti  
các đnh còn li  
ca đth.  
8
1
4
-5  
3
2
4
3
1
3
2
13  
Ví d: Bellman-Ford (2/2)  
3
5
1
Áp dng thut  
toán Bellman-  
Ford tìm đường  
đi ngn nht từ  
đnh s1 ti  
các đnh còn li  
ca đth.  
8
1
4
-5  
3
2
4
3
1
3
,푢-  
푡푟푢표,푢-  
2
Bước lp Đnh 1 Đnh 2 Đnh 3 Đnh 4 Đnh 5  
Khi to  
0, 1  
0, 1  
0, 1  
0, 1  
1, 1  
1, 1  
1, 1  
1, 1  
∞, 1  
4, 2  
4, 2  
4, 2  
∞, 1  
4, 2  
3, 5  
3, 5  
3, 1  
-1, 3  
-1, 3  
-1, 3  
k=1  
2
3
14  
Ni dung  
Phát biểu bài toán tìm đường đi ngắn nhất  
Thuật toán Dijkstra  
Thuật toán Bellman-Ford  
Thuật toán Floyd  
15  
Thut toán Floyd (1/3)  
Mục đích  
o Sử dụng để tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh của  
đồ thị  
o Áp dụng cho đồ thị hướng không có chu trình âm (có thể có  
cạnh âm)  
Tư tưởng  
o Thực hiện quá trình lặp  
. Xét từng đỉnh, với tất cả các đường đi (giữa 2 đỉnh bất kỳ), nếu đường  
đi hiện tại lớn hơn đường đi qua đỉnh đang xét, ta thay lại thành  
đường đi qua đỉnh này  
16  
Thut toán Floyd (2/3)  
Floyd( ){  
Bước 1 (Khi to):  
for (= 1,  푛; 푖 + +){  
for(  = 1,   푛;  + +){ //Xét tng cp đnh  
,푖, 푗- = 푎(, );  
푛푒푥푡,푖, 푗- = ;  
}
}
Bước 2 (Lp):  
for (= 1,  푛; 푘 + +){  
for (= 1,  푛; 푖 + +){  
for (= 푗,   푛;  + +){  
if (,푖, 푗- > ,푖, - + ,푘, 푗-){  
,푖, 푗- = ,푖, - + ,푘, 푗-;  
푛푒푥,푖, 푗- = 푛푒푥,푖, -;  
}
}
}
}
17  
}
Thut toán Floyd (3/3)  
Khôi phục đường đi  
Reconstruct-Path( 푢, ){  
if ( 푛푒푥,푢-,푣- == 푛푢푙푙)  
<Không có đường đi t đến >;  
else{  
푝푎푡ℎ = ,푢-; // path bắt đầu từ   
while(  ){  
 = 푛푒푥푡,푢-,푣-;  
푝푎푡ℎ. 푎푝푝푒푛푑(푢); //đỉnh tiếp theo trên đường đi  
}
return 푝푎푡;  
}
}
18  
Kim nghim thut toán  
Áp dng thut  
toán Floyd tìm  
đường đi ngn  
nht gia tt cả  
các cp đnh ca  
đth.  
1
-2  
4
3
2
3
-1  
2
4
19  
Tóm tt  
Bài toán tìm đường đi ngắn nhất trên đồ thị, các dạng  
của bài toán  
Thuật toán Dijkstra, áp dụng  
Thuật toán Bellman-Ford, áp dụng  
Thuật toán Floyd, áp dụng  
20  
Tải về để xem bản đầy đủ
pdf 21 trang myanh 27/04/2022 24860
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Toán rời rạc 2 - Chương 6: Bài toán tìm đường đi ngắn nhất - Ngô Xuân Bách", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_toan_roi_rac_2_chuong_6_bai_toan_tim_duong_di_ngan.pdf