Chuong05 - Ly Thuyet Do Thi - Bai Toan Toi Uu Tren Do Thi

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 40

LOGO

www.dtu.edu.vn

Chương 5
Các bài toán tối ưu trên đồ thị
(Thời lượng:4g)

GV: Nguyễn Minh Nhật


Email: nguyenminhnhat@duytan.edu.vn
Mob: 0905125143

www.dtu.edu.vn
NỘI DUNG LOGO

1 Đường đi ngăn nhất

2 Cây khung nhỏ nhất

3 Bài tập ứng dụng

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

Ứng dụng thực tế:


 Đường nào đi nhanh nhất (theo thời gian), hoặc gần
nhất (theo khoảng cách) hoặc rẻ nhất (theo chi phí)
giữa 2 thành phố?
 Đường nào truyền dữ liệu với thời gian nhanh nhất
trên mạng?

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ


Tìm đường đi ngắn nhất LOGO

H
N

2 Tìm đường đi từ Hà Nội (HN)


V 7
4 đến Sài Gòn (SG) sao cho
H
18 2 tổng chi phí (*) là ít nhất?
D
N

8 4 3

NT
DL
3
3
3
SG

4
www.dtu.edu.vn Chương 05 - Bài toán tối ưu
Tìm đường đi ngắn nhất LOGO

 Cho đơn đồ thị liên thông, có trọng số G=(V,E).


Tìm khoảng cách L(u0,v) từ một đỉnh u0 cho trước
đến một đỉnh v bất kỳ của G và tìm đường đi ngắn
nhất từ u0 đến v.
 Một số thuật toán tìm đường đi ngắn nhất: Thuật
toán do E. Dijkstra, nhà toán học người Hà Lan, đề
xuất năm 1959.
 Trong phiên bản này, giả sử đồ thị là vô hướng, các
trọng số là dương. Chỉ cần thay đổi đôi chút là có
thể giải được bài toán tìm đường đi ngắn nhất
trong đồ thị có hướng.

5
www.dtu.edu.vn Chương 05 - Bài toán tối ưu
Tìm đường đi ngắn nhất LOGO

Thuật toán Dijkstra:


Ý tưởng: xác định tuần tự đỉnh có khoảng cách đến
u0 từ nhỏ đến lớn.
 Khoảng cách L(u0,u0)=0.
 v  u0, tìm đỉnh u1 kề u0 có L(u0,u1) = k1 là nhỏ
nhất.
 v  u0 và v  u1, tìm đỉnh kề với u0 hoặc với u1 có
L(u0,u2) = k2 là nhỏ nhất.
 Lặp lại quá trình trên cho đến khi tìm được khoảng
cách từ u0 đến mọi đỉnh v của G. Nếu V={u0,
u1, ..., un} thì:
 0 = L(u0,u0) < L(u0,u1) < L(u0,u2) < ... < L(u0,un).

6
www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị
Tìm đường đi ngắn nhất LOGO
Thuật toán Dijkstra có thể tóm tắt như sau:
Bước 1: Gán L(u0):=0. Với mọi đỉnh x  u0 gán L(x) = ,
xV. Ký hiệu T := V.// V tập đỉnh
Bước 2: Chọn v  T: sao cho L(v) có giá trị nhỏ nhất. Đặt
T := T ˗ ­{v}
Bước 3: Nếu z  T, kết thúc, L(z) là chiều dài đường đi
ngắn nhất từ u0 đến z. (z  V)
Từ z lần ngược theo đỉnh được ghi nhớ a có đường đi
ngắn nhất.
Ngược lại, sang Bước 4.
Bước 4: Với mỗi xT kề v gán
L(x) := min{L(x), L(v)+w(v,x)}
Nếu L(x) thay đổi thì ghi nhớ đỉnh v cạnh đỉnh x để sau
này xây dựng đường đi ngắn nhất. Quay lại Bước 2.
7
www.dtu.edu.vn Chương 05 - Bài toán tối ưu
Tìm đường đi ngắn nhất LOGO
Bước 4: Với mỗi xT kề v gán
L(x) := min{L(x), L(v)+w(v,x)}
Nếu L(x) thay đổi thì ghi nhớ đỉnh v cạnh đỉnh x để sau
này xây dựng đường đi ngắn nhất. Quay lại Bước 2.

w(v,x) x
v

L(v)

L(x)

u0
L(x) := min{L(x), L(v)+w(v,x)}

8
www.dtu.edu.vn Chương 05 - Bài toán tối ưu
Tìm đường đi ngắn nhất LOGO

