4 Bài toán tối ưu
4.2.4 Bài toán tìm đường đi có trọng số nhỏ nhất
Giả sử G = (V;E;w) là một đồ thị có trọng số liên thông, có hướng, không có khuyên, ở đây: w : E −→ R+ ∪ 0 = {r ∈ R/r > 0}. Giả sử s;t ∈ V là hai đỉnh đã cho và P là một đường có hướng với đỉnh đầu là s và đỉnh cuối là t. Ta định nghĩa trọng số của đường P, kí hiệu là w(P) là giá trị:
w(P) = X e là cung của P
w(e)
Bài toán tìm đường có trọng lượng nhỏ nhất:
Giả sử G= (V;E;w) là đồ thị có trọng số, liên thông, có hướng không có khuyên với w : E −→ R+ ∪ {0}. Ta cũng giả sử s ∈ V là một đỉnh cho trước và D ⊆ V là một tập đỉnh cho trước. Với mỗi đỉnh d ∈ D, hãy tìm một đường có hướng P đi từ tập s tới d sao cho trọng lượng w(P) của đường P là nhỏ nhất trong số tất cả trọng lượng của các đường có hướng đi từ s tới d và cho biết trọng lượng w(P) đó bằng bao nhiêu.
Để giải quyết bài toán này, Dijkstra đã đưa ra một thuật toán mà ngày nay ta gọi là thuật toán Dijkstra. Thuật toán này về nguyên tắc và hình thức rất giống với thuật toán Prim trình bày ở trên.
Thuật toán Dijkstra: Ta gọi nhãn của đỉnh v ∈ V là bộ [α(v);l(v)] với α(v) ∈ V còn l(v) ∈ R+ ∪ {0}. Một đỉnh được gọi là có nhãn tạm thời nếu như nhãn của đỉnh đó còn được xem xét và có thể bị thay đổi ở các bước tiếp theo của thuật toán. Nếu nhãn của một đỉnh không thay đổi ở tất cả các bước tiếp theo của thuật toán, thì nó được gọi là nhãn cố định của đỉnh đó. Ta sẽ lưu giữ các đỉnh có nhãn tạm thời ở biến U. Ta cũng dùng một biến là L để lưu giữ nhãn cố định của các đỉnh. Nhãn của đỉnh v sẽ được lưu giữ như là giá trị của biến v.
Bước 1: Khởi tạo và gán giá trị ban đầu cho các biến. x := s (s là đỉnh đã cho trước trong bài toán)
D0 := D\ {s} (D là tập các đỉnh đã cho trước trong bài toán). U := V\ {s}
y := [s;∞] cho mọi y ∈ U L := {s := [s; 0]}
Bước 2: Đổ nhãn cho các đỉnh thuộc U. Với mọi đỉnh y ∈ U y = {
Bước 3: Tìm min
y∈U l(y) =l(vi) (**)
Bước 4: x := vi(nếu có một số đỉnh vi ∈ U thỏa mãn (**) thì ta chọn một đỉnh bất kì trong số các đỉnh đó).
Bước 5: Gán giá trị mới cho các biến D0;U và L D0 := D0\ {x}
U := U\ {x}
L := L∪ {x := [α(x);l(x)]}
Bước 6: Nếu D0 6= 0 thì ta quay lại bước 2.
Nếu D0 = ∅ thì ta bắt đầu đi tìm đường có hướng có trọng lượng nhỏ nhất dựa vào tập L các nhãn cố định của các đỉnh của Gnhận được sau lần lặp cuối cùng. Khi đó, với mỗi đỉnh d ∈ D;l(d) là trọng lượng của đường có hướng có trọng số nhỏ nhất từ s tới d và một trong các đường đó là:
d ←α(d) ← α(α(d)) ← · · · ← s
Định lý 4.7. Giả sử G = (V;E;w) là đồ thị có trọng số có hướng liên thông không có khuyên, ở đây w : E −→ R+∪ {0}, s ∈ V là một đỉnh cho trước và d ⊆ là một tập đỉnh cho trước của G. Khi đó với mỗi đỉnh d∈ D thuật toán Dijkstra luôn tìm được trong G một đường có hướng có trọng lượng nhỏ nhất đi từ đỉnh s tới đỉnh d và xác định được trọng lượng của đường đi đó.
Ví dụ 4.13. Giả sử G = (V;E;w) là đồ thị có trọng số có hướng được biểu diễn bởi hình dưới. Với mỗi đỉnh thuộc tập D = {d;e;t} hãy tìm một đường có hướng có trọng lượng nhỏ nhất từ đỉnh s tới đỉnh đó và cho biết trọng lượng của mỗi đường tìm được.
Lời giải. Ta sử dụng thuật toán Di Bước 1: x := s;D0 := {d;e;t};U := {a;b;c;d;e;t};s := [s; 0] y := [s;∞] cho mọi y ∈ U;L := {s := [s; 0]} Lần lặp 1: Bước 2: a := [s; 5] ;b := [s; 31] ;c := [s; 40] ;d := [s;∞] ;e := [s;∞] ;t := [s;∞] Bước 3: min y∈U l(y) = l(va) = 5 Bước 4: x := a Bước 5: D0 := D0\ {a} = {d;e;t};U := U\ {a} = {b;c;d;e;t};L := L∪ {a := [s; 5]}= {s:= [s; 0] ;a := [s; 5]};
Bước 6: D0 6= ∅. Ta phải quay lại bước 2. Lần lặp 2: Bước 2: b := [s; 31] ;c := [s; 40] ;d := [s; 78] ;e := [s;∞] ;t:= [s;∞] Bước 3: min y∈U l(y) = l(vb) = 31 Bước 4: x := b Bước 5: D0 := D0\ {b} = {d;e;t};U := U\ {b} = {c;d;e;t};L := L∪ b := [s; 31] = {s := [s; 0] ;a := [s; 5] ;a := [s; 31]};
Bước 6: D0 6= ∅. Ta phải quay lại bước 2. Lần lặp 3:
Bước 2: c := [b; 39] ;d := [s; 78] ;e := [b; 56] ;t := [b; 69]
Bước 3: min
Bước 4: x := c
Bước 5: D0 := D0\ {c} = {d;e;t};U := U\ {c} = {d;e;t};L := L ∪ {c := [b; 39]} = s := [s; 0] ;a := [s; 5] ;b := [s; 31] ;c := [s; 39] ;
Bước 6: D0 6= ∅. Ta phải quay lại bước 2. Lần lặp 4 Bước 2: d := [s; 78] ;e:= [b; 55] ;t:= [b; 69] Bước 3: min y∈U l(y) = l(ve) = 55 Bước 4: x := e Bước 5: D0 := D0\ {e} = {d;t};U := U\ {e} = {d;t};L := L ∪ {e:= [c; 55]} = s := [s; 0] ;a := [s; 5] ;b := [s; 31] ;c := [s; 39] ;e:= [c; 55] ;
Bước 6: D0 6= ∅. Ta phải quay lại bước 2. Lần lặp 5 Bước 2: d := [s; 78] ;t:= [b; 69] Bước 3: min y∈U l(y) = l(t) = 67 Bước 4: x := t Bước 5:D0 := D0\ {t} = {d};U := U\ {t} = {d};L := L∪ t := [e; 67] = s := [s; 0] ;a := [s; 5] ;b := [s; 31] ;c := [s; 39] ;e := [c; 55] ;t:= [e; 67] ;
Bước 6: D0 6= ∅. Ta phải quay lại bước 2. Lần lặp 6 Bước 2: d := [s; 77] Bước 3: min y∈U l(y) = l(d) = 77 Bước 4: x := d Bước 5: D0 := D0\ {d} = ∅;U := U\ {d} = ∅;L := L∪ d := [t; 77] = s := [s; 0] ;a := [s; 5] ;b := [s; 31] ;c := [s; 39] ;e := [c; 55] ;t:= [e; 67] ;d:= [t; 77] ;
Bước 6: D0 = ∅. Ta bắt đầu tìm đường có hướng có trọng số nhỏ nhất từ đỉnhS tới mỗi đỉnh thuộc tậpD = {d;e;t}dựa và giá trị nhận được của
biếnLsau lần lặp cuối cùng là:L := s := [s; 0]a := [s; 5] ;c := [b; 39] ;e := [c; 55] ;t := [e; 67] ;d := [t; 77] . Ta nhận đưuọc các đường sau:
d ←t ←e ← c ←b ← s: trọng lượng của đường bằng l(d) = 77
e ←c ← b ←s: trọng lượng của đường bằng l(e) = 55
Kết luận
Trong luận văn này, tác giả đã đặt ra và hoàn thành được một số kết quả như sau:
(i) Trình bày được bốn bài toán cơ bản của lý thuyết tổ hợp;
(ii) Trong mỗi bài toán đều đưa ra được những ứng dụng giải một số bài toán tổ hợp cụ thể;
(iii) Phân dạng có ví dụ và bài tập chi tiết đối với hai bài toán có ứng dụng trong toán sơ cấp là bài toán tồn tại và bài toán đếm;
Tài liệu tham khảo
[1] Nguyễn Văn Mậu (2008), Chuyên đề chọn lọc tổ hợp và toán rời rạc, NXB Giáo Dục.
[2] Nguyễn Văn Mậu (4/2012), Các chuyên đề toán bồi dưỡng học sinh giỏi , Kỷ yếu hội nghị khoa học, Hà Nội.
[3] Hoàng Chí Thành (2001), Giáo trình tổ hợp, NXB Đại học Quốc gia Hà Nội.
[4] Hoàng Chí Thành (2011), Lý thuyết đồ thị , NXB Đại học Quốc gia Hà Nội.
[5] Nguyễn Đức Nghĩa(2001), Toán học rời rạc, NXB Đại học Quốc gia Hà Nội.
[6] Ngô Đắc Tân(2004), Lý thuyết tổ hợp và đồ thị, NXB Đại học Quốc gia Hà Nội.
[7] Tạp chí toán học và tuổi trẻ, Tuyển tập 30 năm, NXB Giáo Dục, 1997. [8] Kenneth H Rosen, Toán học rời rạc ứng dụng trong tin học, NXB khoa
học và kĩ thuật, 1998. [9] Tài liệu từ Internet.