Bài toán đi đường của môn toán rời rạc của thầy hiệu
1. BÀI 9
BÀI TOÁN ĐƯỜNG ĐI NGẮN
NHẤT TRÊN ĐỒ THỊ
1
Giáo viên: TS. Nguy n Văn Hi u
ễ ệ
Email: nvhieuqt@dut.udn.vn
2. Nội dung
❑ Giới thiệu
❑ Bài toán
❑ Thuật toán Dijkstra
❑ Thuật toán Bellman-Ford
❑ Thuật toán Floyd – Warshall
❑ Ứng dụng
Nguyễn Văn Hiệu, 2014, Discrete Mathematics 2
3. Giới thiệu
❑Đồ thị trọng số là đồ thị có gắn một giá
trị cho mỗi cạnh hoặc mỗi cung
❑Giá trị là số nguyên hoặc số thực, giá trị
mang ý nghĩa thực tế:
★ giá trị có thể là thời gian;
★ giá trị có thể là chi phí;
★ giá trị có thể là tốc độ;
★ giá trị có thể là cự ly.
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 3
5. Bài toán
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 5
Bài toán 1:Tìm đường đi ngắn nhất từ đỉnh
a và đỉnh z
Bài toán 2: Tìm đường đi ngắn nhất từ
đỉnh a đến tất cả các đỉnh còn lại
Bài toán 3: Tìm đường đi ngắn nhất giữa
mọi cặp đỉnh
6. Bài toán
❑ Để chắc chắn tìm được đường đi ngắn
nhất thì điều kiện
❑ Phải tồn tại đường đi:
❑ Đồ thị vô hướng liên thông.
❑ Đồ thị có hướng liên thông mạnh.
❑ Không tồn tại chu trình âm và cạnh âm:
❑ Đồ thị có hướng không tồn tại chu trình âm.
❑ Đồ thị vô hướng không tồn tại cạnh âm.
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 6
7. Bài toán
❑Đường đi ngắn nhất từ Etna đến Oldtown là:
Etna – Bangor – Orono – Old Town
❑Đường đi ngắn nhất từ Hermae đến Etna là:
Hermae – Hampdea – Bangor - Etna
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 7
9. Thuật toán Dijkstra
❑ Mục tiêu: Tìm đường đi ngắn nhất từ đỉnh a
đến đỉnh z.
❑ Điều kiện: w(u,v)> 0 với mọi (u,v) thuộc E:
– Nếu đồ thị có hướng cung dương
– Nếu đồ thị vô hướng cạnh dương
❑ L(u) - chiều dài ngắn nhất từ a đến u.
❑ Thuật toán kết thúc khi xác định được L(z)
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 9
13. Thuật toán Dijkstra
Độ phức tạp của thuật toán:
f(n) = 0(n*n)
f(n) - số lần duyệt cạnh/ cung của thuật toán
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 13
Thuật toán Dijkstra là tối ưu
Kn - có số cạnh là n(n-1)/2
Tìm đường đi ngắn nhất từ a đến z phải khảo sát
qua mỗi cạnh một lần.
Thuật giải khảo sát ít nhất 0(n*n)
20. Phương pháp lập bảng ghi nhãn
❑ Bản chất như thuật toán Dijkstra
❑ Các cột tương ứng với các đỉnh
❑ Các hàng tương ứng với số lần tính nhãn
(bước 4)
❑ Các nhãn “gạch dưới” tương ứng với
nhãn nhỏ nhất ở (bước 2)
❑ Số đỉnh được cố định chính là số đỉnh
loại ra (bước 2)
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 20
21. a
b c
z
d e
4
1
2
5
6
3
2
10
8
Ví dụ lập bảng tính nhãn (1)
a b c d e z
a
d
- 3,d 10,d - 12,d b
- - 8,b - 12,d c
- - - - 10.c 14,c e
- - - - - 13,e z
- - - - - -
24. Thuật toán Bellman-Ford
❑ Dijkstra cho kết quả sai nếu đồ thị có trọng số
âm
❑ Bellman-Ford khắc phục kết quả trên
❑ Bellman-Ford giúp xác định đồ thị có chu trình
âm hay không
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 24
s
b
z
3
2
-2
30. k 1 2 3 4 5 6
0,O 1,O
∞ ,
O
∞,O ∞,O ∞,O
1
2
3
4
5
6
S = 1
Ví dụ thuật toán Bellman-Ford
31. Thuật toán Floyd- Warshall
❑ Mục tiêu: Tìm đường đi ngắn nhất giữa
mọi cặp đỉnh của đồ thị (có hướng) có
trọng số
❑ Giải pháp
– Dijkstra nhiều lần
– Floyd - Warshall
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 31
32. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 32
❑ Input:
G = (V, E, W), V = {1,2,…,n}
❑Output:
D = {d[i,j]}nxn,
d[i,j] độ dài đường đi ngắn nhất từ i đến j
P = {p[i,j]}nxn,,
p[i,j] – đỉnh đi trước j trên đường đi
ngắn nhất từ i đến j
Thuật toán Floyd- Warshall
33. •
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 33
Thuật toán Floyd- Warshall
34. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 34
Step 2
For k:=1 to n do // |V| = n
// Tính Dk và Pk theo Dk-1, Pk-1
For n:=1 to n do
For m:=1 to n do
if dk -1[i,j]> dk -1[i,k]+ dk -1[k,j] then {
dk[i,j]=dk -1[i,k]+dk -1[k,j];
pk[i,j]= pk -1[i,k];
}
else {
dk[i,j]=dk -1[i,j]; pk[i,j]= pk -1[i,j];
}
Thuật toán Floyd- Warshall
35. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 35
Thuật toán Floyd- Warshall
Độ phức tạp của thuật Floyd Warshall
0(n*n*n)
36. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 36
Ví dụ thuật toán Floyd- Warshall (1)
1
2 4
3
7
11
7
4
5
6
1
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Ma trận D0
Ma trận P0
37. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 37
Ví dụ thuật toán Floyd- Warshall (2)
1
2 4
3
7
11
7
4
5
6
1
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Cập nhật qua đỉnh 1
Ma trận D1
Ma trận P1
38. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 38
Ví dụ thuật toán Floyd- Warshall(3)
1
2 4
3
7
11
7
4
5
6
1
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Cập nhật qua đỉnh 2
Ma trận D2
Ma trận P2
39. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 39
Ví dụ thuật toán Floyd- Warshall (4)
1
2 4
3
7
11
7
4
5
6
1
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Cập nhật qua đỉnh 3
Ma trận D3
Ma trận P3
40. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 40
Ví dụ thuật toán Floyd- Warshall (5)
1
2 4
3
7
11
7
4
5
6
1
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Cập nhật qua đỉnh 4
Ma trận D4
Ma trận P4
42. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 42
10
2
1
5
6
3
Ma trận D0
Ví dụ thuật toán Floyd- Warshall (2.1)
Ma trận P0
1 2
3
4
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
43. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 43
10
2
1
5
6
3
Ví dụ thuật toán Floyd- Warshall (2.2)
1 2
3
4
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Ma trận D1
Ma trận P1
44. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 44
10
2
1
5
6
3
Ví dụ thuật toán Floyd- Warshall(2.3)
1 2
3
4
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Ma trận D2
Ma trận P2
45. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 45
10
2
1
5
6
3
Ví dụ thuật toán Floyd- Warshall(2.4)
1 2
3
4
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Ma trận D3
Ma trận P3
46. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 46
10
2
1
5
6
3
Ví dụ thuật toán Floyd- Warshall(2.5)
1 2
3
4
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Ma trận D4
Ma trận P4
47. Nguyễn Văn Hiệu, 2012, Discrete Mathematics 47
10
2
1
5
6
3
Ví dụ thuật toán Floyd- Warshall(2.6)
1 2
3
4
1 2 3 4
1
2
3
4
1 2 3 4
1
2
3
4
Ma trận D4
Ma trận P4
48. Ứng dụng
❑Bài toán chọn địa điểm đặt cơ sở dịch vụ, sao cho
hiệu quả nhất về mặt kinh tế
❑Bài toán cực tiểu tổng
▪ Tìm vị trí để đặt cơ sở sao cho khoảng cách giữa các vùng đến
cơ sở là nhỏ nhất
▪ Vị trí đặt trường học, bưu điện, bệnh viện.
❑Bài toán cực tiểu trị lớn nhất
▪ Tìm vị trí đặt cơ sở sao cho khoảng cách từ cơ sở đến điểm xa
nhất của cộng đồng là nhỏ nhất
▪ Vị trí đặt cơ quan phòng cháy chữa cháy.
51. Ứng dụng
1 1
1
1
1 2 4
3
1 5
6
7
1 2 3 4 5 6 7
1
2
3
4
5
6
7
- Đỉnh 4 là đỉnh cực tiểu
- Đỉnh 3 là tâm đồ thị
52. ❑ Lập trình thực hiện các thuật toán mô tả:
❑ Thuật toán Dijkstra
❑ Thuật toán Floyd-Warshall
❑ Thuật toán Bellman-Ford
❑ Xác định độ phức tạp của 3 thuật toán trên
Nguyễn Văn Hiệu, 2012, Discrete Mathematics 52
Bài tập
#5:Quan hệ một một
Quan hệ một nhiều
Quan hệ nhiều nhiều
#6:Không tồn tại chu trình âm:
+ Đồ thị vô hướng không tồn tại
#9:Không tồn tại chu trình âm:
+ Đồ thị vô hướng không tồn tại
#10:Không tồn tại chu trình âm:
+ Đồ thị vô hướng không tồn tại
#11:P(x) là đỉnh trước x trên đường đi ngắn nhất từ a đến x
#12:P(z) giúp lần ngược các điểm ghi nhớ
Z1=P(z),Z2=P(Z1),….,Zn=P(Zn-1), a= P(Z)
#13:+ Khảo sát các cạnh ở step 4 – Số lần khảo sát các cạnh tối đa là n-1 (vì có n đỉnh)
+ step 4 vòng lặp chứa step 2 đến step 4.
- Vòng lặp thực hiện đến khi z không thuộc T. Nên số vòng lặp xử lý xấu nhất là n (vì T có n đỉnh)
- f(n) = n*(n-1) <= n*n
#20:Không tồn tại chu trình âm:
+ Đồ thị vô hướng không tồn tại
#25:Không tồn tại chu trình âm:
+ Đồ thị vô hướng không tồn tại
#26:P(x) là đỉnh trước x trên đường đi ngắn nhất từ a đến x
#27:P(z) giúp lần ngược các điểm ghi nhớ
Z1=P(z),Z2=P(Z1),….,Zn=P(Zn-1), a= P(Z)
#32:Không tồn tại chu trình âm:
+ Đồ thị vô hướng không tồn tại
#34:// Khởi tạo
For i:=1 to n do
For j:=1 to n do{
d[i,j] := a[i,j];
p[i,j] := i; }
// Bước lặp
For k:=1 to n do
For i:=1 to n do
For j:=1 to n do
If(d[i,j]>d[i,k]+d[k,j]){
d[i,j] := d[i,k] + d[k,j];
p[i,j] := p[k,j];
}