Các điều kiện tối ưu bổ sung

Một phần của tài liệu NGHIÊN cứu một số vấn đề của LÝTHUYẾT đồ THỊ ỨNG DỤNG TRONG GIẢIQUYẾT một số bài TOÁN THỰC tế (Trang 44)

Định lý 4.1 và 4.3 giúp 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ý 4.4 :Các điều kiện tối ưu bổ sung

Một lời giải khả thi x* là một lời giải tối ưu cho bài toán luồng với chi phí cực tiểu khi và chỉ khi với một tập hợp các khả năng của đỉnh π nào đó, các chi phí rút gọn và giá trị của luồng thỏa các điều kiện tối ưu lỏng bổ sung sau đối với mọi cung (i, j) ∈ A : Nếu cijπ > 0 thì * = 0 (4.5a) ij x Nếu 0 < < u* ij x ij thì π = 0 (4.5b) ij c Nếu cijπ < 0 thì = u* ij x ij (4.5c) 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 (4.5). Để có kết luận này, trước tiên chúng ta chứng minh rằng nếu các khả

năng của đỉnh π và luồng x thỏa các điều kiện tối ưu về chi phí rút gọn thì chúng phải thỏa (4.5). Hãy xét 3 trường hợp cho mọi cung (i, j)∈ A.

Trường hợp 1. Nếu > 0, đồ thị thặng dư không thể chứa cung (j, i) vì = - < 0, mâu thuẫn với (4.4). Vì vậy, = 0. π ij c π ji c cπij * ij x Trường hợp 2. Nếu 0 < < u* ij

x ij, đồ thị thặng dư chứa cả cung (i, j) và cung (j, i). Các điều kiện tối ưu về chi phí rút gọn chỉ ra rằng 0 và 0. Nhưng vì = - nên từ các bất đẳng trên suy ra = = 0.

π ij c ≥ π ji c ≥ π ji c cπij cπij cπji

Trường hợp 3. Nếu < 0, đồ thị thặng dư không thể chứa cung (i, j) vì < 0, mâu thuẫn (4.4). Vì thế, = u π ij c cijπ * ij x ij. 4.3. Liên hệ các luồng tối ưu và các khả năng tối ưu của đỉnh

Chúng ta có các câu hỏi sau: (1) cho mộ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? Ngược lại, (2) cho các khả năng tối ưu, làm cách nào để có được một luồng tối ưu? Chúng ta chỉ ra cách giải quyết những bài

KHOA CNTT –

ĐH KHTN

CHƯƠNG 4: LUỒNG CÓ CHI PHÍ CỰC TIỂU

toán này bằng cách giải một bài toán được đi ngắn nhất hoặc một bài toán luồng cực đại. Các kết quả này chỉ ra một quan hệđáng chú ý giữa bài toán luồng với chi phí nhỏ nhất và các bài toán luồng cực đại và đường đi ngắn nhất.

Tính toán khả năng tối ưu của đỉnh

Chúng ta sẽ chỉ ra rằng nếu cho trước một luồng tối ưu x*, 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(x*) là đồ thị thặng dư đối với luồng x*. Rõ ràng, G(x*) 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 x*. Gọi d(.) là đường đi ngắn nhất từđỉnh 1 đến các đỉnh còn lại của

đồ thị thặng dư nếu chúng ta coi cij là độ dài các 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 (2.2) cho ta:

d(j) ≤ d(i) + cij với mọi (i, j) trong G(x*) (4.6)

Đặt π = -d. Chúng ta có thể biểu diễn (4.6) thành

= c π

ij

c ij - π(i) + π(j) 0 với mọi (i, j) trong G(x*) ≥

Định lý 4.3 cho thấy π tạo thành một tập hợp tối ưu các khả năng của đỉnh.

Đạt được các luồng tối ưu

Bây giờ chúng ta sẽ chỉ ra rằng nếu cho trước một tập hợp các khả năng tối

ưu π, chúng ta có thểđạt được một lời giải tối ưu x* bằng cách giải một bài toán luồng cực đại. Trước tiên, chúng ta sẽ tính chi phí rút gọn cho mọi cung (i, j) A và rồi lần lượt khảo sát tất cả các cung. Chúng ta 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. π ij c ∈ Trường hợp 1: π > 0 ij c

