Trong quá trìnhthực hiện đề tài “Một số bài toán tối ưu trên đồ thị” em đã tham khảo một số tàiliệu được ghi trong phần "Tài liệu tham khảo".. 294.3 Thuật toán Ford-Fulkerson tìm luồng l
Trang 1KHOA TOÁN
ĐÀO THỊ HOÀI PHƯƠNG
MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ
KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC
Chuyên ngành: Toán ứng dụng
Hà Nội – Năm 2019
Trang 2KHOA TOÁN
ĐÀO THỊ HOÀI PHƯƠNG
MỘT SỐ BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ
KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC
Chuyên ngành: Toán ứng dụng
Người hướng dẫn khoa học
TS TRẦN VĨNH ĐỨC
Hà Nội – Năm 2019
Trang 3Em xin bày tỏ sự kính trọng và lời cảm ơn tới các thầy cô khoa Toán, Trường Đạihọc Sư phạm Hà Nội 2, các thầy cô trong tổ Ứng dụng cũng như các thầy cô tham giagiảng dạy đã tận tình truyền đạt những tri thức quý báu và tạo điều kiện thuận lợi để
em hoàn thành tốt chương trình học trong suốt 4 năm Đại học và thời gian thực hiệnkhóa luận
Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc tới TS Trần Vĩnh Đức - Giảng viênTrường Đại học Bách Khoa Hà Nội, người đã trực tiếp hướng dẫn, chỉ bảo tận tìnhgiúp đỡ để em có thể hoàn thành khóa luận này
Do thời gian, năng lực và điều kiện bản thân còn hạn chế nên bản khóa luận khôngthể tránh khỏi những sai sót Vì vậy, em rất mong nhận được những ý kiến góp ý quýbáu của các thầy cô và các bạn
Em xin chân thành cảm ơn
Hà Nội, tháng 05 năm 2019
Sinh viên
Đào Thị Hoài Phương
Trang 4Em xin cam đoan khóa luận này là kết quả của việc học tập, nghiên cứu độc lậpcủa bản thân dưới sự hướng dẫn của thầy giáo TS Trần Vĩnh Đức Trong quá trìnhthực hiện đề tài “Một số bài toán tối ưu trên đồ thị” em đã tham khảo một số tàiliệu được ghi trong phần "Tài liệu tham khảo" Nếu sai em xin chịu mọi trách nhiệm.
Hà Nội, tháng 05 năm 2019
Sinh Viên
Đào Thị Hoài Phương
Trang 5LỜI NÓI ĐẦU 1
1.1 Đồ thị có hướng 2
1.2 Đồ thị vô hướng 2
1.3 Đồ thị có trọng số 3
1.4 Đồ thị liên thông 4
1.4.1 Hành trình, đường, chu trình 4
1.4.2 Liên thông 5
1.4.3 Cây 6
1.5 Biểu diễn đồ thị bằng ma trận kề 7
1.6 Biểu diễn đồ thị bằng ma trận liên thuộc 8
1.7 Biểu diễn đồ thị có trọng số bằng các ma trận 9
2 BÀI TOÁN TÌM CÂY BAO TRÙM CÓ TRỌNG LƯỢNG NHỎ NHẤT 11 2.1 Bài toán 11
2.2 Thuật toán Kruskal 11
2.3 Thuật toán Prim 16
3 BÀI TOÁN TÌM ĐƯỜNG CÓ TRỌNG LƯỢNG NHỎ NHẤT 20 3.1 Bài toán 20
3.2 Thuật toán Dijkstra 20
3.3 Thuật toán Ford-Bellman 25
4 BÀI TOÁN TÌM LUỒNG LỚN NHẤT TRONG MẠNG VẬN TẢI 28 4.1 Mạng vận tải Luồng trong mạng vận tải 28
Trang 64.2 Bài toán 29
4.3 Thuật toán Ford-Fulkerson tìm luồng lớn nhất trong mạng vận tải nguyên 30 5 MỘT SỐ BÀI TOÁN KHÁC VỀ LUỒNG 35 5.1 Bài toán tìm luồng lớn nhất trong mạng vận tải đỉnh 35
5.1.1 Mạng vận tải đỉnh 35
5.1.2 Luồng trong mạng vận tải đỉnh 35
5.1.3 Lát cắt trong mạng vận tải đỉnh 36
5.1.4 Bài toán 36
5.2 Bài toán tìm luồng lớn nhất trong mạng vận tải đỉnh - cung 37
5.2.1 Mạng vận tải đỉnh - cung 37
5.2.2 Luồng trong mạng vận tải đỉnh - cung 37
5.2.3 Bài toán 37
5.3 Bài toán tìm luồng lớn nhất trong mạng vận tải có nhiều điểm phát và nhiều điểm thu 38
Trang 7LỜI NÓI ĐẦU
Các bài toán tối ưu trên đồ thị đã được ứng dụng rất nhiều vào các ngành khácnhau của khoa học và kỹ thuật Nhiều bài toán thực tế có thể được giải quyết bằngcách quy chúng về các bài toán tối ưu trên đồ thị Biểu diễn đồ thị cho ta cách nhìntrực quan giữa các quan hệ, ràng buộc của bài toán và từ đó giải quyết các bài toánbằng những công cụ tính toán Đề tài “Một số bài toán tối ưu trên đồ thị” nhằm tìmhiểu một số nội dung như: Bài toán tìm cây bao trùm có trọng lượng nhỏ nhất, Bàitoán tìm đường có trọng lượng nhỏ nhất, Bài toán tìm luồng lớn nhất trong mạng vậntải
Nội dung chính của khóa luận gồm có năm chương:
Chương 1: Chương này trình bày các khái niệm cơ bản của đồ thị và các cáchbiểu diễn đồ thị bằng mà trận
Chương 2: Chương này trình bày bài toán tìm cây bao trùm có trọng lượng nhỏnhất và hướng dẫn sử dụng thuật toán Kruskal và thuật toán P rim để giải bài toán.Chương 3: Nội dung chương này là trình bày bài toán tìm đường có trọng lượngnhỏ nhất và hướng dẫn sử dụng thuật toán Dijkstra và thuật toán F ord − Bellman
để giải bài toán
Chương 4: Chương này trình bày bài toán tìm luồng lớn nhất trong mạng vậntải và hướng dẫn sử dụng thuật toán F ord − F ulkerson để giải bài toán này
Chương 5: Chương này trình bày một số bài toán khác về luồng: tìm luồng lớnnhất trong mạng vận tải đỉnh, tìm luồng lớn nhất trong mạng vận tải đỉnh - cung, tìmluồng lớn nhất trong mạng vận tải có nhiều điểm phát và nhiều điểm thu
Trang 8MỘT SỐ KHÁI NIỆM CƠ BẢN
CỦA ĐỒ THỊ
Tất cả những đinh nghĩa sẽ dùng trong các chương sau
1.1 Đồ thị có hướng
Định nghĩa 1.1 (Đồ thị có hướng) Một đồ thị có hướng G là một cặp có thứ tự
G = (V, E), trong đó V là một tập và E là một tập con của tích đề các V × V Cácphần tử trong V được gọi là các đỉnh, các phần tử trong E được gọi là các cung trong
đồ thị có hướng G Ví dụ, nếu (a, b) ∈ E thì a, b được gọi là đỉnh còn ab được gọi làcung trong đồ thị có hướng G có đỉnh đầu là a, đỉnh cuối là b và có hướng đi từ a tới b.Giả sử G = (V, E) là một đồ thị có hướng Nếu (a, b) ∈ E thì các đỉnh a, b đượcgọi là liên thuộc với cung (ab) Cung có dạng (a, a) với a ∈ V được gọi là khuyên
Đồ thị có hướng được biểu diễn trên mặt phẳng bằng cách biểu diễn các đỉnh lànhững vòng tròn nhỏ còn các cung được biểu diễn bằng các đường nối đỉnh đầu vớiđỉnh cuối và có mũi tên hướng từ đỉnh đầu tới đỉnh cuối
Ví dụ 1.1 Cho G = (V, E) có V = {v1, v2, v3, v4, v5} và E = {(v1, v2), (v1, v3), (v3, v2),(v2, v3), (v4, v2), (v3, v4), (v3, v5), (v4, v5)} có đồ thị như hình 1.1
1.2 Đồ thị vô hướng
Định nghĩa 1.2 (Đồ thị có hướng) Một đồ thị vô hướng G là một cặp có thứ tự
G = (V, E), trong đó V là một tập và E là một tập với các phần tử là các đa tập lực
Trang 9Hình 1.1: Ví dụ một đồ thị có hướng
lượng 2 trên V Các phần tử trong V được gọi là các đỉnh, các phần tử trong E đượcgọi là các cạnh trong đồ thị vô hướng G Nếu e = {a, b} ∈ E thì a, b được gọi là đỉnhđầu mút của cạnh e Ta kí hiệu cạnh a, b là ab
Đồ thị vô hướng được biểu diễn trên mặt phẳng tương tự như đồ thị có hướng.Các đỉnh được biểu diễn là những vòng tròn nhỏ còn các cạnh được biểu diễn bằng cácđường nối hai đỉnh của cạnh Đồ thị vô hướng sẽ không có mũi tên chỉ hướng trên cácđường nối như đồ thị có hướng
Ví dụ 1.2 Cho G = (V, E) có V = {v1, v2, v3, v4, v5} và E = {(v1, v2), (v1, v3), (v3, v2),(v2, v3), (v4, v2), (v3, v4), (v3, v5), (v4, v5)} Khi đó, G có đồ thị như hình 1.2
Hình 1.2: Ví dụ một đồ thị vô hướng
1.3 Đồ thị có trọng số
Định nghĩa 1.3 (Đồ thị có trọng số) Một đồ thị G = (V, E) được gọi là đồ thị cótrọng số nếu ít nhất một trong hai hàm f : V −→ WV và g : E −→ WE được xác định.Trong đó, WV, WE là các tập mà các phần tử của chúng là các dữ liệu và mang một ý
Trang 10nghĩa định lượng nào đấy Giá trị của f (v) với v ∈ V được gọi là trọng lượng đỉnh củađỉnh v Giá trị của g(e) với e ∈ E được gọi là trọng lượng cung của cạnh e Tùy thuộcvào việc những hàm nào được xác định, người ta kí hiệu đồ thị có trọng lượng bằng:
G = (V, E, f ) hoặc G = (V, E, g) hoặc G = (V, E, f, g)
Ví dụ 1.3 Cho G = (V, E, g) có V = {v1, v2, v3, v4, v5}, E = {(v1, v2), (v1, v3), (v2, v3),(v3, v2), (v4, v2), (v3, v4), (v3, v5), (v4, v5)} và hàm g : E −→ N được xác định như sau:g(v1, v2) = 2,
i = 0, 1, , n, ei ∈ E với mọi i = 1, 2, , n và ei = (vi−1, vi) Khi đó, v0 được gọi
là đỉnh đầu, vn được gọi là đỉnh cuối và n là độ dài của hành trình có hướng trên.Tương tự, một hành trình vô hướng trong đồ thị vô hướng G = (V, E) là một dãy
v0e1v1e2 , envn trong đó vi ∈ V với mọi i = 0, 1, , n, ei ∈ E với mọi i = 1, 2, , n và
Trang 11ei = (vi−1, vi) hoặc ei = (vi, vi−1) Khi đó, v0 được gọi là đỉnh đầu, vn được gọi là đỉnhcuối và n là độ dài của hành trình vô hướng trên.
Một hành trình có hướng (hoặc vô hướng) được gọi là khép kín nếu đỉnh đầu vàđỉnh cuối của chúng trùng nhau
Định nghĩa 1.5 (Đường) Một hành trình có hướng (hoặc vô hướng) được gọi là mộtđường có hướng (hoặc vô hướng) nếu các đỉnh của chúng đều khác nhau
Định nghĩa 1.6 (Chu trình) Một hành trình khép kín được gọi là chu trình nếu nó
có độ dài không nhỏ hớn 3 và khi xóa đi đỉnh cuối thì trở thành đường
Ví dụ 1.4 Cho G = (V, E) có đồ thị như hình 1.4 Khi đó:
1) v1e1v2e2, v3e5v4 là một hành trình có hướng với đỉnh đầu là v1 và đỉnh cuối là v4
2) v1e1v2e4, v4e5v3 là một hành trình vô hướng với đỉnh đầu là v1 và đỉnh cuối là v3
Trang 12Trong trường hợp đồ thị không liên thông, nó sẽ tạo thành những đồ thị con liênthông đôi một không có đỉnh chung Những đồ thị con liên thông như vậy được gọi lànhững thành phần liên thông.
Ví dụ 1.5 Đồ thị G = (V, E) trong Hình 1.5 là đồ thị không liên thông có 2 thànhphần liên thông là G1 = (V1, E1) và G2 = (V2, E2)
Trang 141.6 Biểu diễn đồ thị bằng ma trận liên thuộc
Định nghĩa 1.10 (Ma trận liên thuộc của đồ thị) Giả sử G = (V, E) là một đồthị có hướng với V = {v1, v2, , vn} và E = {e1, e2, , em} Ta luôn xác định được matrận:
1, nếu vi là đỉnh đầu của ej
−1, nếu vi là cuối nhưng không là đỉnh đầu của ej
0, nếu vi không liên thuộc với ejKhi đó, ma trận B được gọi là ma trận liên thuộc của đồ thị G
Ví dụ 1.8 Cho đồ thị G = (V, E) có V = {v1, v2, v3, v4, v5} và E = {e1, e2, e3, e4, e5, e6,
e7} có đồ thị như sau:
Hình 1.8: Đồ thị có hướng của ví dụ 1.8
Trang 15Ma trận liên thuộc của G là:
Định nghĩa 1.12 (Ma trận trọng lượng đỉnh) Giả sử G = (V, E, f ) là một đồ thị
có hướng với V = {v1, v2, , vn} và f : V −→ WV là hàm trọng lượng đỉnh của G Khi
Trang 17BÀI TOÁN TÌM CÂY BAO TRÙM
Ví dụ 2.1 Khi xây dựng hệ thống đường bộ qua 63 tỉnh, thành phố trong nước Người
ta tính toán được chi phí cho mỗi cung đường từ 2 thành phố bất kỳ Bài toán đặt ra
là tìm tuyến đường đi qua tất cả các tỉnh, thành phố mà chi phí xây dựng là nhỏ nhất
2.2 Thuật toán Kruskal
Thuật toán: Giả sử G = (V, E, w) là đồ thị có trọng số vô hướng liên thông có hàmtrọng lượng cạnh w : E → R, đồ thị con T = (V0, E0)
Bước 1: Khởi tạo: V0 := V, E0 := ∅ Mỗi thành phần liên thông của đồ thị T khi
Trang 18khởi tạo chỉ bao gồm một đỉnh, ta kí hiệu tập các thành phần liên thông của T là C.Khi đó, C := {{x}|x ∈ V }
Bước 2: Sắp xếp các cạnh của G theo thứ tự trọng lượng không giảm
Bước 3: Lấy cạnh đầu tiên ra khỏi dãy, kí hiệu là cạnh e = xy và xét:
Nếu hai đỉnh đầu mút x và y của e thuộc hai thành phần liên thông C1, C2 khácnhau của T thì S := S\{e}, E0 := E0∪ {e}, w(T ) := w(T ) + w(e) và ta nhập C1 và C2thành một thành phần liên thông của T Ngược lại, nếu hai đỉnh đầu mút x và y của
e không thuộc hai thành phần liên thông khác nhau của T thì S := S\{e}, E0 := E0
và các thành phần liên thông của T không đổi
Nếu E0 ∪ {e} chứa chu trình thì bỏ qua
Bước 4: Nếu T còn là đồ thị không liên thông (|E0| < |V | − 1) thì ta quay lạibước 3 Ngược lại, nếu T là đồ thị liên thông (|E0| = |V | − 1) thì dừng thuật toán và
đồ thị T khi đó chính là cây bao trùm có trọng lượng nhỏ nhất của đồ thị G
Định lý 2.1 Với mọi đồ thị có trọng số vô hướng liên thông G = (V, E, w) có hàmtrọng lượng cạnh w : E → R, thuật toán Kruskal luôn tìm được một cây bao trùm cótrọng lượng nhỏ nhất của G
Ví dụ 2.2 Cho đồ thị có trọng lượng G = (V, E, w) được biểu diễn như Hình 2.1.Hãy tìm cây bao trùm có trọng lượng nhỏ nhất của G
Trang 19T := (V0, E0),
C := {{s}, {a}, {b}, {c}, {d}, {e}, {f }, {g}, {h}, {k}, {t}}
Bước 2: Sắp xếp các cạnh của đồ thị G theo thứ tự trọng lượng không giảm
S := {ab, bc, ef, kt, hk, ed, sb, sa, sc, be, bd, ad, bf, f h, dh, gt, eh, cf, gh, dg, f k}
Lần lặp 1Bước 3: Lấy cạnh đầu tiên ab ra khỏi dãy và xét Vì ab có các đỉnh đầu mút a và
b thuộc các thành phần liên thông khác nhau của T nên:
S := S\{ab} = {bc, ef, kt, hk, ed, sb, sa, sc, be, bd, ad, bf, f h, dh, gt, eh, cf, gh, dg, f k},
E0 := E0 ∪ {ab} = {ab},
C := {{s}, {a, b}, {c}, {d}, {e}, {f }, {g}, {h}, {k}, {t}}
Bước 4: T là đồ thị không liên thông, quay lại bước 3
Lần lặp 2Bước 3: Lấy cạnh đầu tiên bc ra khỏi dãy và xét Vì bc có các đỉnh đầu mút b và
c thuộc các thành phần liên thông khác nhau của T nên:
S := S\{bc} = {ef, kt, hk, ed, sb, sa, sc, be, bd, ad, bf, f h, dh, gt, eh, cf, gh, dg, f k},
E0 := E0 ∪ {bc} = {bc},
C := {{s}, {a, b, c}, {d}, {e}, {f }, {g}, {h}, {k}, {t}}
Bước 4: T là đồ thị không liên thông, ta quay lại bước 3
Lần lặp 3Bước 3: Lấy cạnh đầu tiên ef ra khỏi dãy và xét Vì ef có các đỉnh đầu mút e
và f thuộc các thành phần liên thông khác nhau của T nên:
S := S\{ef } = {kt, hk, ed, sb, sa, sc, be, bd, ad, bf, f h, dh, gt, eh, cf, gh, dg, f k},
h thuộc các thành phần liên thông khác nhau của T nên:
Trang 210
{ab, bc, ef, kt, hk, ed, sb,
sa, sc, be, bd, ad, bf, f h,
dh, gt, eh, cf, gh, dg, f k}
∅
{{s}, {a}, {b}, {c}, {d},{e}, {f }, {g}, {h}, {k}, {t}}
6 {sb, sa, sc } {ab, bc, ef, kt,
hk, ed}
{{s}, {a, b, c, d, e, f }, {g},{h, k, t}}
7 {sa, sc, be } {ab, bc, ef, kt,
hk, ed, sb}
{{s, a, b, c, d, e, f }, {g},{h, k, t}}
Trang 222.3 Thuật toán Prim
Thuật toán: Giả sử G = (V, E, w) là đồ thị có trọng số vô hướng liên thông có hàmtrọng lượng cạnh w : E → R Ta định nghĩa nhãn của đỉnh v là bộ [v, α(v)] với v ∈ V ,a(v) ∈ R
Bước 1: Khởi tạo:
Bước 3: Tìm đỉnh vi sao cho α(vi) đạt giá trị nhỏ nhất
Bước 4: Gán x := vi (nếu tìm được nhiều đỉnh vi thỏa mãn ở bước 3 thì có thểlấy một đỉnh tùy ý trong số những đỉnh vừa tìm được)
Bước 5: Gán E0 := E0∪ {xv}; U := \{x}
Bước 6: Nếu U 6= ∅ thì quay lại Bước 2 Ngược lại, nếu U = ∅ thì dừng thuậttoán và đồ thị T khi đó chính là cây bao trùm có trọng lượng nhỏ nhất của đồ thịG
Định lý 2.2 Với mọi đồ thị có trọng lượng vô hướng liên thông G = (V, E, w) có
w : E → R là hàm trọng lượng cạnh, thuật toán Prim luôn tìm được một cây bao trùm
Trang 23Lần lặp 1Bước 2: Gán:
a := [s, 3], b := [s, 4], c := [s, 4], d := [s, ∞], e := [s, ∞], f := [s, ∞], g :=[s, ∞], h := [s, ∞], k := [s, ∞], t := [s, ∞]
Bước 3: Với mọi y ∈ U Ta có: minα(y) = min(a) = 3
Bước 4: Gán: x := a
Bước 5: Gán: E0 := E0∪ {as} = {as}; U := \{a} = {b, c, d, e, f, g, h, k, t}
Bước 6: U 6= ∅, ta quay lại Bước 2
Lần lặp 2Bước 2: Gán:
b := [a, 2], c := [s, 4], d := [b, 6], e := [b, ∞], f := [b, ∞], g := [s, ∞], h :=[s, ∞], k := [s, ∞], t := [s, ∞]
Bước 3: Với mọi y ∈ U Ta có: minα(y) = min(b) = 2
Bước 4: Gán: x := b
Bước 5: Gán: E0 := E0∪ {ab} = {bs, ab}; U := \{b} = {c, d, e, f, g, h, k, t}.Bước 6: U 6= ∅, ta quay lại Bước 2
Lần lặp 3Bước 2: Gán:
Lần lặp 4Bước 2: Gán:
Trang 24Bước 6: U 6= ∅, ta quay lại Bước 2.
Tiếp tục thực hiện thuật toán tới lần lặp cuối cùng:
Lần lặp 10Bước 2: Gán: g := [t, 6]
Bước 3: Với mọi y ∈ U Ta có: minα(y) = min(t) = 6
Các lần lặp của thuật toán Prim được thực hiện trong bảng trên với các hàng
là các lần lặp và các cột là tên các biến chứa nhãn của các đỉnh thuộc V \{s} Nhãncủa đỉnh y ở lần lặp i sẽ được ghi tại giao của hàng i và cột y Từ lần lặp 1, mỗi hàng
sẽ có một ô được có giá trị w(y) nhỏ nhất sẽ được đánh dấu * Các lần lặp sau đónhãn của y sẽ không thể thay đổi được và ta ký hiệu là dấu gạch ngang Khi ta thựchiện tới lần lặp mà chỉ còn một nhãn được đánh dấu và các nhãn khác được đánh dấubằng dấu gạch ngang thì ta dừng thuật toán Cây bao trùm có trọng lượng nhỏ nhất
Trang 25T = (V0, E0) được xác định như sau: V0 = V và E0 là tập hợp tất cả các cạnh có dạng
xy với x là đỉnh được gán nhãn và y là đỉnh mà tại đó nhãn của x được đánh dấu *