Xuất phát: HN - Đích: SG


H
(0) T HN V H DN NT DL SG
N

V 7
4
(2)
()
H L
18 2
(2+4)
()
D (7)
()
N
3
8 4

(7+4)
() NT ()
(7+3)
DL
3
3 Truo
3 c
SG
(18)
(7+8)
()
(7+3+3)
9
Đường đi chi phí nhỏ nhất là : HN  DN  NT  SG với chi phí = 7+3+3 = 13

9
www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị
Tìm đường đi ngắn nhất LOGO

Ví dụ 2:
Cho đồ thị G=(V,E) liên thông có 5 đỉnh. Tìm đường đi ngắn nhất từ
A đến đỉnh D (áp dụng thuật toán Dijkstra).
8
A E

8
5 1
7

3
B C D
3

A:1, B:2, C:3,D;4; E:5


Đỉnh đầu: A(1), Đinh cuối: D(4)

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

(0) ()
(8)
8
Bắt đầu: A, Kết thúc: D
A E
T A B C D E
8
5 1
7
L

B 3 C D
3
()
(7) (7+3)
(8+1)
() (8+8)
()
(8+1+3)

Truoc

Đường đi ngắn nhất: A  E  C  D Với độ dài = 8+1+3 = 12


www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị
Tìm đường đi ngắn nhất LOGO

Thuật toán Dijkstra


void Dijkstra (G=(V,E))
{
L(u0) = 0;
for( i = 1; i<= n; i++) L(ui) = ;
S = V \ {u0};
u = u0;
while(S  )
{
for(v  S)
if (L(u) +m(u,v) < L(v))
L(v) = L(u)+m(u,v);
u = Đỉnh thuộc S có nhãn L(u) nhỏ nhất;
S = S \ {u};
}
}
www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị
LOGO
Thuật toán Floyd
Thuật giải tìm độ dài đường đi ngắn nhất giữa mọi cặp đỉnh
trong đồ thị có hướng liên thông có trọng số .
V={v1, v2, ..., vn} và có ma trận trọng số là W  W0. Thuật toán
Floyd xây dựng dãy các ma trận vuông cấp n là Wk (0  k  n):
void Floyd(Wn)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
W[i,j]=m(vi,vj);//W[i,j] là p.tử dòng i cột j của W0
for(k=1;k<=n;k++)
if (W[i,k] + W[k,j] < W[i,j])
W[i,j] = W[i,k] + W[k,j];
//W[i,j] là phần tử dòng i cột j của ma trận Wk}
www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị
Tìm đường đi ngắn nhất LOGO
Thuật toán Floyd
Đầu vào: Đồ thị liên thông G = (V, E), V = {1, 2, ... , n}, có trọng
số w(i,j) với mọi cung (i,j).
Đầu ra: Ma trận D = [d(i,j)], trong đó d(i,j) là chiều dài đường đi
ngắn nhất từ i đến j với mọi cặp (i,j).
Phương pháp:
Bước 1: Bước khởi tạo:
Ký hiệu D0 là ma trận xuất phát D0 = [d0(i,j)]
Trong đó d0(i,j) = w(i,j) nếu tồn tại cung (i,j)
và d0(i,j) = + nếu không tồn tại cung (i,j)
không có khuyên tại i thì d0(i,i) = +.
Gán k:=0.
Bước 2: Kiểm tra kết thúc:
Nếu k > n, kết thúc. D = Dn là ma trận độ dài đường đi ngắn
nhất.
Ngược lại tăng k lên 1 đơn vị (k:=k+1) và sang Bước 3.
www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị
Tìm đường đi ngắn nhất LOGO
Bước 3: Tính ma trận Dk theo Dk-1:
Với mọi cặp (i,j), i=1..n, j=1..n thực hiện:
Nếu dk-1(i,j) > dk-1(i,k) + dk-1(k,j) thì đặt:
dk(i,j) := dk-1(i,k) + dk-1(k,j)
ngược lại đặt: dk(i,j) := dk-1(i,j).Quay lại Bước 2.

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

Định lý 3.6: Thuật toán Floyd cho ta ma trận W*=Wn là ma


trận khoảng cách nhỏ nhất của đồ thị G.
 Thuật toán Dijkstra có độ phức tạp là O(n2).
 Thuật toán Floyd có độ phức tạp là O(n3).

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

 Ví dụ. Xét đồ thị sau

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

 Bước 1: Tạo ma trận khoảng cách xuất phát D0 :

Đặt k = 0
 Bước 2:Tăng k lên 1, k = 1

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

 Bước 3:Tính ma trận D1 theo D0 :

