Ý nghĩa của đề tài Về mặt khoa học, trên cơ sở nghiên cứu lý thuyết bài toán luồng cực đại và các phương pháp giải bài toán luồng cực đại với chi phí cực tiểu, luận văn xây dựng được ch
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM
Đà Nẵng - Năm 2018
Trang 2TRƯỜNG ĐẠI HỌC SƯ PHẠM
Trang 4MỤC LỤC
LỜI CAM ĐOAN i
TÓM TẮT ĐỀ TÀI TIẾNG VIỆT iv
TÓM TẮT ĐỀ TÀI TIẾNG ANH v
DANH MỤC CÁC TỪ VIẾT TẮT vi
DANH MỤC CÁC BẢNG vii
DANH MỤC CÁC HÌNH viii
MỞ ĐẦU 1
1 Lý do chọn đề tài 1
2 Mục tiêu và nhiệm vụ 1
3 Đối tượng và phạm vi nghiên cứu 2
4 Phương pháp nghiên cứu 2
5 Ý nghĩa của đề tài 3
6 Bố cục của đề tài 3
CHƯƠNG 1 BÀI TOÁN LUỒNG CỰC ĐẠI 4
1.1 Phát biểu bài toán 4
1.1.1 Mạng, Luồng trong mạng 4
1.1.2 Bài toán luồng cực đại trong mạng 4
1.2 Thuật toán Ford-Fulkerson 5
1.2.1 Đường đi tăng luồng 5
1.2.2 Phương pháp FordFulkerson 6
CHƯƠNG 2 BÀI TOÁN LUỒNG CỰC ĐẠI VỚI CHI PHÍ CỰC TIỂU 17
2.1 Giới thiệu 17
2.1.1 Phát biểu bài toán 17
2.1.2 Các giả thiết 18
2.1.3 Đồ thi thăng dư 18
2.2 Điều kiện tối ưu của bài toán 18
2.2.1 Điều kiện tối ưu về chu trình âm 18
2.2.2 Điều kiện tối ưu về chi phí rút gọn 19
2.2.3 Điều kiện tối ưu bổ sung 20
2.3 Mối quan hệ giữa luồng tối ưu và khả năng thông qua tại các đỉnh 21
2.4 Một số thuật toán giải bài toán luồng cực đại với chi phí cực tiểu 22
2.4.1 Thuật toán khử chu trình âm (Cycle canceling) 22
2.4.2 Thuật toán tìm đường đi ngắn nhất liên tiếp (Successive shortest Path) 27
2.4.3 Thuật toán Primal-Dual 30
Trang 52.4.4 Các thuật toán cải tiến 33
CHƯƠNG 3 XÂY DỰNG ỨNG DỤNG 37
3.1 Yêu cầu thực tế và lí do xây dựng ứng dụng 37
3.2 Mục tiêu của ứng dụng 37
3.3 Tiếp cận bài toán 37
3.3.1 Phát biểu bài toán 37
3.3.2 Mô hình toán học 39
3.3.3 Thuật toán 40
3.4 Phân tích 42
3.4.1 Yêu cầu chức năng 42
3.4.2 Mô hình Use – Case 43
3.4.3 Biểu đồ tuần tự (Sequence Diagram) 50
3.4.4 Cơ sở dữ liệu (Database) 55
3.5 Thiết kế và đặc tả giao diện 56
3.5.1 Giao diện “Trang chủ” 56
3.5.2 Giao diện “Menu trái” 58
3.5.3 Giao diện “Danh sách địa điểm” 59
3.5.4 Giao diện “Thông tin địa điểm” 61
3.5.5 Giao diện “Cập nhật địa điểm” 62
3.5.6 Giao diện “Thêm địa điểm” 64
3.5.7 Giao diện “Hiển thị kết quả” 65
3.6 Đánh giá kết quả 67
KẾT LUẬN 68
DANH MỤC TÀI LIỆU THAM KHẢO 69 QUYẾT ĐỊNH GIAO ĐỀ TÀI (Bản sao)
Trang 8DANH MỤC CÁC CHỮ VIẾT TẮT
Từ viết tắt Ý nghĩa
Trang 9DANH MỤC CÁC BẢNG
Trang 10DANH MỤC CÁC HÌNH
Trang 11bài toán lập lịch cho hội nghị …
Với sự xuất hiện ngày càng nhiều của các hệ thống mạng như: hệ thống mạng điện, mạng sản xuất và phân phối hàng hóa, mạng giao thông và phổ biến nhất hiện nay là mạng internet đã làm nảy sinh ra nhu cầu vận chuyển các chất liệu trên các mạng này sao cho đạt hiệu quả cao nhất; chất liệu ở đây có thể là dòng điện, dữ liệu, hàng hóa hiệu quả ở đây có thể xét theo tiêu chuẩn về thời gian, độ dài quãng đường, chi phí tiền bạc, mức độ an toàn và bài toán luồng cực đại trên mạng ngày càng khẳng định được tính quan trọng của nó trong các ngành khoa học hiện đại Sự phát triển mạnh mẽ của ngành công nghệ thông tin cùng với khả năng tính toán rất nhanh của máy tính đã giúp việc giải quyết bài toán luồng cực đại trên mạng hiệu quả hơn và
đem lại nhiều ứng dụng thực tiễn hơn
Việt Nam là một những nước chịu ảnh hưởng lớn nhất của hiện tượng biến đổi khí hậu trong hai thập kỷ trở lại đây Ở nước ta, mỗi năm thiên tai cướp đi mạng sống của 466 người, thiệt hại trên 1.5 tỷ USD tương đương 1.5% GDP Trong đó tần suất xuất hiện cao nhất phải nói đến là bão lũ, ngập úng (Nguồn: Báo cáo cùa Ban chỉ đạo Phòng chống lụt bão Trung ương) Một vài trận bão lụt lớn trong thời gian gần đây có thể kể đến như trận lụt ơ Quảng Ninh (30/7/2015), bão Nari (15/10/2013), bão Wutip (30/9/2013), trận lụt lớn ở miền Trung (10/2011) Nhằm giảm nhẹ thiệt hại về người
và của do bão lũ gây ra thì công tác phòng chống và cứu hộ được đặc biệt chú trọng Trong đó, vận chuyển hàng cứu trợ cho người dân là một trong những công việc phải được thực hiện một cách nhanh chóng và hiệu quả Chính vì vậy, tôi quyết định chọn
đề tài “Bài toán luồng cực đại với chi phí cực tiểu và ứng dụng trong vận chuyển hàng
cứu trợ bão lũ” làm đề tài tốt nghiệp luận văn cao học
2 Mục tiêu và nhiệm vụ
2.1 Mục tiêu
- Nắm được các thuật toán giải bài toán luồng cực đại với chi phí cực tiểu
Trang 12- Xây dựng thành công chương trình hỗ trợ công tác vận chuyển hàng cứu trợ cho
người dân các vùng lũ lụt
2.2 Nhiệm vụ
Về lý thuyết:
- Tìm hiểu lý thuyết bài toán luồng cực đại và một số bài toán ứng dụng của bài
toán luồng cực đại
- Nghiên cứu kỹ các thuật toán trên bài toán luồng cực đại với chi phí cực tiểu
- Nắm được quy trình cài đặt thuật toán, xây dựng ứng dụng cho smartphone
Về thực tiễn:
- Tìm ra được phương án vận chuyển hàng cứu trợ cho người dân các vùng lũ lụt
hiệu quả và tốn ít chi phí nhất
- Xây dựng chương trình máy tính thực hiện được chức năng trên
3 Đối tượng và phạm vi nghiên cứu
3.1 Đối tượng nghiên cứu
- Bài toán luồng cực đại với chi phí cực tiểu
- Các ngôn ngữ lập trình: Html, Css, JavaScript, C#, Google Maps SDK, Google
- Chỉ nghiên cứu và phát triển ứng dụng tại tỉnh Quảng Bình
4 Phương pháp nghiên cứu
Về phương pháp nghiên cứu, tôi sử dụng hai phương pháp chính là nghiên cứu lý
thuyết và nghiên cứu thực nghiệm
4.1 Phương pháp nghiên cứu lý thuyết
- Nghiên cứu các tài liệu về cơ sở lý thuyết: Bài toán luồng cực đại với chi phí
cực tiểu
- Các tài liệu cài đặt một số dạng bài toán luồng cực đại
- Các tài liệu liên quan đến một số nghiên cứu
- Các tài liệu về quy trình xây dựng, phát triển phần mềm ứng dụng
Trang 13- Các tài liệu về thực trạng công tác cứu trợ người dân các vùng lũ lụt
4.2 Phương pháp nghiên cứu thực nghiệm
Sử dụng phương pháp nghiên cứu lý thuyết kết hợp với nghiên cứu thực nghiệm:
- Cài đặt các thuật toán cho bài toán
- Viết chương trình cho bài toán ứng dụng cụ thể
- Chạy thử nghiệm, lưu trữ kết quả đạt được và đánh giá lại kết quả
5 Ý nghĩa của đề tài
Về mặt khoa học, trên cơ sở nghiên cứu lý thuyết bài toán luồng cực đại và các phương pháp giải bài toán luồng cực đại với chi phí cực tiểu, luận văn xây dựng được
chương trình hỗ trợ công tác vận chuyển hàng cứu trợ cho người dân các vùng lũ lụt
Về mặt thực tiễn: Với việc xây dựng thành công chương trình, công tác vận chuyển hàng cứu trợ khi có bão lũ xẩy ra sẽ được tiến hành một cách nhanh chóng, nâng cao hiệu quả và tiết kiệm được chi phí vận chuyển cho từng chuyến hàng
6 Bố cục của đề tài
Ngoài phần mở đầu và kết luận Toàn bộ nội dung của luận văn được chia làm 3 chương sau:
Chương 1: Bài toán luồng cực đại
Chương 2: Bài toán luồng cực đại với chi phí cực tiểu
Chương 3: Xây dựng ứng dụng
Trang 14CHƯƠNG 1 BÀI TOÁN LUỒNG CỰC ĐẠI
1.1 Phát biểu bài toán
Định nghĩa 2 Giả sử cho mạng G = (V,E) Ta gọi luồng f trong mạng G = (V,E)
là ánh xạ f: E R+ gán cho mỗi cung e =(v,w) E một số thực không âm f(e) = f(v,w), gọi là luông trên cung e, thoả mãn các điều kiện sau:
1 Luồng trên mỗi cung e E không vượt quá khả năng thông qua của nó:
0 ≤ f (e) ≤ c(e),
2 Điều kiện cân bằng luồng trên mỗi đỉnh của mạng: Tổng luồng trên các cung
đi vào đỉnh v bằng tổng luồng trên các cung đi ra khỏi đỉnh v, nếu v ≠ s,t:
3 Giá trị của luồng f là số
1.1.2 Bài toán luồng cực đại trong mạng
1.1.2.1 Phát biểu bài toán luồng cực đại
Trong thực tế ta thường gặp bài toán gọi là bài toán tìm luồng cực đại như sau:
Cho mạng G với nguồn a, đích z và khả năng thông qua cij, (i,j)G Trong số các luồng trên mạng G tìm luồng có giá trị lớn nhất
Bài toán luồng cực đại có thể biểu diễn như bài toán quy hoạch tuyến tính
v(f) =
G i a ai
f
) , (
G a i ia
f
) , (
Trang 150 fij cij (i,j)G
G k i ik
f
) , (
G j k kj
f
) , (
k V \ {a; z}
G i a ai
c
) , (
và tồn tại luồng {fij = 0, (i,j)G}, nên, theo lý thuyết quy hoạch tuyến tính, tồn tại luồng cực đại
1.1.2.2 Luồng cực đại và lát cắt cực tiểu
Định nghĩa: Ta gọi lát cắt (X, X*) là một cách phân hoạch tập đỉnh V của mạng
ra thành 2 tập X và X* = V\X, trong đó s X và t X* Khả năng thông qua của lát cắt (X, X*) là số
*) , (
X u
X v
u v c X
X c
Lát cắt mà khả năng thông qua nhỏ nhất gọi là lát cắt hẹp nhất
Giá trị của mọi luồng f trong mạng luôn nhỏ hơn hoặc bằng khả năng thông qua của lát cắt (X, X*) bất kỳ trong nó:
1.2 Thuật toán Ford-Fulkerson
1.2.1 Đường đi tăng luồng
Với mọi cung (u,v) E, nếu f(u,v) > 0 thì (v,u) Ef với khả năng thông qua
cf(v,u) = f(u,v)
Với mọi cung (u,v) E, nếu c(u,v) f(u,v) > 0 thì (u,v) Ef với khả năng thông qua cf(u,v) = c(u,v) f(u,v)
gọi là đường đi tăng luồng
Trang 16Giả sử
P = (a, u, , i, j, , v, z) là đường đi tăng luồng từ a đến z
1.2.2 Phương pháp FordFulkerson
Phương pháp này được Ford và Fulkerson đưa ra năm 1962 Ý tưởng xây dựng luồng cực đại như sau: xuất phát từ luồng nào đó, ta tìm đường đi tăng luồng từ a đến z cho phép hiệu chỉnh giá trị luồng trên đường đi đó sao cho luồng mới có giá trị lớn hơn Nếu không tìm được đường đi như vậy thì ta có luồng cực đại
Sau đây là mô tả thuật toán tổng quát Thuật toán này có thể cải tiến để tăng hiệu năng
(i,j)G
Các đỉnh trong G được sắp xếp theo thứ tự nào đó
Đầu ra Luồng cực đại F = (f ij), (i,j)G
S : = { a }, S’ :=
2 Sinh nhãn
2.1 Chọn đỉnh sinh nhãn
chưa có nhãn và kề đỉnh sinh nhãn u
Qua bước 2.2
Trang 17 Trường hợp S = và S’ : Gán S := S’ và S’ := Quay lại bước 2.1
2.2 Gán nhãn cho đỉnh chưa có nhãn và kề đỉnh sinh nhãn
A, A:= A \ { t } Gán nhãn cho t như sau:
Nếu (u,t)E và fu,t < cu,t , đặt nhãn đỉnh t là ( u, min{, cu,t fu,t}) Nếu (t, u)E và ft,u > 0, đặt nhãn đỉnh t là (u, min{, ft,u})
Nếu t không được gán nhãn thì quay lại bước 2.2
Nếu t được gán nhãn và t = z thì sang bước 3
quay lại bước 2.2
3 Hiệu chỉnh tăng luồng
3.1 Khởi tạo
j := z, i := q 3.2 Hiệu chỉnh
Nếu cung (i, j) G, thì hiệu chỉnh fij = fij + Nếu cung (j, i) G, thì hiệu chỉnh fji = fji 3.3 Tịnh tiến
Nếu i = a thì xoá tất cả nhãn của các đỉnh trên mạng, trừ đỉnh nguồn a, và quay lại bước 2
Nếu i a, thì đặt j := i và i := p, với p là thành phần thứ nhất của nhãn đỉnh j Sau đó quay lại bước 3.2
Đoạn chương trình sau minh họa thuật toán Ford-Fulekerson bằng NNLT Pascal, trong đó sử dụng tìm kiếm sâu DFS để tìm một đường tăng luồng trên đồ thị tăng luồng
Procedure Findpath(u:integer);{tìm đường tăng luồng trên G f }
Trang 19until v = s;
End;
Trong đó:
luồng sẽ sử dụng là thuật toán tìm kiếm theo chiều sâu (DFS)
Trang 20Sử dụng thuật toán Ford-Fulkerson để tìm luồng cực đại và lát cắt nhỏ nhất
1 Bước 1: Khởi tạo luồng f =0
2 Bước 2:
Đồ thị tăng luồng Gf của G:
- ΔP = min( 5,6,6) = 6
- Tăng luồng dọc theo P thu được luồng mới f = 5:
Trang 22 Chọn đường tăng luồng P = (1,3,4,2,5,6), tăng luồng dọc theo đường này:
Bước 3: Luồng cực đại
Luồng cực đại có giá trị là 9, lát cắt cực tiểu (X,Y) với X={1,3}, Y={2,4,5,6}
Trang 23Định lý về tính nguyên: “Nếu tất cả các khả năng thông qua là số nguyên thì
thuật toán trên luôn tìm được luồng cực đại với luồng trên cung là các số nguyên Gọi e số cạnh của đồ thị, n là số đỉnh => e = E, n =V
Thuật toán Ford Fulkerson có độ phức tạp là O(e) ở mỗi lần thực hiện, nhưng số lần lặp không chính xác, xấp xỉ giá trị luồng cực đại f, tức là thuật toán này có độ phức tạp là một hàm đa thức, vì vậy, chúng ta cần đến một thuật toán mà thời gian thực hiện không phụ thuộc chút nào vào C Xét cho cùng, các thuật toán tìm đường đi
thuật toán này chỉ phụ thuộc các tham số e và n Một thuật toán như thế gọi là “phụ thuộc đa thức mạnh” (strongly polynomial)
* Dùng thuật toán Ford-Fulkersons:
Bước 1: Khởi tạo luồng f=0:
3
Trang 24Bước 2: Tăng luồng:
Trang 26+ Tăng luồng dọc theo P thu được luồng mới f = 14:
- Đồ thị tăng luồng:
Đến đây không còn đường đi cơ bản nào trên đồ thị tăng luồng nên kết thúc bước 2
Lát cắt cực tiểu (X,Y) với X= {1,2,3,5}, Y={4,6}
Trang 27CHƯƠNG 2 BÀI TOÁN LUỒNG CỰC ĐẠI VỚI CHI PHÍ CỰC TIỂU
2.1 Giới thiệu
2.1.1 Phát biểu bài toán
Trong thực tế ta thường phải giải quyết bài toán: trong các luồng cực đại tìm luồng có chi phí nhỏ nhất, trong đó chi phí là tổng chi phí thực hiện luồng trên tất cả các cung
Định nghĩa Mạng chi phí cung G = (V,E,p,c) là mạng (V,E,c) với p ij là đơn giá chi phí luồng trên cung (i j), i,j V
Chi phí luồng của luồng f ij trên cung (i,j) là tích fij.pij
Chi phí của luồng f trên mạng G là tổng chi phí luồng của tất cả các cung
E j i
ij
f
) , (
.
Giả thiết: Khả năng thông qua của các cung nguyên dương và không lớn hơn
hằng số M và đơn giá chi phí của các cung nguyên dương và không lớn hơn hằng số
C
Ví dụ:
Hình 2.1 Ví dụ mạng vận tải
pij, cịj
Trang 28Bài toán luồng cực đại với chi phí cực tiểu có thể được phát biểu như sau:
Cực tiểu hóa
(f) ( )
( ) ( ) ( , )
chi phí cực tiểu có một giải pháp khả thi
4) Chúng ta giả sử rằng đồ thị G chứa một đường đi có hướng không có giới hạn (nghĩa là tất cả các cung trên đường đi có độ thông qua vô hạn) giữa mọi cặp đỉnh 5) Chi phí của tất cả các cung là không âm
2.1.3 Đồ thi thăng dư
Cho luồng f trên mạng chi phí cung G=(V,E,c,p) Ta định nghĩa mạng thặng dư,
giá chi phí pf như sau:
Với mọi cung (u,v) E, nếu f(u,v) > 0 thì (v,u) Ef với khả năng thông qua
cf(v,u) = f(u,v) và pf(v,u) = p(u,v)
Với mọi cung (u,v) E, nếu c(u,v) f(u,v) > 0 thì (u,v) Ef với khả năng thông qua cf(u,v) = c(u,v) f(u,v) và pf(u,v) = p(u,v)
2.2 Điều kiện tối ưu của bài toán
2.2.1 Điều kiện tối ưu về chu trình âm
Định lý 2.1: Các điều kiện tối ưu về chu trình âm
Một giải pháp khả thi f* là một giải pháp tối ưu của bài toán luồng với chi phí cực tiểu khi và chỉ khi thỏa mãn các điều kiện tối ưu về chu trình âm: Đồ thị thặng dư
Trang 29G(f*) không chứa chu trình (có hướng) có chi phí âm
Đây là định lý quan trọng giúp chúng ta tiếp cận bài toán luồng cực đại với chi phí cực tiểu bằng thuật toán khử chu trình âm
2.2.2 Điều kiện tối ưu về chi phí rút gọn
Chúng ta có thể viết điều kiện tối ưu về đường đi ngắn nhất theo chi phí dưới dạng tương đương như sau:
0
d
lưu ý một điều, với những nhãn khoảng cách tối ưu, mọi cung trong đồ thị có chi phí
nhất từ đỉnh nguồn s tới các đỉnh khác thì đường đi ngắn nhất chỉ sử dụng các cung có chi phí rút gọn bằng 0 Do đó, khi chúng ta biết các khoảng cách tối ưu, bài toán sẽ dễ dàng được giải quyết: Chúng ta chỉ cần tìm một đường đi từ đỉnh s đến mọi đỉnh khác
mà chỉ dùng các cung có chi phí rút gọn bằng 0
chi phí rút gọn của cung (i, j) là pij pij i j Các cung với chi phí rút gọn này thích hợp với đồ thị thặng dư cũng như đồ thị gốc Chúng ta định nghĩa chi phí rút gọn trong đồ thị thặng dư cũng giống như chúng ta định nghĩa chi phí nhưng sử dụng
ij
p thay vì pij
Từ phân tích trên chúng ta có tính chất như sau:
(1) Với bất kỳ đường đi có hướng Z nào từ đỉnh k tới đỉnh l thì
Trang 30một giá trị không đổi k l Tính chất này cũng cho thấy nếu W là một chu trình
chúng ta có thể thay thế các điều kiện tối ưu về chu trình âm bằng các điều kiện chi phí rút gọn cho các cung
Định lý 2.2: Các điều kiện tối ưu với chi phí rút gọn
Một lời giải khả thi f* là một lời giải tối ưu của bài toán luồng với chi phí cực
chi phí rút gọn sau:
ij
p > 0 với mọi cung (i, j) trong G(f*)
Trong định lý trên chúng ta đã mô tả một luồng tối ưu f là một luồng thỏa mãn
đó Cùng cách đó, chúng ta có thể định nghĩa “các khả năng tối ưu của đỉnh” là tập
với luồng khả thi f nào đó
2.2.3 Điều kiện tối ưu bổ sung
Định lý 2.1 và định lý 2.2 giúp chúng ta phát hiện tính tối ưu của các lời giải của bài toán luồng với chi phí cực tiểu bằng cách công thức hóa các điều kiện trên các đồ thị thặng dư, bây giờ chúng ta sẽ phát biểu lại các điều kiện này trên các đồ thị gốc
Định lý 2.3: Các điều kiện tối ưu bổ sung
Một lời giải khả thi f* là một lời giải tối ưu cho bài toán luồng với chi phí cực
gọn và giá trị của luồng thỏa mãn các điều kiện tối ưu bổ sung sau đối với mọi cung (i, j) E:
Nếu pij > 0 thì fij* = 0
Nếu 0 < fij* < cij thì pij = 0
Nếu pij< 0 thì fij* = cij
Chứng minh: Chúng ta sẽ chỉ ra rằng các điều kiện tối ưu về chi phí rút gọn
tương đương với các điều kiện trên Trước hết chúng ta chứng minh rằng nếu các khả
phải thỏa mãn các điều kiện trên
Trang 31Xét 3 trường hợp cho mọi cung (i, j) E:
Trường hợp 1: Nếu pij > 0, đồ thị thặng dư không thể chứa cung (i, j) vì
p p < 0, mâu thuẫn với điều kiện thứ nhất, vì vậy fij* = 0
Trường hợp 2: Nếu 0 < fij* < cij, đồ thị thặng dư chứa cả cung (i, j) và cung (j, i)
p pnên từ các bất đẳng thức trên suy ra pji pij 0
Trường hợp 3: Nếu pij < 0, đồ thị thặng dư không thể chứa cung (i, j) vì pij <
0, mâu thuẫn với điều kiện thứ 3, vì vậy fij* cij
2.3 Mối quan hệ giữa luồng tối ưu và khả năng thông qua tại các đỉnh
Xuất phát từ giả thiết từ luồng tối ưu, làm cách nào để có được các khả năng (của đỉnh) tối ưu và ngược lại, từ các khả năng tối ưu làm thế nào để có được một luồng tối
ưu Giải quyết bài toán trên bằng cách giải bài toán đường đi ngắn nhất hoặc bài toán luồng cực đại, các kết quả chỉ ra mối quan hệ đáng chú ý giữa bài toán luồng với chi phí cực tiểu và các bài toán luồng cực đại, đường đi ngắn nhất Chúng ta chứng minh 2 giả thiết sau:
(1) Nếu cho trước một luồng tối ưu f*, ta có thể đạt được các khả năng tối ưu bằng cách giải một bài toán đường đi ngắn nhất (với các cung có thể âm): Gọi G(f*) là
đồ thị thặng dư với luồng f* Rõ ràng G(f*) không chứa chu trình có chi phí âm nào, nếu ngược lại thì mâu thuẫn với tính tối ưu của lời giải f* Gọi d là đường đi ngắn nhất
cung Khoảng cách d được định nghĩa tốt bởi vì đồ thị thặng dư không chứa chu trình
âm Các điều kiện tối ưu về đường đi ngắn nhất cho ta:
dj < di +pij với mọi (i, j) trong G(f*)
Đặt = -d, ta có:
0
đỉnh
một lời giải tối ưu f* bằng cách giải một bài toán luồng cực đại Trước tiên chúng ta
Trang 32ta sẽ phân loại mỗi cung (i, j) theo một trong các cách sau và sử dụng các cách phân loại này để định nghĩa một bài toán luồng cực đại
Trường hợp 1: pij > 0
dàng buộc này bằng cách đặt fij* = 0 và xóa cung (i, j) khỏi đồ thị
Trường hợp 2: pij < 0
này bằng cách đặt fij*= cij và xóa cung (i, j) khỏi đồ thị Bởi vì chúng ta gửi fij đơn vị luồng trên cung (i, j), chúng ta phải giảm đi một lượng fij và tăng bj một lượng fij Trường hợp 3: pij= 0
Trong trường hợp này chúng ta cho phép luồng trên cung (i, j) nhận bất kỳ giá trị nào giữa 0 và cij
Gọi G’ = (V, E’) là đồ thị kết quả và b’ là khả năng cung/cầu được bổ sung của các đỉnh Bây giờ bài toán trở thành tìm một luồng khả thi trong đồ thị G’ thỏa mãn khả năng cung/cầu được bổ sung của các đỉnh Chúng ta có thể tìm một luồng như thế bằng cách giải bài toán luồng cực đại được định nghĩa như sau: Chúng ta đưa vào một
có độ thông qua bi, với mỗi đỉnh i có b’i < 0 chúng ta thêm một cung (i, t) có độ thông
biến đổi để đạt được một luồng cực đại f* Lời giải fij* cho ( , ) i j E là một luồng tối ưu cho bài toán luồng với chi phí cực tiểu trong G
2.4 Một số thuật toán giải bài toán luồng cực đại với chi phí cực tiểu
2.4.1 Thuật toán khử chu trình âm (Cycle canceling)
2.4.1.1 Tư tưởng thuật toán
Điều kiện tối ưu về chu trình âm cho ta tiếp cận bài toán luồng với chi phí cực tiểu theo hướng đơn giản bằng cách tìm và khử chu trình âm trên đồ thị thặng dư cho tới khi đạt được điều kiện tối ưu là đồ thị không còn chu trình âm, gọi là thuật toán khử chu trình âm
Tư tưởng của thuật toán: Thuật toán khử chu trình âm xuất phát từ một phương
án khả thi và cải thiện hàm tối ưu của phương án đó
Trang 332.4.1.2 Mô tả thuật toán
Xuất phát từ một luồng khả thi f trên đồ thị, ở mỗi một bước lặp ta tìm một chu trình có chi phí âm và tăng luồng trên chu trình này, khi đồ thị không còn chu trình âm thì bài toán kết thúc với một luồng tối ưu tìm được Thuật toán khử chu trình âm có một kết quả phụ là định lý sau đây:
Định lý 2.4: Tính chất nguyên
Nếu tất cả các độ thông qua của cung và khả năng cung/cầu của các đỉnh là số nguyên thì bài toàn luồng với chi phí cực tiểu luôn có một luồng với chi phí nhỏ nhất
là số nguyên
2.4.1.3 Các bước thực hiện thuật toán
1 Tìm luồng cực đại ban đầu
2 Điều kiện dừng: Nếu không có chu trình chi phí âm trong mạng thặng dư thì dừng Luồng cực đại có chi phí cực tiểu
3 Chọn chu trình chi phí âm trong mạng thặng dư Tăng tối đa luồng trên chu trình âm
Quay lại bước 2
Giả code:
begin
Tìm một luồng khả thi x trong đồ thị;
while (đồ thị thặng dư G(f) chứa một chu trình âm) do
Để tìm luồng cực đại ban đầu ta có thể sử dụng thuật toán bất kỳ thuộc nhóm đường đi tăng luồng Để tìm chu trình chi phí âm ta có thể sử dụng thuật toán sau:
Trang 34*Thuật toán Floyd-Warshall tìm chu trình âm
Đây là thuật giải tìm đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng có trọng số Tuy nhiên ta cũng có thể sử dụng thuật giải này tìm chu trình âm
cung (i,j)
+ Đầu ra Ma trận D=[d(i,j)]
Nếu trên đường chéo có trị âm d(k,k) < 0, thì tồn tại chu trình âm qua đỉnh k Nếu trên đường chéo không có trị âm, thì 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)
Ma trận P=[p(i,j)] dùng để xác định chu trình âm hoặc đường đi ngắn nhất
+ Phương pháp
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) (đặc biệt nếu không có khuyên tại i thì d0(i,i) = +)
Ngược lại tăng k lên 1 đơn vị (k:=k+1) và sang (3)
(3) Tính ma trận Dk và Pk theo Dk 1 và Pk 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)
và
pk(i,j) := pk 1(i,k), ngược lại đặt
dk(i,j) := dk 1(i,j)
Trang 35và
pk(i,j) := pk -1(i,j) Quay lại bước (2)
- Phương pháp xác định chu trình âm qua đỉnh i : Giả sử d(i,i) < 0 Chu trình âm
qua đỉnh i gồm dãy các đỉnh
i , i1 , i2 , i3 , , ik , ik+1 , , im , i thỏa mãn
i1 = p(i,i) , i2 = p(i1,i) , , ik+1 = p(ik,i) , , p(im,i) = i
thuật toán Belmann-Ford tìm chu trình âm có độ phức tạp O(|V|.|E|)
*Thuật toán Bellman-Ford tìm chu trình âm
Thuật toán Bellman-Ford tìm đường đi ngắn nhất trong trọng đồ có trọng số âm, nếu không có chu trình âm Nếu đồ thị có chu trình âm thì có thể xác định chu trình âm bằng thuật toán này
+ Đầu vào Đồ thị có hướng G=(V,E), V= {1, 2, , n}, có trọng số với mọi
<xuất phát từ đỉnh u thực hiện thuật toán tìm cây phủ
TK, trong đó mỗi đỉnh v thuộc cây TK được gán tplt[v]:=K>
Trang 36Hình 2.2 Minh họa thuật toán khử chu trình âm
Chúng ta dùng ví dụ trên hình vẽ 2-6(a) để minh họa thuật toán khử chu trình âm (Chúng ta vi phạm giả thiết 4) để dễ khảo sát đồ thị hơn) Hình vẽ 2-6(a) mô tả một luồng khả thi trong đồ thị và hình vẽ 2-6(b) là đồ thị thặng dư tương ứng Giả sử thuật toán chọn chu trình 4-2-3-4 có chi phí là -1 trước tiên Khả năng thông qua thặng dư của chu trình này là 2 Thuật toán tăng 2 đơn vị luồng theo chu trình này Hình vẽ 2-
a Đồ thị có luồng khả thi f b Đồ thị thặng dư G(f)
c Đồ thị thặng dư sau khi tăng 2 đơn
vị luồng theo chu trình 4-2-3-4
d Đồ thị thặng dư sau khi tăng 1 đơn
vị luồng theo chu trình 4-2-1-3-4
pij,cij pij,rij
fịj
p ij ,r ij
Trang 376(c) vẽ đồ thị thặng dư bổ sung Trong vòng lặp kế tiếp, giả sử thuật toán chọn chu trình 4-2-1-3-4 có chi phí -2 Thuật toán gửi 1 đơn vị luồng theo chu trình này Hình
vẽ 2-6(d) mô tả đồ thị thặng dư cập nhật Vì đồ thị thặng dư không chứa chu trình âm nào nữa nên thuật toán kết thúc
2.4.1.4 Độ phức tạp thuật toán
Trong bài toán luồng với chi phí cực tiểu, mPC là cận trên của chi phí luồng ban đầu (vì pij < P và fij < C với ( , ) i j E ) và -mPC là cận dưới của chi phí luồng tối
ưu (do pij> -P và fij < C với ( , ) i j E) Mỗi vòng lặp của thuật toán khử chu trình
âm thay đổi giá trị hàm mục tiêu một lượng s là một giá trị âm
Chúng ta giả sử tất cả dữ liệu của bài toán là số nguyên, thuật toán sẽ kết thúc
2.4.2 Thuật toán tìm đường đi ngắn nhất liên tiếp (Successive shortest Path)
2.4.2.1 Tư tưởng thuật toán
Thuật toán tìm đường đi ngắn nhất liên tiếp xuất phát từ một giả thiết tối ưu và duy trì điều kiện tối ưu của giả thiết đó
2.4.2.2 Mô tả thuật toán
Để mô tả thuật toán này, trước hết chúng ta tìm hiểu khái niệm luồng giả Một
thông qua, nó không cần thỏa mãn các ràng buộc cân bằng khối lượng Với mọi luồng giả f, ta định nghĩa độ mất cân bằng của đỉnh i như sau:
Nếu ei > 0 với đỉnh i nào đó, ta nói ei là mức vượt quá của đỉnh i Nếu ei <0, ta
và D là các tập hợp các đỉnh vượt quá và thiếu hụt trong đồ thị
Trang 38định nghĩa đồ thị thặng dư cho một luồng
Bổ đề 2.2: Giả sử một luồng giả (hoặc một luồng) x thỏa mãn các điều kiện tối
ưu về chi phí rút gọn đối với các khả năng (của đỉnh) nào đó Gọi vector d là
khoảng cách đường đi ngắn nhất từ đỉnh s đến tất cả các đỉnh khác trong đồ thị thặng
dư G(f) với pij là độ dài của cung (i, j), ta có các tính chất sau:
(1) Luồng giả f cũng thỏa mãn các điều kiện tối ưu về chi phí rút gọn đối với các khả năng của đỉnh rút gọn ' = - d
đỉnh s đến mọi đỉnh khác
Bổ đề 2.3: Giả sử một luồng giả (hoặc một luồng) x thỏa mãn các điều kiện tối
ưu về chi phí rút gọn và ta đạt được f’ từ f bằng cách gửi luồng theo một đường đi ngắn nhất từ đỉnh s đến một số đỉnh k khác thì f’ cũng thỏa mãn các điều kiện tối ưu về chi phí rút gọn
Trong thuật toán tìm đường đi ngắn nhất liên tiếp, khả năng của các đỉnh đóng vai trò rất quan trọng, chúng ta dùng chúng để giữ cho độ dài các cung không âm giúp giải quyết bài toán đường đi ngắn nhất một cách hiệu quả
Thuật toán tìm đường đi ngắn nhất liên tiếp được mô tả như sau:
Xuất phát từ một luồng tối ưu giả f = 0 trên đồ thị, khi đó ta phải vi phạm ràng buộc cân bằng khối lượng tại các đỉnh, ở mỗi một bước lặp ta tìm một chu trình ngắn nhất từ nguồn đến đích và tăng đơn vị vận chuyển trên chu trình này, khi các điều kiện
về cân bằng khối lượng thỏa mãn bài toán kết thúc với một luồng tối ưu tìm được
2.4.2.3 Các bước thực hiện thuật toán
Trang 39P biểu thị đường đi ngắn nhất từ đỉnh k đến đỉnh l;
Cập nhật : = - d; := min[ek, -el, min{rij:(i, j) P}];
Cập nhật f, G(f), E, D và các chi phí rút gọn;
end;
end;
Chứng minh tính đúng đắn của thuật toán: Để khởi tạo chúng ta đặt x = 0 là một
thỏa mãn các điều kiện tối ưu về chi phí rút gọn vì pij = pij > 0 với mọi cung (i, j) trong đồ thị G(f) thì chi phí của tất cả các cung là không âm.Ta quan sát thấy khi vẫn còn đỉnh có độ mất cân bằng khác 0 thì cả E và D phải khác NULL vì tổng các độ vượt quá bằng tổng các mức thiếu hụt Vì vậy cho đến khi tất cả các đỉnh đều cân bằng thì thuật toán luồng có thể xác định một đỉnh vượt quá k và một đỉnh thiếu l Giả thiết 4 chỉ ra rằng đồ thị thặng dư chứa một đường đi có hướng từ đỉnh k đến mọi đỉnh khác bao gồm cả đỉnh l Do đó khoảng cách đường đi ngắn nhất d được định nghĩa tốt
Ví dụ minh họa
pịj,cij
a Đồ thị thặng dư ban đầu với x = 0 và 𝜋 = 0
Trang 40Hình 2.3 Minh họa thuật toán đường đi ngắn nhất liên tiếp 2.4.2.4 Độ phức tạp thuật toán
Mỗi vòng lặp của thuật toán giải một bài toán đường đi ngắn nhất với chiều dài cung không âm và giảm độ vượt quá của một số đỉnh (đồng thời cũng giảm mức thiếu hụt của một số đỉnh) Do đó, nếu C là cận trên của khả năng cung lớn nhất của các đỉnh, thuật toán sẽ kết thúc sau nhiều nhất nC vòng lặp Nếu S(n, m, P) là thời gian cần thiết để giải bài toán đường đi ngắn nhất với độ dài cung không âm thì độ phức tạp tổng cộng của thuật toán này là O(nCS(n, m, nP)) Chú ý rằng chúng ta dùng nP thay
vì P trong biểu thức này vì chi phí trong đồ thị thặng dư bị chặn bởi nP
2.4.3 Thuật toán Primal-Dual
2.4.3.1 Tư tưởng thuật toán
Tư tưởng thuật toán: Thuật toán Primal-Dual cho bài toán luồng với chi phí cực