[r]
(1)BÀI 15
Chương Mạng vận tải
Khi điều hành hệ thống vận tải, mong muốn tìm phương án vận chuyển nhiều hàng hố Chương sách mơ hình hoá toán học hệ thống vận tải xây dựng thuật toán hữu hiệu
ra phương án tối ưu 9.1 Bài toán luồng lớn
Bài toán luồng lớn toán tối ưu Lý thuyết Đồ
thị, đề xuất vào đầu năm 1950 trở nên tiếng với thuật toán Ford - Fulkerson
9.1.1. Mạng vận tải
Định nghĩa 9.1: Mạng vận tải một đồ thị có hướng G = (V, E) khơng có đỉnh nút, đó:
1) có đỉnh x0 khơng có cạnh vào, F-1(x0) = ∅ (đỉnh phát), 2) có đỉnh z khơng có cạnh ra, F(z) = ∅ (đỉnh thu),
3) cạnh e gán số nguyên không âm c(e) gọi khả thông qua của cạnh
9.1.2 Luồng qua mạng
Với mạng G = (V, E), ta ký hiệu:
W-(x) = { (a, x) ∈ E ⏐ a ∈ V} - tập cạnh vào đỉnh x W+(x) = { (x, b) ∈ E ⏐ b ∈ V} - tập cạnh khỏi đỉnh x
Định nghĩa 9.2:
Hàm t : E → N gọi luồng qua mạng (G, c) nếu:
a) ∀ e ∈ E : t(e) ≤ c(e) - luồng cạnh không vượt khả thơng qua cạnh
b) ∀ x ≠ x0 z : t(W-(x)) = t(W+(x)) - luồng đỉnh phải cân Với tập B ⊆ V, ta ký hiệu:
W-(B) = { (a, b) ∈ E ⏐ a ∉ B, b ∈ B } - tập cạnh từ B vào B, W+(B) = { (a, b) ∈ E ⏐ a ∈ B, b ∉ B } - tập cạnh từ B khỏi B
(2)Hình 9.1 Tập cạnh vào tập đỉnh
Hiển nhiên, tập đỉnh B không chứa x0 z thì: t(W-(B)) = t(W+(B))
Thật vậy, theo tính chất b) luồng:
∑ ∑
∈ ∈
+ − =
B
t t B
x W t x
W
t( ( )) ( ( ))
Trong số cạnh kề với đỉnh x có đỉnh đầu đỉnh cuối nằm tập B có mặt hai vế đẳng thức lần, giản ước Sau giản ước, tổng vế trái lại cạnh mà đỉnh đầu B đỉnh cuối B, tức tập W-(B) Tương tự, tổng vế phải lại cạnh mà
đỉnh đầu B đỉnh cuối B, tức tập W+(B)
Hình 9.2 Các cạnh kề với tập đỉnh
Từ nhận xét trên, lấy B = V \ {x0, z} - G khơng có cạnh (x0, z) ta có:
W+(x0) = W-(B)
W-(z) = W+(B) - G có cạnh (x0, z) thì:
W+(x0) = W-(B) ∪ (x0, z) W-(z) = W+(B) ∪ (x0, z) Suy ra:
(3)Ký hiệu: tz = t(W+(x0)) (cộng thêm t(x0,z), nếu có) gọi giá trị luồng qua mạng G
9.1.3. Bài toán luồng lớn nhất
Bài toán: Cho mạng vận tải (G, c) Hãy tìm luồng t qua mạng cho tz đạt giá trị lớn
Để giải toán này, ta dùng thuật toán Ford - Fulkerson sau 9.1.4. Thuật tốn Ford - Fulkerson tìm luồng lớn nhất
Ta đánh số đỉnh mạng là: 0, 1, , n cho đỉnh x0 đỉnh n z Thuật toán 9.1 (Tìm luồng lớn nhất):
Ban đầu cho luồng t = cạnh Bước 1: Đánh dấu đỉnh mạng
Lần lượt đánh dấu cho đỉnh mạng sau: 1) Đỉnh x0 đánh dấu số
2) Nếu đỉnh x đánh dấu, có cạnh (x, y) với đỉnh cuối y chưa
đánh dấu t(x,y) < c(x,y) đánh dấu cho đỉnh y +x
3) Nếu đỉnh y đánh dấu, có cạnh (x, y) với đỉnh đầu x chưa
đánh dấu t(x,y) > đánh dấu đỉnh x -y
4) Nếu đỉnh thu z đánh dấu +k với k có nghĩa có
đường vơ hướng từ x0 đến z có dạng < x0 , i1 , i2 , , k , z >
Hình 9.3 Một đường vơ hướng từ đỉnh phát đến đỉnh thu
trên đỉnh đánh dấu +j -j Cụ thể là: d(x0) =
d(i1) = +0 d(i2) = ± i1
d(z) = +k
(4)Ta xây dựng luồng t' sau:
1) Nếu cạnh e không thuộc đường luồng giữ nguyên, t'(e) := t(e) 2) Nếu cạnh e thuộc đường chiều với chiều từ x0 tới z,
trên cạnh t(e) < c(e)) , ta đặt: t'(e) := t(e) +
3) Nếu cạnh e thuộc đường ngược chiều với chiều từ x0 tới z ,
đó cạnh t(u) > , ta đặt: t'(e) := t(e) -
Dễ thấy t' luồng và: t'z = tz + 1, nghĩa ta nâng luồng thêm
Lặp lại hai bước chừng cịn có thểđể cải tiến luồng t
Ta chứng minh rằng, thuật tốn kết thúc luồng cuối luồng lớn qua mạng Trước hết ta có:
Bổđề 9.2: Nếu t luồng qua mạng thì:
tz ≤ { c(W-(B))⏐B chứa z không chứa x0} Chứng minh:
Giả sử B tập đỉnh chứa z không chứa x0 Xét luồng t
Đặt: B1 = B \ {z} Thế thì, B = B1 ∪ {z} Vì tập B1 không chứa x0 z nên theo nhận xét trên, ta có: t(W-(B1)) = t(W+(B1))
W-(B) = {(a, b) ∈ E⏐a ∉ B, b ∈ B } = W-(B1) ∪ W1 đó: W1 = { (a, z) ∈ E ⏐ a ∉ B }
Hai tập W-(B1) W1 rời cho nên: t(W-(B)) = t(W-(B1)) + t(W1)
Vậy thì: t(W-(B1)) = t(W-(B)) - t(W1) (1)
Hình 9.4 Các tập cạnh vào B1 Mặt khác,
(5)Vì W2 ⊆ W+(B1) cho nên:
t(W+(B)) = t(W+(B1)) - t(W2)
Thế thì, t(W+(B1)) = t(W+(B)) + t(W2) (2) Từ (1) (2) suy ra:
t(W-(B)) - t(W1) = t(W+(B)) + t(W2) Vì W1 ∩ W2 = ∅ W1 ∪ W2 = W-(z) nên
t(W-(B)) - t(W+(B)) = t(W1) + t(W2) = tz Vậy với t luồng thì:
tz = t(W-(B)) - t(W+(B)) với tập B chứa z không chứa x0 Do đó:
tz ≤ t(W-(B)) ≤ c(W-(B))
Bổđềđược chứng minh
Tập cạnh W-(B) gọi thiết diện mạng Theo Bổ đề 9.2 giá trị luồng qua mạng không vượt khả thông qua thiết diện mạng
Ta trở lại chứng minh tính lớn luồng thuật tốn dừng
Định lý 9.3: Khi thuật toán Ford - Fulkerson dừng luồng cuối nhận luồng lớn với giá trị luồng qua mạng là:
tz = { c(W-(B)) ⏐ B chứa z không chứa x0} Chứng minh:
Khi thuật tốn dừng có nghĩa khơng đánh dấu đến đỉnh z Ký hiệu B tập đỉnh không đánh dấu
Tập B không chứa đỉnh x0 ta ln đánh dấu từ x0 Tập B chứa đỉnh z Theo Bổ đề 9.2 thì:
tz = t(W-(B)) - t(W+(B))
- Nếu cạnh (a, b) ∈ W-(B) a đánh dấu (vì a nằm ngồi B) b khơng
được đánh dấu (b thuộc B) Điều có nghĩa là: t((a,b)) = c((a,b))
- Nếu cạnh (a, b) ∈ W+(B) b đánh dấu (vì b nằm ngồi B), a không đánh dấu (a thuộc B) Do vậy, t((a,b)) =
(6)Tập cạnh W-(B) gọi thiết diện hẹp mạng Ví dụ 9.3: Xét mạng vận tải sau
Hình 9.5 Mạng vận tải luồng mạng
Luồng thời tz = 23 Ta nâng luồng lên Đánh dấu đỉnh mạng ta nhận đường vô hướng sau đây:
Hình 9.6 Nâng luồng thời