MỤC LỤC
LỜI CẢM ƠN . 1
MỤC LỤC . 2
MỞ ĐẦU . 4
CHƯƠNG 1. TỐI ƯU RỜI RẠC VÀ MỘT SỐHƯỚNG TIẾP CẬN . 6
1.1. BÀI TOÁN TỐI ƯU .6
1.1.1. Dạng tổng quát của bài toán tối ưu .6
1.1.2. Phân loại các bài toán tối ưu .7
1.2. CÁC PHƯƠNG PHÁP CHÍNH TRONG TỐI ƯU RỜI RẠC .8
1.2.1. Phương pháp cắt Gomory .9
1.2.2. Phương pháp nhánh cận Land – Doig .13
1.3. BÀI TOÁN LUỒNG TRÊN MẠNG.15
1.3.1. Luồng trên mạng .15
1.3.2. Phân loại các thuật toán luồng trên mạng .16
1.3.3. Thuật toán tìm luồng cực đại trong mạng .17
1.4. ĐỘPHỨC TẠP CỦA CÁC BÀI TOÁN TỐI ƯU RỜI RẠC .20
CHƯƠNG 2. THUẬT TOÁN ĐA THỨC GIẢI BÀI TOÁN LẬP LỊCH . 22
2.1. BÀI TOÁN LẬP LỊCH .22
2.1.1. Mô hình toán học của bài toán lập lịch .22
2.1.2. Một sốbài toán lập lịch .23
2.1.3. Tính chất nghiệm của bài toán (P) .24
2.2. THUẬT TOÁN ĐA THỨC GIẢI BÀI TOÁN (P) .27
2.3. THUẬT TOÁN ĐA THỨC DẠNG BẢNG GIẢI BÀI TOÁN (P) .33
2.3.1. Cơsởphương pháp giải .33
2.3.2. Thuật toán.36
2.3.3. Độphức tạp của thuật toán.40
2.3.4. Ví dụminh họa .41
2.3.5. Cài đặt và thửnghiệm trên máy tính .46
CHƯƠNG 3. ỨNG DỤNG BÀI TOÁN LẬP LỊCH VÀO THỰC TẾ . 49
3.1. WEBSITE ĐĂNG KÝ MÔN HỌC TỰCHỌN .49
3.1.1. Giới thiệu.49
3.1.2. Mô hình ứng dụng .50
3.2. XÂY DỰNG WEBSITE.52
3.2.1. Các thành phần chính xây dựng website .52
3.2.2. Sơ đồchức năng .53
3.2.3. Tổchức chương trình .54
3.2.4. Cài đặt thuật toán .55
3.3. MỘT SỐKẾT QUẢTHỬNGHIỆM .59
3.3.1. Môi trường thửnghiệm .59
3.3.2. Giao diện website .59
3.3.3. Một sốthửnghiệm khác .62
CHƯƠNG 4. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN . 65
TÀI LIỆU THAM KHẢO . 67
PHỤLỤC . 68
16 trang |
Chia sẻ: maiphuongdc | Lượt xem: 3964 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Luận văn Ứng dụng lý thuyết tối ưu giải bài toán lập lịch, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
6
CHƯƠNG 1.
3BTỐI ƯU RỜI RẠC VÀ MỘT SỐ HƯỚNG TIẾP CẬN
1.1. 8B ÀI TOÁN TỐI ƯU
Tối ưu hóa là một ngành toán học ứng dụng, đã và đang được nhiều người
quan tâm nghiên cứu, tìm hiểu và ứng dụng vào thực tiễn. Bài toán tối ưu là kết quả
của việc mô hình hóa những vấn đề nảy sinh từ thực tế, chúng có thể được diễn đạt
dưới dạng toán học là tìm các biến số thỏa mãn những điều kiện nhất định và làm
cho một hàm số cho trước đạt giá trị cực tiểu hay cực đại.
1.1.1. 18BDạng tổng quát của bài toán tối ưu
Tìm vectơ 1( ,... ,..., )k nx x x x= thỏa mãn:
f(x) Æ min(max) (1.1)
với điều kiện
≤( ) 0ig x , i = 1, 2, ..., p (1.2)
( ) 0jh x = , j = 1, 2, ..., q (1.3)
x ∈ X ⊂ RPnP, k = 1, 2, …, n (1.4)
Trong đó f, gRiR, hRjR (i = 1, 2, …, p; j = 1, 2, …, q) là các hàm số cho trước của n
biến số (f, gRiR, hRjR: R Pn P Æ R) và X ⊂ RPnP là tập đóng, thường có dạng
X = +
nR ≡ {x ∈ RPnP : xRjR ≥ 0, j = 1, 2, …, n}
Bài toán (1.1) – (1.4) có tên gọi là bài toán quy hoạch toán học. Hàm f(x)
được gọi là hàm mục tiêu, còn gRiR(x) và hRjR(x) là các hàm ràng buộc và ràng buộc
dạng xRjR ≥ 0, j = 1, 2, …, n, được gọi là các ràng buộc về dấu. Tập hợp:
D = { x ∈ X: ≤( ) 0ig x , i = 1, 2, ..., p; ( ) 0jh x = , j = 1, 2, ..., q},
7
gọi là miền ràng buộc hoặc miền chấp nhận được. Mỗi véctơ x ∈ D được gọi là một
phương án hoặc một lời giải chấp nhận được của bài toán. Phương án làm cho hàm
số f(x) đạt giá trị cực tiểu hoặc cực đại được gọi là phương án tối ưu hoặc lời giải
của bài toán.
1.1.2. 19BPhân loại các bài toán tối ưu
Các bài toán tối ưu nói chung rất phong phú và đa dạng. Để tìm lời giải cho
các bài toán này, có thể có một cách chung và đơn giản nhất là duyệt toàn bộ các
phương án có thể có của bài toán đặt ra để chọn phương án tối ưu. Song do số
phương án của các bài toán dạng này thường là một số rất lớn, thậm chí không đếm
được, nên cách làm này không phải bao giờ cũng thực hiện được, ngay cả khi kích
thước của bài toán không lớn lắm. Vì thế cần phải có những nghiên cứu về mặt lý
thuyết để tách ra những lớp bài toán riêng, khai thác cấu trúc đặc thù của nó để đề ra
phương pháp giải thích hợp. Sau đây là một số lớp bài toán tối ưu thường gặp:
- Quy hoạch tuyến tính: Khi hàm mục tiêu f(x) và tất cả các hàm ràng buộc
gRiR(x), hRjR(x) là tuyến tính, tập X là tập lồi đa diện (giao của một số hữu hạn các nửa
không gian đóng).
- Quy hoạch tham số: Khi các hệ số trong biểu thức của hàm mục tiêu và của
các ràng buộc phụ thuộc tham số.
- Quy hoạch phi tuyến: Khi hàm mục tiêu f(x) hoặc tồn tại ít nhất một trong
các hàm ràng buộc gRiR(x), hRjR(x) không phải là tuyến tính, hoặc tập X khác tập lồi
đa diện.
- Quy hoạch lồi: Khi hàm mục tiêu f(x) là hàm lồi (nếu xét bài toán tìm cực
tiểu) và miền ràng buộc D là tập hợp lồi.
- Quy hoạch lõm: Khi hàm mục tiêu f(x) là hàm lõm (nếu xét bài toán tìm cực
tiểu) và miền ràng buộc D là tập hợp lồi.
- Tối ưu rời rạc: Khi X là tập rời rạc. Các bài toán tối ưu rời rạc thường xuất
hiện khi nghiên cứu các quá trình hay đối tượng rời rạc. Trong trường hợp riêng khi
8
các biến chỉ nhận giá trị nguyên ta có quy hoạch nguyên. Một trường hợp riêng của
quy hoạch nguyên là quy hoạch Boole, khi mà các biến số chỉ nhận giá trị 0 hoặc 1.
Có thể chứng minh rằng: mọi bài toán tối ưu rời rạc đều có thể đưa về bài
toán quy hoạch Boole. Thật vậy, giả sử biến số x chỉ có thể lấy một trong các giá trị
cho trước aR1R, aR2R, …, aRkR. Khi đó bằng cách đặt:
x = aR1RuR1R + aR2RuR2R + … + aRkRuRk R,
uR1R + uR2R + …+ uRkR = 1, uRj R∈ {0, 1}, j = 1, 2, …, k
thì biến rời rạc x có thể thay thế bởi một số biến uRjR chỉ nhận giá trị 0 hay 1, gọi tắt là
biến 0-1 hay biến Boole.
Tương tự, nếu x ∈ {0, 1, …, k} thì ta có thể viết:
x = uR1R + uR2R + …+ uRkR với uRj R∈ {0, 1}, j = 1, 2, …, k
nghĩa là bất kỳ bài toán với các biến nguyên bị chặn tùy ý, đều có thể quy về bài
toán với các biến 0-1. Điều này cho thấy bài toán quy hoạch nguyên 0-1 giữ vai trò
quan trọng trong tối ưu rời rạc.
1.2. 9BCÁC PHƯƠNG PHÁP CHÍNH TRONG TỐI ƯU RỜI RẠC
Tối ưu rời rạc hay còn gọi là tối ưu tổ hợp là một lĩnh vực quan trọng trong
lý thuyết tối ưu hóa. Các bài toán tối ưu nói chung và các bài toán tối ưu tổ hợp nói
riêng rất phong phú và đa dạng. Chúng có nhiều ứng dụng rộng rãi trong thực tiễn.
Sau đây là một số công cụ thường dùng trong tối ưu tổ hợp. Đó là các
phương pháp cắt nổi tiếng của Gomory và phương pháp “nhánh và cận” rất có hiệu
quả với nhiều biến dạng khác nhau cho các bài toán cụ thể: phương pháp quy hoạch
động, phương pháp tìm kiếm ngẫu nhiên…
9
1.2.1. 20BPhương pháp cắt Gomory
Xét bài toán quy hoạch tuyến tính có thêm điều kiện nguyên, gọi là bài toán
quy hoạch nguyên tuyến tính.
0
1
n
j j
j
x c x
=
= ∑ → min
với các ràng buộc:
∑
=
n
j
jij xa
1
= bRiR , i = 1, 2, ..., m;
xRjR ≥ 0, j = 1, 2, ..., n;
xRjR nguyên, j = 1, 2, ..., nR1R ≤ n
Nếu nR1R = n ta có bài toán quy hoạch nguyên hoàn toàn, còn nếu nR1R < n thì có
bài toán quy hoạch nguyên bộ phận.
Gomory là người đầu tiên đưa ra các thuật toán cắt giải quy hoạch nguyên
tuyến tính. Ý đại thể của phương pháp Gomory như sau: giải quy hoạch tuyến tính
không có điều kiện nguyên, nếu bài toán này không có lời giải thì bài toán nguyên
cũng không có lời giải. Nếu bài toán có lời giải và lời giải đó thỏa điều kiện nguyên
thì đó là lời giải của bài toán nguyên, còn nếu lời giải đó không nguyên thì ta sẽ
thêm vào một ràng buộc tuyến tính mới, cắt bỏ lời giải không nguyên này và vẫn
giữ lại các điểm nguyên của miền ràng buộc. Ràng buộc thêm vào như thế gọi là
siêu phẳng cắt hay lát cắt. Rồi lại giải quy hoạch tuyến tính tương ứng (không có
điều kiện nguyên)... Với những điều kiện nhất định, quá trình trên sẽ dẫn đến lời
giải nguyên sau một số hữu hạn bước lặp.
Để áp dụng được phương pháp Gomory, cần có các giả thiết sau đây:
a) Hàm mục tiêu 0x bị chặn dưới (đối với bài toán min) trên miền ràng
buộc không có điều kiện nguyên.
10
b) Tập phương án tối ưu (lời giải) của bài toán tuyến tính không có điều
kiện nguyên nếu khác rỗng thì phải bị chặn.
c) 0x đòi hỏi phải nguyên (chẳng hạn, mọi cRjR nguyên).
d) Có một trong hai điều kiện sau:
- Hàm mục tiêu xR0R bị chặn trên miền ràng buộc không có
điều kiện nguyên.
- Bài toán có phương án (điểm) nguyên.
Tóm lại, các điều kiện trên sẽ được thỏa mãn nếu miền ràng buộc (không kể
điều kiện nguyên) là bị chặn và các hệ số aRijR, bRiR, cRjR đều nguyên.
Có ba cách khác nhau thể hiện ý tưởng phương pháp giải nêu trên.
1.2.1.1. 42BThuật giải Gomory 1
Thuật toán này áp dụng cho bài toán quy hoạch nguyên hoàn toàn (nR1R = n).
Nội dung thuật toán như sau: Áp dụng phương pháp đơn hình đối ngẫu từ
vựng giải quy hoạch tuyến tính không có điều kiện nguyên, nếu bài toán không giải
được thì bài toán nguyên cũng không giải được. Nếu bài toán giải được và lời giải
thỏa mãn điều kiện nguyên thì lời giải đó đồng thời là lời giải cần tìm (quá trình giải
kết thúc). Nếu lời giải đó không nguyên, ta chuyển sang bước lặp k = 0.
Bước k ≥ 0. Giả sử ta đã có lời giải xPkP không nguyên. Ký hiệu NRkR là tập chỉ số
các biến phi (ngoài) cơ sở. Biểu diến hàm mục tiêu 0x = cP
T
Px và các biến xR1R, xR2R, ...,
xRnR qua các biến phi cơ sở xRjR ( j ∈ NRkR):
xRiR = 0
k
k k
i ij j
j N
x x x
∈
− ∑ , i = 0, 1, 2, ..., n
và bảng các hệ số TRkR = kijx là l-chuẩn, nghĩa là ở mỗi cột j ∈ NRkR ∪ {0} phần tử
khác không đầu tiên phải là số dương.
11
Chọn dòng có chỉ số nhỏ nhất mà kix 0 không nguyên:
t = min {i ∈ {0, 1, 2, ..., n} | ktx 0 không nguyên}
và xây dựng siêu phẳng cắt tương ứng:
xRn+k+1R = ( )0{ } { }
k
k k
t ij j
j N
x x x
∈
− − −∑
xRn+k+1R ≥ 0 và nguyên.
([x] : phần nguyên của x, {x} = x – [x] : phần lẻ của x)
Thêm dòng xRn+k+1R vào phía dưới bảng TRkR và được bảng đơn hình không chấp
nhận được (chỉ ở dòng xRn+k+1R!). Áp dụng phương pháp đơn hình đối ngẫu từ vựng,
nếu kết quả ta nhận được bảng đơn hình ứng với bài toán quy hoạch tuyến tính
không giải được thì bài toán quy hoạch nguyên cũng không giải được, nếu trái lại
kiểm tra tính nguyên của lời giải thu được. Nếu điều kiện nguyên được thỏa mãn thì
đó là lời giải cần tìm, nếu trái lại ta chuyển sang bước lặp k + 1.
Nếu có các giải thiết như đã nêu trên thì thuật toán Gomory 1 kết thúc sau
một số hữu hạn bước lặp k.
1.2.1.2. 43BThuật toán Gomory 2
Áp dụng cho bài toán quy hoạch nguyên bộ phận (nR1R ≤ n).
Về cơ bản, thuật toán Gomory 2 giống như thuật toán Gomory 1, chỉ khác ở
cách xây dựng siêu phẳng cắt. Nhờ thuật toán Gomory 2 (trong trường hợp nR1R = n)
cũng có thể giải bài toán quy hoạch nguyên hoàn toàn. Nhưng trong trường hợp này
không có cơ sở để so sánh hiệu quả của thuật toán Gomory 1 và 2 với nhau.
Cách xây dựng siêu phẳng cắt trong thuật toán Gomory 2 như sau:
Giả sử ktx 0 không nguyên. Khi đó bất đẳng thức:
12
z = 00 ≥+− ∑
∈ kNj
jj xss là siêu phẳng cắt.
Ở đây, sR0R = )( 0ktx và sRjR =
⎪⎪
⎪⎪
⎪⎪
⎩
⎪⎪
⎪⎪
⎪⎪
⎨
⎧
<+≥−−
≥+≥
>≤−−
≤≤
0,1)(
}{1
}{
0,1
}{}{,}){1(
}{1
}{
}{}{,}{
1
0
0
1
01
0
0
01
k
ij
k
ijk
t
k
t
k
ij
k
ij
k
t
k
ij
k
ijk
t
k
t
k
t
k
ij
k
ij
xnjx
x
x
xnjx
xxnjx
x
x
xxnjx
Các điều kiện bảo đảm tính hữu hạn của thuật toán Gomory 2 hoàn toàn
giống như các điều kiện của thuật toán Gomory 1.
1.2.1.3. 44BThuật toán Gomory 3
Áp dụng cho bài toán quy hoạch nguyên hoàn toàn (nR1R = n). Thuật toán 3 có
ưu điểm là không bị ảnh hưởng bởi sai số làm tròn trong quá trình tính toán.
Ý tưởng của thuật toán này như sau: xuất phát từ bảng nguyên, l-chuẩn (phần
tử khác không đầu tiên của của mỗi cột là số dương) và không chấp nhận được (cột
phương án còn có thành phần âm). Xây dựng ràng buộc mới sao cho dùng nó làm
dòng quay với phần tử quay (còn gọi là phần tử chính) bằng -1, rồi biến đổi bảng
đơn hình,... cho đến khi nào bảng là chấp nhận được thì ta có lời giải cần tìm.
Cách xây dựng ràng buộc mới - siêu phẳng cắt – là như sau:
Cho bảng nguyên, l-chuẩn và không chấp nhận được
T = ijx , i = 0, 1, ..., n; j ∈ {0} ∪ NRk
Giả sử t (1 ≤ t ≤ n) là chỉ số sao cho xRt0R < 0. Khi đó z = −1 + ∑
<
∈
≥
0
0
tj
k
x
Nj
jx
là siêu phẳng cắt. Ta có thể chọn siêu phẳng cắt tốt hơn, nhưng khá phức tạp.
13
1.2.2. 21BPhương pháp nhánh cận Land – Doig
Xét bài toán quy hoạch nguyên tuyến tính sau đây
∑
=
n
j
jj xc
1
→ min (1.5)
với các điều kiện:
∑
=
n
j
jij xa
1
= bRiR, i = 1, 2, ..., m (1.6)
0 ≤ xRj R≤ uRjR, j = 1, 2, ..., n (1.7)
xRjR nguyên, j ∈ J với J ⊆ {1, 2, ..., n} (1.8)
trong đó uRjR là cận trên của biến xRjR (có thể uRjR = +∞).
Để cho bài toán (1.5) - (1.8) có hữu hạn phương án nguyên, ta giả thiết tập
tất cả các điểm x thỏa (1.6) - (1.7) là bị chặn (chẳng hạn, mọi uRjR đều hữu hạn).
Nếu J ≡ {1, 2, ..., n}, ta có bài toán quy hoạch nguyên hoàn toàn, còn nếu
J ⊂ {1, 2, ..., n} thì có bài toán quy hoạch nguyên bộ phận.
Trong bài toán trên, cùng với các ràng buộc đẳng thức có thể còn có các ràng
buộc bất đẳng thức ≤ hay ≥. Ngoài ra, như thường lệ, bài toán tìm max có thể qui về
bài toán tìm min bằng các đổi dấu hàm mục tiêu.
Nội dung phương pháp: Ký hiệu PR1R là bài toán quy hoạch tuyến tính tương
ứng với bài toán quy hoạch nguyên (1.5) - (1.8) (tạm bỏ qua điều kiện nguyên). Bài
toán (1.5) - (1.8) sẽ được chia nhỏ dần thành một số hữu hạn các bài toán nhỏ hơn
(theo nghĩa số phương án nguyên ít hơn), gọi tắt là các bài toán con. Mỗi bài toán
con đều nhận được từ bài toán ban đầu bằng cách thêm vào một số ràng buộc dạng:
xRjR ≥ αRjR ( j ∈ JR1R), xRjR ≤ βRjR ( j ∈ JR1R) với JR1R, JR2R ⊆ J, (1.9)
trong đó αRjR, βRj Rlà những số nguyên nào đó (có thể JR1R hoặc JR2R bằng ∅).
14
Với mỗi bài toán con nhận được, ta xét bài toán quy hoạch tuyến tính tương
ứng (bỏ qua điều kiện nguyên), thực chất đó là bài toán PR1 Rcó thêm các ràng buộc
(1.9) nêu trên.
Khi giải các bài toán quy hoạch tuyến tính tương ứng, ta có thể gặp một
trong các tình huống sau:
a) Bài toán không có phương án (miền ràng buộc rỗng), do đó nó cũng
không có phương án nguyên, vì thế bài toán con đang xét sẽ bị loại (không cần xét
tiếp nữa).
b) Bài toán có phương án tối ưu nguyên (mọi thành phần j thuộc J nguyên).
Khi đó ta nhận được một phương án của bài toán nguyên ban đầu (1.5) - (1.8) và giá
trị hàm mục tiêu, thường được gọi là giá trị kỷ lục. Bài toán con tương ứng cũng đã
xét xong và bị loại.
c) Bài toán có phương án tối ưu, nhưng trong đó có ít nhất một thành phần j
thuộc J không nguyên. Khi đó, giá trị tối ưu nhận được là một cận dưới cho mọi
phương án nguyên của bài toán con đang xét. Bài toán con nào có cận dưới lớn hơn
hay bằng giá trị kỷ lục sẽ bị loại, vì nó sẽ không chứa phương án nguyên tốt hơn.
Tiếp đó, trong số các bài toán con còn lại, ta chọn bài toán có cận dưới nhỏ
nhất (với hy vọng nó có nhiều khả năng chứa phương án nguyên tốt hơn). Giả sử
bài toán quy hoạch tuyến tính tương ứng với bài toán con được chọn là bài toán PRkR
và cận dưới nhỏ nhất này tương ứng với phương án tối ưu không nguyên xRkR của bài
toán PRkR đã tìm được trước đó. Giả sử thành phần ktx không nguyên.Khi đó, bài toán
con đang xét được chia thành hai bài toán con mới bằng cách thêm vào ràng buộc:
[ ] 1+≥ ktt xx hoặc [ ]ktt xx ≤
Để tính cận dưới cho mỗi bài toán con mới, ta lại giải bài toán quy hoạch
tuyến tính tương ứng với bài toán con đó (bỏ qua điều kiện nguyên).
15
Tùy theo kết quả giải, ta có thể loại bớt một số bài toán con mà chắc chắn nó
không chứa phương án nguyên tốt hơn phương án hiện biết.
Tiếp tục làm như vậy làm như vậy cho đến khi không còn bài toán con nào
để xét nữa thì dừng.
1.3. 10B ÀI TOÁN LUỒNG TRÊN MẠNG
1.3.1. 22BLuồng trên mạng
Trong nhiều ứng dụng liên quan đến đồ thị, cần thiết phải sử dụng các biến
đo lượng dòng chảy qua mỗi cung, chẳng hạn như hệ thống mạng điện, mạng viễn
thông, mạng sản xuất và phân phối, mạng giao thông, mạng ống dẫn nước, mạng
máy tính,… Trên những hệ thống mạng như thế, chúng ta muốn chuyển một lượng
chất liệu từ nơi này đến nơi khác sao cho đạt hiệu quả cao nhất. Hiệu quả ở đây có
thể xét theo tiêu chuẩn thời gian, độ dài quãng đường, chi phí tiền bạc, mức độ an
toàn,… Dạng bài toán này được gọi là bài toán luồng trên mạng.
Mạng là một đồ thị có hướng G(V, E) với V là tập đỉnh, E là tập các cung;
trong đó có duy nhất một đỉnh s không có cung đi vào gọi là điểm phát và có duy
nhất một đỉnh t không có cung đi ra gọi là điểm thu và mỗi cung e = (v, w) ∈ E
được gán với một số không âm c(e) = c(v, w) gọi là khả năng thông qua của cung e
(nếu không có cung (v, w) thì khả năng thông qua c(v, w) được gán bằng 0).
Một luồng f trong mạng G(V, E) là ánh xạ f: E Æ RPnP, gán cho mỗi cung
e = (v, w) của đồ thị một số 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:
16
1) Luồng trên mỗi cung e không vượt quá khả năng thông qua của nó:
0 ≤ f(e) ≤ c(e) với mọi cung e ∈ 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 mỗi
cung đi vào đỉnh v (trừ s, t) bằng tổng luồng trên các cung đi ra khỏi đỉnh v:
( )
( )
w s
f w, v
+∈Γ
∑ =
( )
( )
w s
f w, v
−∈Γ
∑
với ( )v−Γ = {w ∈ V: (w, v) ∈ E} và ( )v+Γ = {w ∈ V: (v, w) ∈ E}.
3) Giá trị của luồng f là số:
val( f ) =
( )
( )
w s
f s, w
+∈Γ
∑ =
( )
( )
w s
f w, t
−∈Γ
∑
Bài toán luồng cực đại trong mạng: Cho mạng G = (V, E). Hãy tìm luồng
f* trong mạng với giá trị luồng val(f*) là lớn nhất. Luồng f* được gọi là luồng cực
đại trong mạng.
1.3.2. 23BPhân loại các thuật toán luồng trên mạng
Các thuật toán trên mạng nói chung có thể được phân thành 3 loại sau:
- Cải tiến chi phí nguyên thủy (Primal cost improvement): Thực hiện các
vòng lặp cải tiến chi phí đến giá trị tối ưu của nó bằng cách xây dựng một dãy các
luồng khả thi tương ứng.
- Cải tiến chi phí đối ngẫu (Dual cost improvement): Ở đây ta xây dựng bài
toán có liên hệ với bài toán luồng trên mạng ban đầu, gọi là bài toán đối ngẫu, có
các biến được gọi là các giá. Sau đó thực hiện các vòng lặp cải tiến chi phí đối ngẫu
đến giá trị tối ưu của nó bằng cách xây dựng một dãy các giá tương ứng.
- Đấu giá: Ở đây ta sinh ra một dãy các giá theo kiểu đấu giá trong cuộc
sống thực. Cụ thể, sẽ không có việc cải tiến chi phí đối ngẫu và nguyên thủy ở đây,
mặc dù ta có thể xem rằng việc đầu giá như là xấp xỉ của quá trình cải tiến đối ngẫu.
17
1.3.3. 24BThuật toán tìm luồng cực đại trong mạng
Hiện nay có nhiều thuật toán để giải bài toán luồng cực đại trên mạng: Ford-
Fulkerson (1956), Edmonds-Karp (1969), Dinic (1970), Karzanov (1974),
Malhotra-Kumar-Maheshwari (1977), Sleator-Tarian (1980), Goldberg-Tarjan
(1986), …
Sau đây ta xét hai thuật toán thường sử dụng nhất là thuật toán
Ford-Fulkerson và thuật toán Edmonds-Karp.
1.3.3.1. 45BThuật toán Ford-Fulkerson
Ta đưa thêm vào một số khái niệm sau: Giả sử f là một luồng trong mạng
G = (V, E). Từ mạng G = (V, E) ta xây dựng đồ thị có trọng số trên mạng
GRfR = (V, ERf R), với tập các cung ERfR và trọng số trên các cung được xác định như sau:
1) Nếu e = (v, w) thuộc E với f(v, w) = 0, thì (v,w) thuộc ERfR với
trọng số c(v,w).
2) Nếu e = (v, w) thuộc E với f(v,w) = c(v, w), thì (w, v) thuộc ERfR với
trọng số f(v,w).
3) Nếu e = (v, w) thuộc E với 0 < f(v,w) < c(v, w) thì (v, w) thuộc ERfR
với trọng số c(v, w) - f(v, w) và (w, v) thuộc ERfR với trọng số f(v, w).
Các cung của GRfR đồng thời cũng là cung của G được gọi là cung thuận, các
cung còn lại được gọi là cung nghịch. Đồ thị GRfR được gọi là đồ thị tăng luồng.
Ví dụ: Các số viết cạnh các cung của G ở Hình vẽ 1.1 theo thứ tự là khả năng
thông qua và luồng f trên các cung.
18
Hình 1.1. Khả năng thông qua và luồng trên cung
Giả sử P = (s ≡ vR1R, vR2R, vR3R,.. , vRkR ≡ t) là một đường đi từ s đến t trên đồ thị tăng
luồng GRfR. Gọi d là giá trị nhỏ nhất của các trọng số của các cung trên đường đi P.
Xây dựng luồng f ' trên mạng G theo quy tắc sau:
f(u,v) + d nếu (u, v) thuộc P là cung thuận;
f '(u, v) = f(u,v) - d nếu (v, u) thuộc P là cung nghịch;
⎧⎪⎨⎪⎩
f(u,v) nếu (u, v) không thuộc P.
Ta gọi thủ tục biến đổi luồng nêu trên là tăng luồng dọc theo đường P.
Đường đi từ s đến t trên đồ thị tăng luồng GRfR gọi là đường tăng luồng.
Bắt đầu từ luồng với tất cả các cung bằng 0 ta tìm đường tăng luồng trên đồ
thị tăng luồng và thực hiện tăng luồng theo đường đi vừa tìm được. Sơ đồ thuật toán
Ford-Fulkerson được mô tả trong thủ tục sau đây:
Procedure Max_Flow;
(*Thuật toán Ford-Fulkerson *)
Begin
(* khởi tạo bắt đầu từ luồng với giá trị 0 *)
for u thuộc V do
for v thuộc V do f(u,v):=0;
Stop:= false;
while not Stop do
if {tìm được đường tăng luồng P}then
{tăng luồng dọc theo P}
else stop:=true;
End;
19
Thuật toán Ford-Fulkerson có độ phức tạp là O(m.val(f*)), với f* là luồng
cực đại trong mạng. Để tìm được đường tăng luồng trong GRfR có thể sử dụng thuật
toán tìm kiếm theo chiều rộng hay tìm kiếm theo chiều sâu bắt đầu từ đỉnh s, nhưng
sử dụng thuật toán gán nhãn của Ford-Fulkerson sẽ tối ưu hơn.
Thuật toán được thực hiện bắt đầu với duy nhất đỉnh s được khởi tạo nhãn và
nhãn của nó là chưa xét, còn tất cả các đỉnh còn lại đều chưa có nhãn. Từ s ta gán
nhãn tất cả các đỉnh kề với nó và nhãn của đỉnh s trở thành đã xét. Tiếp theo, từ mỗi
đỉnh v có nhãn chưa xét ta lại gán nhãn cho tất cả đỉnh chưa có nhãn kề với nó và
nhãn của đỉnh v trở thành đã xét. Quá trình cứ lặp lại cho tới khi: hoặc là đỉnh t trở
thành có nhãn hoặc là nhãn của tất cả các đỉnh có nhãn đều trở thành đã xét nhưng
đỉnh t vẫn không có nhãn. Trong trường hợp thứ nhất ta tìm được đường tăng luồng,
còn trường hợp thứ hai đối với luồng đang xét không tồn tại đường tăng luồng (tức
là luồng đã là cực đại). Mỗi khi tìm được đường tăng luồng, ta lại tăng luồng theo
đường tìm được, sau đó xoá tất cả các nhãn đối với luồng mới thu được rồi lại sử
dụng phép gán nhãn các đỉnh để tìm đường tăng luồng. Thuật toán kết thúc khi gặp
trường hợp thứ hai ở trên.
1.3.3.2. 46BThuật toán Edmonds-Karp
Thuật toán Edmonds-Karp áp dụng khi các khả năng thông qua là nguyên và
có thời gian tốt hơn thuật toán Ford-Fulkerson. Độ phức tạp tính toán của thuật toán
Edmonds-Karp là O(n.mP2 P) và thuật toán được mô tả trong thủ tục sau:
Procedure Max_Flow;
(*Thuật toán Edmonds-Karp *)
Begin
while {tồn tại đường tăng luồng trong GRfR} do
{
Tìm đường tăng luồng với khả năng tăng luồng lớn nhất;
Tăng luồng dọc theo đường này
}
End;
20
1.4. 11BĐỘ PHỨC TẠP CỦA CÁC BÀI TOÁN TỐI ƯU RỜI RẠC
Những khó khăn trong việc xây dựng dựng thuật toán hiệu quả để giải nhiều
bài toán tối ưu rời rạc là đòi hỏi sự giải thích về mặt lý thuyết mức độ phức tạp của
chúng. Có thể nói lý thuyết độ phức tạp tính toán ra đời trong hoàn cảnh đó.
Để đánh giá hiệu quả của một thuật toán có hai phương pháp: tiên nghiệm và
thực nghiệm. Phương pháp thực nghiệm cho phép xác định thuật toán có hữu hiệu
hay không bằng cách giải một loạt các bài toán thử (test). Phương pháp này có
nhiều hạn chế: kết quả thực nghiệm thường không ổn định và phụ thuộc vào kỹ
thuật lập trình, phương tiện tính toán để giải các bài toán thử. Tuy vậy, nó vẫn là
một phương pháp được áp dụng rộng rãi để xác định tính hiệu quả của các thuật
toán, và trong nhiều trường hợp ngoài nó ra không còn phương pháp nào khác.
Phương pháp tiên nghiệm khắc phục được các nhược điểm vừa nêu. Theo phương
pháp này ta cần phải đánh giá số phép toán nhiều nhất cần phải thực hiện trong
thuật toán và biểu diễn nó dưới dạng O(f(n)), trong đó n là độ dài của dữ liệu đầu
vào (còn gọi là số chiều của bài toán), còn O(f(n)) là tập hợp các hàm số g(n) sao
cho tồn tại hằng số C và số nR0R để với n> nR0R thì |g(n)| ≤ C |f(n)|.
Thuật toán được chia ra làm hai loại: thuật toán đơn định và thuật toán không
đơn định. Kết quả của mỗi phép toán trong thuật toán đơn định được xác định duy
nhất, còn trong thuật toán không đơn định có những phép toán đa trị.
Ta hiểu thời gian thực hiện của một thuật toán là số phép toán nhiều nhất cần
thực hiện để nhận được lời giải của bài toán với mọi bộ dữ liệu cho trước. Ta nói
rằng thuật toán có độ phức tạp tính toán là O(f(n)), nếu với mọi bộ dữ liệu cho trước
có độ dài n, thời gian thực hiện của thuật toán không vượt quá Cf(n), trong đó C là
hằng số. Thuật toán được gọi là có độ phức tạp tính toán đa thức, nếu thời gian thực
hiện của thuật toán đó là O(P(n)), trong đó n là độ dài đầu vào, còn P(n) là một đa
thức bậc cố định nào đó. Thuật toán đơn định với độ phức tạp tính toán đa thức gọi
ngắn gọn là thuật toán đa thức.
21
Tập các bài toán có thể giải được bằng thuật toán đa thức ký hiệu là P. Còn
ký hiệu NP là tập các bài toán có thể giải được bằng thuật toán đa thức không đơn
định. Rõ ràng P ⊆ NP, nhưng cho đến nay giải thuyết P = NP vẫn chưa được
ai chứng minh hay bác bỏ. Tuy vậy, người ta đã chứng minh được rằng trong lớp
NP có những bài toán khó không kém bất kỳ bài toán nào trong lớp này, chính xác
hơn là nếu có thuật toán đa thức để giải một bài toán nào đó trong số chúng thì cũng
có thuật toán đa thức để giải mọi bài toán trong NP. Những bài toán như vậy được
gọi là NP-đầy đủ. Ví dụ, những bài toán tối ưu rời rạc sau đây là NP-đầy đủ: bài
toán về ổn định của đồ thị, bài toán về chu trình Hamilton, bài toán người du lịch,
bài toán phủ, …
Để chứng minh một bài toán nào đó là NP-đầy đủ ta cần phải chỉ ra là nó
có hai tính chất:
1. Tồn tại thuật toán đa thức không đơn định để giải nó;
2. Có một bài toán NP-đầy đủ có thể dẫn về nó.
Những bài toán thỏa tính chất 2 về mặt độ phức tạp tính toán là khó tương
đương với các bài toán NP-đầy đủ. Vì vậy, người ta gọi là những bài toán như vậy
là NP-khó.
Khi nghiên cứu giải quyết các bài toán tối ưu thực tế, việc xác định nó thuộc
lớp nào trong số các bài toán kể trên không chỉ có ý nghĩa lý thuyết mà còn có ý
nghĩa thực tế quan trọng. Nếu bài toán đang xét được xác nhận là thuộc vào một
trong ba lớp cuối (NP, NP-đầy đủ, NP-khó) thì ít nhất có hy vọng tìm được
thuật toán hiệu quả để giải nó. Vì vậy, tốt hơn cả là hướng tới việc xây dựng những
thuật toán gần đúng cho các bài toán như vậy.