Quay lại bước 2


 Bước 2: Tăng k lên 1, k = 2

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

 Bước 3:Tính ma trận D2 theo D1 :

Quay lại bước 2


 Bước 2: Tăng k lên 1, k = 3

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

 Bước 3:Tính ma trận D3 theo D2 :

Quay lại bước 2


 Bước 2: Tăng k lên 1, k = 4

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

 Bước 3:Tính ma trận D4 theo D3 :

Quay lại bước 2


 Bước 2: Tăng k lên 1, k=5>n=4
Kết thúc.

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Tìm đường đi ngắn nhất LOGO

 D là ma trận khoảng cách ngắn nhất giữa các


đỉnh

Link Youtube
https://www.youtube.com/watch?v=xyAuNHPsq-g
https://www.youtube.com/watch?v=0fTSBIBD7Cs

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Định nghĩa cây: Cây là một đồ thị vô hướng liên thông,


không chứa chu trình và có ít nhất hai đỉnh.

 Định nghĩa: Giả sử G = (V, E) là đồ thị vô hướng


liên thông. Cây T = (V, F) với F E được gọi là cây
khung của đồ thị G.

 T1, T2 là các cây khung của đồ thị G

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

Giả sử:
4
Mỗi cạnh eE có trọng số 3
D
m(e)0. Ta gọi độ dài m(T) 7
của cây khung T, là tổng B
trọng số của các cạnh của A
5
G
3

nó: D
• m(T) =  m(e)
3 C
7
e E T B 3
T1 m(T1) = 13
 Bài toán: Làm thế nào tìm A C
được cây khung T2 có m(T2) 3
4

là nhỏ nhất? D
B
T2 m(T2) = 10
3

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

Thuật toán Kruskal


Đầu vào:
Đồ thị G = (V,E) với trọng số. Các đỉnh ký hiệu là 1, 2, ... , n
Trọng số của cạnh (i,j), (i,j)E, ký hiệu là cij
Đầu ra: Cây phủ nhỏ nhất T, hoặc kết luận đồ thị không liên
thông.

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

Thuật toán Kruskal


Phương pháp
Bước 1: Khởi tạo: Bắt đầu từ đồ thị rỗng T có n đỉnh. T = (V,
)
Bước 2: Kiểm tra điều kiện kết thúc:
Nếu T có n-1 cạnh, Kết thúc. Kết luận: T là cây phủ nhỏ
nhất.
Bước 3: Thêm cạnh:
Chọn cạnh có trọng số nhỏ nhất không thuộc T sao cho khi
thêm cạnh này vào T thì không tạo ra chu trình trong T. Quay
lại Bước 2.
Ngược lại, nếu không chọn được cạnh thêm vào T thì kết
thúc  Kết luận đồ thị G không liên thông.

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

Thuật toán Kruskal


Cạnh TS
(1) 2 (5) 3 (1,2) 1
1
(3,5) 1
(4) (1,4) 2
(2) (1) (2,4) 2
(2)
(4,5) 2
(5,6) 3
6
4 (2) 5 (3) (3,6) 4
E (2,3) 5
(5,6),
(3,5),
(4,5),
(1,4),
(2,4), (3,6),(2,3)
(3,6),(2,3)
(1,2) (3,5),
(1,4),
(5,6),
(2,4),(1,4),
(4,5), (2,4),
(3,6),(2,3)
(4,5),(2,4),
(5,6), (4,5),
(5,6),(4,5),
(3,6),(2,3)
(5,6),
(3,6),(2,3)
(5,6),
(3,6),(2,3)
(3,6),(2,3)
ET

(1,2)
(1,2),
(1,2),
(1,2),(3,5)
(3,5),
(3,5),
(3,5),(1,4)
(1,4),
(1,4), (4,5)
(4,5), (5,6)

Với m(T) = 1+2+2+1+3 = 9

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim


 Đầu vào:
Đồ thị G = (VG ,EG , w), VG ={1, 2,..., n}, wij là
trọng số của cạnh (i,j), (i,j)  EG
VG : Tập đỉnh trong đồ thị G
EG : Tập cạnh trong đồ thị G
 Đầu ra: Cây phủ nhỏ nhất T = (VT ,ET) , hoặc kết
luận đồ thị không liên thông.
VT : Tập đỉnh trong cây T
ET : Tập cạnh trong cây T

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim (tt)


 Phương pháp:
