Trong chương này, chúng ta xem xét một số bài toán bắt cặp: (1) bài toán bắt cặp lớn nhất trên đồ thị phân đôi, thuật toán cho bài toán này dùng ý tưởng của thuật toán đường tăng trưởng để giải bài toán bắt cặp. Bắt đầu một sự bắt cặp thích hợp M ( M có thể bằng null ). Sau đó, với mỗi nút chưa bắt cặp p∈ N, ta lặp lại các bước sau: xác định một đường tăng trửơng P bắt đầu tại nút p. Nếu tìm
được P thì thay M bằng M⊕P, ngược lại xoá nút p và các cạnh kề với nó trong đồ
thị; (2) bài toán bắt cặp có trọng số trên đồ thị phân đôi, với một số cách tiếp cận như: thuật toán đường đi ngắn nhất liên tiếp, thuật toán Hungary, thuật toán tỉ lệ
theo chi phí; (3) bài toán bắt cặp trên đồ thị tổng quát, thuật toán đường tăng trưởng gặp khó khăn trong việc giải bài toán này vì xuất hiện các chu trình có chiều dài lẻ gọi là “nụ”. Cách giải quyết là: trong quá trình tìm đường tăng trưởng, nếu gặp nụ thì co lại, sau khi tìm được đường tăng trưởng thì lần lượt giãn nở các nụđể tìm đường tăng trưởng cho đồ thị gốc.
KHOA CNTT –
ĐH KHTN
CHƯƠNG 6 : LUỒNG TỔNG QUÁT
6.1. Giới thiệu
Trong các mô hình mà chúng ta đã xem xét, chúng ta đã có một giả thiết rất quan trọng nhưng hầu như không được biết đến: chúng ta bảo toàn luồng trên mọi cung. Nghĩa là, trên bất kỳ cung nào giá trị luồng rời đỉnh cuối bằng với giá trị
luồng đến đỉnh đầu của nó. Giả thiết này rất hợp lý trong ngữ cảnh của nhiều ứng dụng, bao gồm nhiều ứng dụng chúng ta đã xem xét. Tuy nhiên, trên thực tế các giả thiết này có thể bị vi phạm. Ví dụ, trong truyền dẫn các chất khí dễ bay hơi, chúng ta có thể mất bớt luồng vì sự bay hơi; hoặc trong khi truyền các chất lỏng như dầu thô, chúng ta có thể làm mất luồng do rò rỉ.
Trong phần này chúng ta sẽ xem xét một mô hình luồng trên mạng tổng quát cơ bản để giải quyết các tình huống này. Trong mô hình này chúng ta gắn một số nhân µij dương với mọi cung (i, j) thuộc đồ thị và giả sử rằng nếu chúng ta gửi 1 đơn vị từđỉnh i đến đỉnh j dọc theo cung (i, j) thì µij đơn vị sẽ đến được đỉnh j. Mô hình này là mô hình tổng quát của bài toán luồng với chi phí cực tiểu mà chúng ta đã xét đến theo nghĩa là nếu mọi số nhân có giá trị là 1 thì mô hình luồng trên mạng tổng quát trở thành bài toán luồng với chi phí cực tiểu.
Dưới đây là mô hình toán học của bài toán luồng tổng quát:
Cực tiểu hóa ∑ c ∈A j i, ) ( ijxij (6.1a) Thỏa điều kiện x ∑ ∈ } ) , ( : {j i j A ij - ∑ ∈ } ) , ( : {j ji A ji µ xji = b(i) với ∀i ∈ N, (6.1b) 0 ≤ xij ≤ uij với ∀(i, j) ∈ A. (6.1c)
Như chúng ta đã biết µij > 0 là số nhân của cung (i, j). Chúng ta giả sử rằng mỗi số nhân µij là một số hữu tỉ, nghĩa là, nó có thểđược biểu diễn dưới dạng µij
KHOA CNTT –
ĐH KHTN
CHƯƠNG 6: LUỒNG TỔNG QUÁT
thì µij đơn vị luồng đến được đỉnh j. Nếu µij < 1, cung (i, j) là cung làm giảm; nếu
ij
µ > 1, cung (i, j) là cung làm tăng.
Trong mô hình này, độ thông qua uij là chặn trên của luồng mà chúng ta có thể gửi từđỉnh i, chứ không phải của luồng đến được đỉnh j. Tương tự, cij là chi phí trên một đơn vị luồng mà chúng ta gửi từđỉnh i, không phải là chi phí cho một đơn vị luồng đến được đỉnh j.
6.2. Các cấu trúc rừng tăng trưởng
Chúng ta sẽ định nghĩa cấu trúc rừng tăng trưởng và các điều kiện tối ưu gắn với nó.
6.2.1. Luồng trên đường đi
Gọi P là một đường đi (không cần thiết phải có hướng) từđỉnh s đến đỉnh t. Gọi P và P là tập hợp các cung thuận và các cung nghịch trong P. Chúng ta định nghĩa số nhân của đường đi µ(P) của đường đi P như sau:
µ(P) = ∏ ∏ ∈ ∈ P j i ij P j i ij ) , ( ) , ( µ µ (6.2) Trước hết chúng ta xét câu hỏi sau: nếu chúng ta gửi một đơn vị luồng từ đỉnh s tới đỉnh t theo đường đi P, luồng trên cung sẽ thay đổi như thế nào? Ví dụ, xét đường đi trên hình vẽ 6.1(a); giả sử rằng chúng ta muốn gửi 2 đơn vị luồng từ đỉnh 1 đến đỉnh 5. Gửi 2 đơn vị từ đỉnh 1 đến đỉnh 5 nghĩa là 2 đơn vị rời khỏi
đỉnh 1, và một lượng nhất định, gọi là α , sẽđến đỉnh 5. Giá trị luồng vào sẽ bằng luồng ra tại tất cả các đỉnh bên trong đường đi. Nếu chúng ta gửi 2 đơn vị trên cung (1, 2) thì 6 đơn vị sẽ đến đỉnh 2 vì số nhân của cung này là 3. Cung (2, 3) có số nhân 0,5, vì vậy khi chúng ta gửi 6 đơn vị trên nó, chỉ có 3 đơn vị đến được
đỉnh 3. Nếu chúng ta đưa luồng đi xa hơn thì 12 đơn vị sẽđến đỉnh 1 và một lượng tương tự cũng đến đỉnh 5. Tóm lại, nếu chúng ta gửi 2 đơn vị dọc theo đường đi 1- 2-3-4-5 thì 12 đơn vị sẽđến đỉnh 5. Tỉ lệ giữa đơn vị luồng đến đỉnh 5 và đơn vị
KHOA CNTT –
ĐH KHTN
đỉnh 2. Cung kế tiếp trên đường đi, cung (3, 2), là cung nghịch. Chúng ta cần gửi
đủ luồng trên cung này để hủy 2 đơn vị luồng tại đỉnh 2. Nếu chúng ta gửi
3 1
− của một đơn vị trên cung (3, 2) thì -2 đơn vị sẽđến đỉnh 2, thỏa mãn các điều kiện về
cân bằng khối lượng tại đỉnh 2. Nhưng gửi
3 1
− đơn vị trên cung (3, 2) làm dư ra
3 1
đơn vị tại đỉnh 3. Kếđến, ta gửi
3 1
đơn vị trên cung (3, 4) và
3 2
đơn vịđến đỉnh 4. Vì thế, chúng ta thấy rằng nếu gửi 1 đơn vị dọc theo đường đi 1-2-3-4 thì
3 2
đơn vị
sẽđến được đỉnh 4, bằng với số nhân của đường đi.
i j 1 2 3 4 5 1 2 3 4 (a) (b) ij 3 0.5 4 1 2 6 2
(a) Đường đi với tất cả các cung thuận, số nhân của đường đi là 6; (b) Đường đi với tất cả các cung thuận và cung nghịch, số nhân của
đường đi là 2/3
Hình 6-1: Luồng trên đường đi trong 1 đồ thị tổng quát
Nhưđược minh họa bởi 2 ví dụ trên, (1) nếu ta gửi y đơn vị luồng trên một cung thuận (i, j) thì luồng sẽ tạo ra µijy đơn vị tại đỉnh j; và (2) nếu ta gửi y đơn vị
từđỉnh j trên cung nghịch (j, i) thì luồng trên cung là –y/µij đơn vị và y/µij đơn vị
luồng sẽđến đỉnh i.
Tính chất 6.1
Nếu ta gửi 1 đơn vị luồng từ đỉnh s đến một đỉnh t dọc theo đường đi P thì
KHOA CNTT –
ĐH KHTN
CHƯƠNG 6: LUỒNG TỔNG QUÁT
6.2.2. Luồng trên chu trình
Gọi W là chu trình (không nhất thiết phải có hướng) từ một đỉnh s đến chính nó, hướng của chu trình được định nghĩa trước. Gọi W và W là tập hợp các cung thuận và các cung nghịch trong chu trình này. Tôn trọng hướng của chu trình, ta định nghĩa số nhân của chu trình µ(W) như sau:
µ(W) = ∏ ∏ ∈ ∈ W j i ij W j i ij ) , ( ) , ( µ µ (6.3) Gửi luồng dọc theo một chu trình cũng giống như gửi luồng dọc theo một
đường đi ngoại trừ luồng quay trở về với nó. Tính chất 6.1 chỉ ra rằng nếu chúng ta gửi một đơn vị luồng theo chu trình W bắt đầu từđỉnh s thì µ(W) đơn vị sẽ quay trở vềđỉnh này. Nếu µ(W) > 1, chúng ta tạo ra một độ vượt quá tại đỉnh s; trong trường hợp này chúng ta gọi chu trình W là chu trình làm tăng. Nếu µ (W) < 1, chúng ta tạo ra một sự thiếu hụt tại đỉnh s; trong trường hợp này chúng ta gọi chu trình W là chu trình làm giảm. Nếu µ (W) = 1, luồng dọc theo chu trình này bảo toàn cân bằng khối lượng tại tất cả các đỉnh của nó; chúng ta gọi chu trình W này là chu trình cân bằng.
Chú ý rằng nếu chúng ta đảo hướng của chu trình, chúng ta tráo đổi vai trò của các tập hợp W và W. Do đó, tử số của biểu thức (6.3) trở thành mẫu số và mẫu số trở thành tử số. Các tính chất sau là kết luận cho nhận xét trên.
Tính chất 6.2
Nếu µ(W) là số nhân của một chu trình W có hướng xác định thì 1/µ(W) là số nhân của chu trình đó với hướng ngược lại.
Chú ý rằng trừ khi chu trình là một chu trình cân bằng, chúng ta có thể làm cho nó trở thành một chu trình làm tăng hoặc một chu trình làm giảm bằng cách
định hướng tương ứng. Kếđến chúng ta sẽ phát biểu một số tính chất của chu trình
KHOA CNTT –
ĐH KHTN
Tính chất 6.3
Bằng cách gửi (tăng) θ đơn vị dọc theo một chu trình không cân bằng (làm tăng hoặc làm giảm) W bắt đầu tại đỉnh s, chúng ta tạo ra một độ mất cân bằng
θ(µ (W) – 1) đơn vị tại đỉnh s.
Tính chất 6.4
Gọi s là một đỉnh trong một chu trình không cân bằng W. Thì để tạo ra một
độ mất cân bằng α đơn vị tại đỉnh s (trong khi thỏa mãn các ràng buộc về cân bằng khối lượng tại tất cả các đỉnh), chúng ta phải gửi α /(µ(W) – 1) đơn vị luồng dọc theo chu trình W bắt đầu tại đỉnh s.
6.2.3. Cây tăng trưởng và rừng tăng trưởng
Tính chất 6.4 chỉ ra rằng trong một lời giải khả thi của bài toán luồng trên mạng tổng quát, tập hợp các cung A’ có giá trị luồng dương sẽ không là một cây khung. Đểđảm bảo tính khả thi, các cung trong A’ có thể chứa một chu trình. Ví dụ, nếu bản thân đồ thị là một chu trình W với một số nhân µ(W), một đỉnh t có khả năng cầu dương và các đỉnh khác có khả năng cầu bằng 0, bài toán có một lời giải duy nhất và tập hợp A’ các cung có luồng dương sẽ là cả chu trình. Do đó, với bài toán luồng trên mạng tổng quát, mỗi thành phần của A’ có thể chứa một chu trình. Chúng ta sẽ chỉ ra sau: bài toán luồng trên mạng tổng quát luôn có một lời giải tối ưu cho mỗi thành phần của A’ chứa đúng một chu trình (giả sử không thoái hóa). Các loại lời giải này đóng một vai trò trung tâm trong các luồng tổng quát như các lời giải cây khung đối với các luồng chi phí cực tiểu. Trong phần này, chúng ta sẽ mô tả các loại lời giải đặc biệt này và phát triển các điều kiện tối ưu cho chúng.
Gọi Ga = (Na, Ta) là một đồ thị con của G = (N, A) với Na N và T⊆ a A. Chúng ta gọi G
⊆
a là một cây tăng trưởng nếu Ta là một cây khung của tập hợp đỉnh Na cùng với một cung thêm vào (α , β) mà ta gọi là cung thêm. Một cây tăng trưởng có một đỉnh đặc biệt được chỉ rõ, gọi là gốc. Chúng ta xem các cây tăng trưởng được treo bởi gốc của nó. Hình vẽ 6.2(b) và (c) thể hiện hai cây tăng trưởng
KHOA CNTT –
ĐH KHTN
CHƯƠNG 6: LUỒNG TỔNG QUÁT
của đồ thị trên hình vẽ 6.2(a). Trong các hình vẽ này chúng ta vẽ các cung thêm bằng các đường nét đứt.
Một cây tăng trưởng chứa đúng một chu trình được tạo thành bằng cách thêm cung (α , β) vào cây Ta – {(α , β)}; chúng ta gọi chu trình này là chu trình thêm (extra cycle). Chú ý rằng chúng ta có thể xem bất cứ cung nào trong chu trình thêm là một cung thêm. Với lý do sẽ được chứng minh sau, ta gọi một cây tăng trưởng là một cây tăng trưởng tốt nếu chu trình thêm vào của nó là làm giảm hoặc làm tăng (không là một chu trình cân bằng).
Chúng ta định nghĩa một rừng tăng trưởng Gf = (N, F) với F A là tập hợp các cây tăng trưởng trong đồ thị. Chúng ta gọi một rừng tăng trưởng là một rừng tăng trưởng tốt nếu mỗi thành phần của nó là một cây tăng trưởng tốt. Hình vẽ
6.2(d) biểu diễn một rừng tăng trưởng của đồ thị trên hình vẽ 6.2(a). Chúng ta gọi các cung trong một rừng tăng trưởng là các cung thuộc rừng tăng trưởng và các cung còn lại là các cung không thuộc rừng tăng trưởng.
⊆
(a) Đồ thị gốc; (b) và (c) là hai cây tăng trưởng; (d) Rừng tăng trưởng
1 2 3 4 5 6 7 (a) 1 3 4 (b) 4 5 6 7 (c) 1 2 3 4 5 6 7 (d)
Hình 6-2 Ví dụ về cây tăng trưởng và luồng tăng trưởng
Chúng ta lưu trữ một rừng tăng trưởng trong máy tính như là một tập hợp các cây tăng trưởng. Mỗi một cây tăng trưởng là một cây và một cung thêm. Chúng ta có thể lưu trữ một cây bằng cách gắn ba chỉ số của nó với mỗi đỉnh i
KHOA CNTT –
ĐH KHTN
mạch, thread(i). Các chỉ số này cho phép chúng ta thực hiện các thao tác trên cây một cách hiệu quả.
6.2.4. Các cấu trúc rừng tăng trưởng và các điều kiện tối ưu
Giả sử rằng các tập hợp F, L, và U định nghĩa một phân chia của tập hợp các cung A và F là một rừng tăng trưởng tốt. Chúng ta gọi các cung trong F là các cung AF (AF-arcs). Ta cũng gọi các cung trong L là các cung không thuộc rừng tăng trưởng ở chặn dưới của nó, và các cung trong U là các cung không thuộc rừng tăng trưởng ở chặn trên của nó. Ta nói bộ ba (F, L, U) là một cấu trúc rừng tăng trưởng.
Một cấu trúc rừng tăng trưởng (F, L, U) có thể là khả thi hoặc không khả
thi. Nếu ta đặt xij = 0 với (i, j) ∀ ∈ L và xij = uij với ∀(i, j) ∈ U thì một luồng duy nhất trên các cung của rừng tăng trưởng sẽ thỏa mãn hệ phương trình (6.1b) (trong phần 6.4 chúng ta sẽ chỉ ra cách tính luồng này). Nếu luồng này thỏa mãn các ràng buộc về giới hạn trên và dưới trên tất cả các cung của rừng tăng trưởng, chúng ta nói rằng cấu trúc (F, L, U) là khả thi; ngược lại, là không khả thi. Chúng ta nói rằng một cấu trúc rừng tăng trưởng khả thi là không thoái hóa nếu 0 < xij < uij với (i, j) ∈ F; nó là thoái hóa trong trường hợp ngược lại. Chúng ta cũng nói rằng một cấu trúc rừng tăng trưởng khả thi (F, L, U) là một cấu trúc rừng tăng trưởng tối ưu nếu luồng gắn với nó x ∀ ij là một lời giải tối ưu của (6.1). Chúng ta gắn một đỉnh i với một số π(i) mà chúng ta gọi là khả năng của nó. Với một tập hợp các khả năng của đỉnh, chúng ta định nghĩa chi phí rút gọn của một cung (i, j) là π = c ij
c ij - π(i) + µ πij (j). Trong định lý sau, chúng ta sẽ phát biểu và chứng minh một điều kiện đủ cho một luồng là tối ưu.
Định lý 6.5: Các điều kiện tối ưu về luồng tổng quát
Một luồng x* là một lời giải tối ưu của bài toán luồng trên mạng tổng quát nếu nó khả thi và với vectơ π các khả năng của đỉnh nào đó, cặp (x*, π) thỏa mãn các điều kiện tối ưu sau: (a) Nếu 0 < < u* ij x ij, thì π = 0. (6.4a) ij c (b) Nếu = 0, thì * 0. (6.4b) ij x cijπ ≥
KHOA CNTT –
ĐH KHTN
CHƯƠNG 6: LUỒNG TỔNG QUÁT
(c) Nếu * = u
ij
x ij, thì cijπ ≤ 0. (6.4c) Chứng minh
Trước tiên chúng ta khẳng định rằng cực tiểu hóa ∑(i,j)∈A cijxij tương
đương với cực tiểu hóa ∑(i,j)∈A x
π
ij
c ij. Chứng minh điều này tương tự như như tính chất 2.4. Gọi π là vectơ cùng với luồng x* thỏa các điều kiện (6.4), và x là một luồng bất kỳ. Xét kết luận sau: (x ∑ ∈A j i, ) ( π ij c ij - ). * (6.5) ij x
Chúng ta khẳng định rằng mỗi phần tử trong (6.5) là không âm. Chúng ta có
được khẳng định trên bằng cách xét ba trường hợp sau: Trường hợp 1: 0 < < u*
ij
x ij. Trong trường hợp này (6.4a) chỉ ra rằng = 0,