Điều kiện (4.5a) cho biết phải bằng 0. Chúng ta tuân theo ràng buộc này bằng cách đặt = 0 và xóa cung (i, j) khỏi đồ thị. (adsbygoogle = window.adsbygoogle || []).push({});

* ij x * ij x

KHOA CNTT – ĐH KHTN Trường hợp 2: π < 0 ij c Điều kiện (4.5a) cho biết * = u ij

x ij. Chúng ta tuân theo ràng buộc này bằng cách đặt = u*

ij

x ij và xóa cung (i, j) khỏi đồ thị. Bởi vì chúng ta gửi uijđơn vị luồng trên cung (i, j), chúng ta phải giảm b(i) một lượng uij và tăng b(j) một lượng uij.

Trường hợp 3: π = 0

ij

c

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à uij.

Gọi G’ = (N, A’) 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 giới thiệu một đỉnh nguồn s và một đỉnh đích t. Với mỗi đỉnh i có b’(i) > 0, chúng ta thêm một cung (s, i) có độ thông qua b’(i) và với mỗi đỉnh i có b’(i) < 0, chúng ta thêm một cung (i, t) có độ thông qua –b’(i). Bây giờ chúng ta giải toán một bài toán luồng cực đại từđỉnh s đến t trong đồ thị biến đổi để đạt được một luồng cực

đại x*. Lời giải cho * ∀(i, j)

ij

x ∈ A 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.

4.4. Thuật toán khử chu trình âm và tính chất nguyên

Các điều kiện tối ưu về chu trình âm cho ta một hướng tiếp cận thuật toán

đơn giản để giải bài toán luồng với chi phí cực tiểu, chúng ta gọi là thuật toán khử

chu trình âm. Thuật toán này giữ một lời giải khả thi và tại mỗi vòng lặp cố gắng

để cải thiện giá trị hàm mục tiêu của nó. Trước hết thuật toán thành lập một luồng khả thi x trong đồ thị bằng cách giải bài toán luồng cực đại. Rồi nó sẽ tìm các chu trình có hướng có chi phí âm trong đồ thị thặng dư và tăng luồng trên những chu trình này. Thuật toán kết thúc khi đồ thị thặng dư không chứa chu trình có hướng chi phí âm. Định lý 4.1 cho biết khi thuật toán kết thúc, nó tìm được một luồng có chi phí cực tiểu. Dưới đây là dạng tổng quát của thuật toán khử chu trình âm.

KHOA CNTT –

ĐH KHTN

CHƯƠNG 4: LUỒNG CÓ CHI PHÍ CỰC TIỂU

Thuật toán khử chu trình âm

begin

tìm một luồng khả thi x trong đồ thị;

while G(x) chứa một chu trình âm do

begin

sử dụng một thuật toán để tìm một chu trình âm W;

δ:= min{rij: (i, j) ∈ W};

tăng δ đơn vị luồng trong chu trình W và cập nhật G(x); (adsbygoogle = window.adsbygoogle || []).push({});

end; end; i ( c , u )ij ij j xij i j ( c , r )ij ij 2 1 3 4 b(2 ) = 0 b(1 ) = 4 b(4 ) = -4 b(3 ) = 0 (2,4) 3 (3, 3) 3 0 (1 , 2) (2, 2)1 1 (1,5) (a) 2 1 3 4 (2,1) (-3,3) (1 , 2) (-2,1) (1,4) (b) (-2, 3) (2, 1) (-1, 1) 2 1 3 4 (2,1) (-3,1) (-1 , 2) (-2,1) (1,2) (c) (-2, 3) (2, 1) (-1, 3) (3, 2) 2 1 3 4 (2,2) (3, 3) (-1 , 2) (-2,1) (1,1) (d) (-2, 2) (-1, 4 )