Bước 1: Khởi tạo: VT = {i}, i  VG , ET = 
T là đồ thị gồm một đỉnh i bất kỳ trong G và
không có cạnh.
Bước 2: Kiểm tra điều kiện kết thúc:
Nếu |ET| = n-1, Kết thúc. Kết luận: T là cây phủ nhỏ
nhất. Ngược lại sang Bước 3

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim (tt)


 Bước 3: Thêm cạnh:
Ký hiệu M là tập các canh trong EG: M =
{(i,j)EGi VT & j VG - VT}
Tìm cạnh (k,h)  M sao cho wkh = min{wij  (i,j)
M}
Nếu wkh < , ET = ET  (k,h) và VT =VT  h, sang
Bước 2.
Ngược lại, kết thúc. Kết luận đồ thị G không liên
thông.

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim (tt)


 Ví dụ. Tìm cây phủ nhỏ nhất của đồ thị

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim (tt)


 Ví dụ. Tìm cây phủ nhỏ nhất của đồ thị
Bước 1: Khởi tạo: VT={a}, ET = Ø
Bước 2: Kiểm tra: Số cạnh của T là |ET| = 0 < n-1=6-
1=5, sang Bước 3
Bước 3: Thêm cạnh: M = {(a,b), (a,c), (a,e)}
Có: wac = 2 = min{wij  (i,j)M}
Thêm đỉnh c vào VT , VT={a,c}và cạnh (a,c) vào
ET , ET={(a,c)}
Bước 2: Kiểm tra: Số cạnh của T là 1 < 5, sang Bước
3

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim (tt)


 Ví dụ. Tìm cây phủ nhỏ nhất của đồ thị
Bước 3: Thêm cạnh: M = {(a,b),(a,e),(c,d),(c,e),
(c,f)}
Có: ccd = 1 = min{cij  (i,j)M}
Thêm đỉnh d và cạnh (c,d) vào T. VT={a,c,d},
ET={(a,c), (c,d)}
Bước 2: Kiểm tra: Số cạnh của T là 2<5, sang Bước 3
Bước 3: Thêm cạnh: M = {(a,b),(a,e),(c,e),(c,f),(d,b),
(d,f)}
Có: cae = ccf = 3 = min{cij  (i,j)M}
Thêm đỉnh e và cạnh (a,e) vào T. VT={a,c,d,e},
ET={(a,c), (c,d), (a,e) }

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim (tt)


 Ví dụ. Tìm cây phủ nhỏ nhất của đồ thị
Bước 2: Kiểm tra: Số cạnh của T là 3 < 5, sang bước (3)
Bước 3: Thêm cạnh: M = {(a,b),(c,f),(d,b),(d,f),(e,f)}
Có: cef = 2 = min{cij  (i,j)M}
Thêm đỉnh f và cạnh (e,f) vào T. VT={a,c,d,e,f},
ET={(a,c), (c,d), (a,e), (e,f)}
Bước 2: Kiểm tra: Số cạnh của T là 4<5, sang bước (3)
Bước 3: Thêm cạnh: M = {(a,b),(d,b)}
Có: cab = 4 = min{cij  (i,j)M}
Thêm đỉnh b và cạnh (a,b) vào T. VT={a,c,d,e,f,b},
ET={(a,c),(c,d),(a,e),(e,f), (a,b)}

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Cây khung nhỏ nhất LOGO

 Thuật toán Prim (tt)


Bước 2: Kiểm tra: Số cạnh của T là 5 = n - 1, Kết
thúc.
Ta có cây phủ nhỏ nhất gồm các cạnh
(a,c),(c,d),(a,e),(e,f),(a,b)

với tổng trọng số là 2 + 1 + 3 + 2 + 4 = 12.

www.dtu.edu.vn Chương 05 - Bài toán tối ưu


Hỏi - đáp LOGO

 Câu 1: Sử dụng thuật toán Prim, mô phỏng quá


trình tìm cây phủ tối thiểu của đồ thị sau:

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Hỏi - đáp LOGO

 Câu 2: Sử dụng thuật toán Kruskal mô phỏng


quá trình tìm cây phủ tối thiểu của đồ thị sau :

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Bài tập yêu cầu – Lab 06 LOGO

 Bài 1: Sử dụng thuật toán Prim, viết chương


trình tìm cây phủ tối thiểu của đồ thị sau:

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị


Bài tập yêu cầu – Lab 06 LOGO

 Bài 2: Sử dụng thuật toán Kruskal viết chương


trình tìm cây phủ tối thiểu của đồ thị sau:

www.dtu.edu.vn Chương 05 - Bài toán tối ưu trên đồ thị

You might also like