(a) Đồ thị có 1 luồng khả thi x; (b) Đồ thị thặng dư G(x); (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

Hình 4-1 Minh họa thuật toán Khử chu trình âm

Chúng ta dùng ví dụ trên hình vẽ 4.1(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ẽ 4.1(a)

KHOA CNTT –

ĐH KHTN

ứ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ẽ 4.1(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ẽ 4.1(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.

Có nhiều thuật toán phát hiện chu trình âm. Trong đó thuật toán hiệu chỉnh nhãn FIFO (thuật toán tìm đường đi ngắn nhất) có thể nhận dạng chu trình âm một cách hiệu quả trong thời gian O(nm).

Một kết quả phụ của thuật toán khử chu trình âm là định lý quan trọng sau

đây:

Định lý 4.5: 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í nhỏ nhất luôn có một luồng với chi phí nhỏ nhất là số nguyên.

Trong bài toán luồng với chi phí nhỏ nhất, mCU là chặn trên của chi phí luồng ban đầu (vì cij C và x≤ ij ≤ U với ∀(i, j) ∈A) và –mCU là chặn dưới của chi phí luồng tối ưu (do cij -C và x≥ ij ≤ U với ∀(i, j) ∈A). 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 (∑(i,j)∈W cij)δ , là một giá trị âm. Chúng ta giả sử rằng tất cả dữ liệu của bài toán là số nguyên nên thuật toán sẽ kết thúc trong O(mCU) vòng lặp và chạy trong thời gian O(nm2CU).

4.5. Thuật toán đường đi ngắn nhất liên tiếp

Thuật toán khử chu trình âm duy trì tính khả thi của lời giải trong mỗi bước và cố gắng để đạt được lời giải tối ưu. Ngược lại, thuật toán đường đi ngắn nhất liên tiếp duy trì tính tối ưu của lời giải ở mỗi bước và cố gắng đạt được tính khả

thi. Nó giữ một lời giải x thỏa mãn ràng buộc không âm và độ thông qua, nhưng vi phạm ràng buộc cân bằng khối lượng của các đỉnh. Tại mỗi bước, thuật toán chọn một đỉnh s có khả năng cung thừa (nghĩa là nút cung chưa gửi đến nút cầu) và một

KHOA CNTT –

ĐH KHTN

CHƯƠNG 4: LUỒNG CÓ CHI PHÍ CỰC TIỂU

đường đi ngắn nhất trong đồ thị thặng dư.Thuật toán kết thúc khi lời giải hiện tại thỏa mãn tất cả các ràng buộc cân bằng khối lượng.

Để mô tả thuật toán này, trước hết chúng ta giới thiệu khái niệm luồng giả. Một luồng giả là một hàm x: A → R+ chỉ thỏa mãn các ràng buộc không âm và khả năng 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ả x, ta định nghĩa độ mất cân bằng của đỉnh i như sau: e(i) = b(i) + ∑ x ∈ } ) , ( : {j ji A ji - ∑ ∈ } ) , ( : {j ij A xij với ∀i ∈ N

Nếu e(i) > 0 với đỉnh i nào đó, ta nói e(i) là mức vượt quá của đỉnh i; nếu e(i) < 0, ta gọi –e(i) là mức thiếu hụt của đỉnh. Chúng ta gọi một đỉnh i có e(i) = 0 là cân bằng. Gọi E và D là các tập hợp các đỉnh vượt quá và thiếu hụt trong đồ thị. Chú ý rằng ∑iN e(i) = ∑iN b(i) = 0, vì thế ∑iE e(i) = -∑iD e(i). Do đó, nếu

đồ thị chứa một đỉnh vượt quá thì nó cũng phải chứa một đỉnh thiếu hụt. Đồ thị

thặng dư tương ứng với một luồng giả được định nghĩa giống như chúng ta định nghĩa đồ thị thặng dư cho một luồng.

Bổđề 4.6

Giả sử một luồng giả (hoặc một luồng) x thỏa 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 vectơ d là các 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(x) với π là độ dài của cung (i, j), ta có các tính chất sau:

ij (adsbygoogle = window.adsbygoogle || []).push({});

c

1) Luồng giả x cũng thỏa 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 π’ = π - d.

2) Các chi phí rút gọn với tất cả các cung (i, j) trên đường đi ngắn nhất từđỉnh s đến mọi đỉnh khác. π ij c Bổđề 4.7 Giả sử một luồng giả (hoặc một luồng) x thỏa các điều kiện tối ưu về chi phí rút gọn và chúng ta đạt được x’ từ x bằng cách gửi luồng theo một đường đi

KHOA CNTT –

ĐH KHTN

Dưới đây là mô tả của thuật toán đường đi liên tiếp. Các khả năng của đỉnh

đóng vai trò rất quan trọng trong thuật toán này. Bên cạnh việc sử dụng chúng để

chứng minh tính đúng đắn của thuật toán, chúng ta còn dùng chúng để giữ độ dài các cung không âm giúp ta 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 đường đi ngắn nhất liên tiếp begin

x := 0 và π := 0; e(i) := b(i) với ∀i∈N;

khởi tạo tập hợp E := {i: e(i) > 0} và D := {i: e(i) < 0};

while E ≠ ∅ do begin Chọn một đỉnh k ∈ E và một đỉnh l ∈ D; Xác định các khoảng cách đường đi ngắn nhất d(j) từ đỉnh s đến tất cả các đỉnh khác trong G(x) với các chi phí rút gọn π; ij c P biểu thị đường đi ngắn nhất từđỉnh k đến đỉnh l; Cập nhật π := π - d;

δ:= min[e(k), -e(l), min{rij: (i, j) ∈ P}]; Tăng δ đơn vị luồng theo đường đi P;

Cập nhật x, G(x), E, D, và các chi phí rút gọn;

end; end;

Chúng ta minh họa thuật toán đường đi ngắn nhất liên tiếp trên cùng một ví dụ chúng ta đã sử dụng để minh họa thuật toán khử chu trình âm. Hình vẽ 4.2(a) là

đồ thị thặng dư ban đầu. Khởi tạo, E = {1} và D = {4}. Do đó, trong vòng lặp đầu tiên, s = 1 và t = 4. Đường đi ngắn nhất d (đối với các chi phí rút gọn) là d = (0, 2, 2, 3) và đường đi ngắn nhất từđỉnh 1 đến đỉnh 4 là 1-3-4. Hình vẽ 4.2(b) biểu diễn các khả năng (của đỉnh) đã được cập nhật và các chi phí rút gọn, và hình vẽ 4.2(c) là lời giải sau khi chúng ta đã tăng luồng min{e(1), -e(4), r13, r34} = min{4, 4, 2, 5} = 2 đơn vị luồng theo đường đi 1-3-4. Trong vòng lặp thứ hai, k = 1, l = 4, d = (0, 0, 1, 1) và đường đi ngắn nhất từđỉnh 1 đến đỉnh 4 là 1-2-3-4. Hình vẽ 4.2(d) biểu

KHOA CNTT –

ĐH KHTN

CHƯƠNG 4: LUỒNG CÓ CHI PHÍ CỰC TIỂU

diễn các khả năng đã được cập nhật và các chi phí rút gọn, và hình vẽ 4.2(e) là lời giải sau khi chúng ta đã tăng luồng min{e(1), -e(4), r12, r23, r34} = min{2, 2, 4, 2, 3} = 2 đơn vị luồng. Cuối vòng lặp này, tất cả các độ mất cân bằng (imbalance) đều bằng 0 và thuật toán kết thúc.

Bây giờ chúng ta chứng minh tính đúng đắn của thuật toán đường đi ngắn nhất liên tiếp. Để khởi tạo, chúng ta đặt x = 0, là một luồng giả khả thi. Với luồng giả x bằng 0, G(x) = G. Chú ý rằng lời giải này cùng với π = 0 thỏa các điều kiện tối ưu về chi phí rút gọn vì π = c

ij

c ij 0 với mọi cung (i, j) trong đồ thị G(x) (nhớ

lại rằng trong giả thiết 5) 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 rỗng (

∅) 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ôn 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 đó các khoảng cách đường đi ngắn nhất d(.) được định nghĩa tốt. 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 U là chặ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 nU vòng lặp. Nếu S(n, m, C) 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(nUS(n, m, nC)). Chú ý rằng chúng ta dùng nC thay vì C trong biểu thức này vì chi phí trong đồ thị thặng dư bị chặn bởi nC. (adsbygoogle = window.adsbygoogle || []).push({});

KHOA CNTT – ĐH KHTN i ( c , u )ij ij j 2 1 3 4 e(2 ) = 0 (2,4) (3, 3) (1 , 2) (2, 2) (1,5) (2 ) = 0 e(1 ) = 0 (1 ) = 0 e(4 ) = 0 (4 ) = 0 e(3 ) = 0 (3 ) = 0 (a) 2 1 3 4 e(2 ) = 0 (0,4) (2, 3) (1 , 2) (0, 2) (0,5) (2 ) = -2 e(1 ) = 4 (1 ) = 0 e(4 ) = -4 (4 ) = -3

Một phần của tài liệu NGHIÊN cứu một số vấn đề của LÝTHUYẾT đồ THỊ ỨNG DỤNG TRONG GIẢIQUYẾT một số bài TOÁN THỰC tế (Trang 44)