Luồng trên mạng

Trong lý thuyết đồ thị, một **luồng trên mạng**, thường được gọi tắt là **luồng**, là một cách gán các luồng (dòng chảy) cho các cung của một đồ thị có hướng (trong trường hợp này được gọi là một **mạng vận tải**) trong đó mỗi cung có một **khả năng thông qua**, sao cho dung lượng luồng qua một cung không vượt quá khả năng thông qua của nó. Ngoài ra, ta còn có một điều kiện rằng dung lượng luồng vào một nút phải bằng dung lượng luồng ra khỏi nút đó, ngoại trừ trường hợp nó là một **nút phát** (hay **nút nguồn**) - nơi chỉ có dòng ra, hoặc một **nút thu** - nơi chỉ có luồng vào. Một mạng vận tải có thể được dùng để giả lập giao thông trên một hệ thống đường sá, dòng chảy trong các đường ống, dòng trong một mạch điện, hoặc bất cứ cái gì tương tự di chuyển qua một mạng lưới gồm các nút.

## Định nghĩa

Cho một đồ thị G(V,E) với các nút V và các cung E, và hai nút đặc biệt: nút phát s (bậc trong bằng 0) và nút thu t (bậc ngoài bằng 0).
Cho f(u,v) là dòng từ nút u tới nút v, và c(u,v) là khả năng thông qua (dòng lớn nhất có thể) của cung đó.
Một luồng trên mạng là một hàm số giá trị thực f:V \times V \rightarrow R với ba tính chất sau cho tất cả các nút u và v:

# **Đối xứng**: \ f(u,v) = - f(v,u). Tổng luồng từ u tới v phải bằng đối của tổng luồng từ v tới u (Xem ví dụ).
# **Các điều kiện về khả năng thông qua**: \ f(u,v) \le c(u,v). Luồng dọc theo một cung không thể vượt quá khả năng thông qua của nó.
# **Cân bằng luồng**: \ \sum_{w \in V} f(u,w) = 0, trừ khi u=s hoặc u=t. Tổng luồng tới một nút bằng 0, ngoại trừ trường hợp đó là nút nguồn - nơi sinh luồng, và nút thu - nơi "tiêu thụ" luồng.

Lưu ý rằng f(u,v) là tổng luồng từ u tới v. Nếu đồ thị biểu diễn một mạng vật lý, và nếu có một luồng thực sự, chẳng hạn gồm 4 đơn vị, chảy từ u tới v, và một luồng thực gồm 3 đơn vị chảy từ v tới u, ta có f(u,v)=1 và f(v,u)=-1.

**Khả năng thông qua còn dư** (*residual capacity*) của một cạnh là c_f(u,v) = c(u,v) - f(u,v). Khái niệm đó định nghĩa một **mạng còn dư** (*residual network*), ký hiệu là G_f(V,E_f), thể hiện lượng khả năng thông qua *hiện có*. Để ý rằng có thể có một cung từ u tới v trong mạng còn dư, ngay cả khi không có cung từ u tới v trong mạng ban đầu. Do các luồng theo các hướng ngược nhau triệt tiêu lẫn nhau, *giảm* luồng từ v tới u tương đương với *tăng* luồng từ u tới v. Một **đường tăng** (*augmenting path*) là một đường đi (u_1,u_2,\dots,u_k), trong đó u_1=s, u_k=t, và c_f(u_i, u_{i+1}) > 0, nghĩa là có thể gửi thêm luồng dọc theo đường đi này.

## Ví dụ

Trên hình bên phải là một mạng vận tải với nguồn s, nút thu t, và bốn nút khác. Luồng và khả năng thông qua được ký hiệu f/c. Lưu ý rằng trong mạng này, các điều kiện về đối xứng, khả năng thông qua và cân bằng luồng đã được thỏa mãn. Tổng luồng từ s tới t là 5, dễ thấy từ thực tế là tổng luồng từ s ra có giá trị bằng 5, và cũng bằng tổng luồng vào t. Ta biết rằng không có luồng mới xuất hiện hoặc biến mất tại bất cứ nút nào khác.

Bên dưới là hình vẽ mạng còn dư từ luồng đã cho. Lưu ý rằng có khả năng thông qua trên một số cung mà khả năng thông qua ban đầu bằng 0, ví dụ đối với cung (d,c). Luồng này không phải là một luồng cực đại. Có cung với khả năng thông qua dương suốt dọc theo các đường (s,a,c,t), (s,a,b,d,t) và (s,a,b,d,c,t), đó là các đường tăng. Khả năng thông qua của đường thứ nhất là min(c(s,a)-f(s,a), c(a,c)-f(a,c), c(c,t)-f(c,t)) = min(5-3, 3-2, 2-1) = min(2, 1, 1)=1. Đường đi cuối cùng không tồn tại trong mạng ban đầu, nhưng nếu ta gửi luồng theo đường đó, ta vẫn có một luồng hợp lệ.

Nếu đây là một mạng thực sự, có thể có một luồng có giá trị bằng 2 từ a tới b đồng thời với một luồng có giá trị bằng 1 từ  b to a, nhưng ta chỉ quản lý luồng **tổng**.

## Ứng dụng

Một mạng vận tả có thể được sử dụng để giả lập một hệ thống bất kỳ nếu nó có các điều kiện như trong định nghĩa ở trên.

Hình dung một loại đường ống nối với nhau thành một mạng. Mỗi đường ống có một độ rộng nhất định, do đó nó chỉ có thể cho phép một dòng chảy với một lượng nước nhất định. Mỗi khi các đường ống gặp nhau, tổng lượng nước chảy vào điểm nối phải bằng lượng chảy ra từ đó. Ta có một nguồn nước, đó là điểm phát, và một điểm tập trung nước, đó là điểm thu. Khi đó một luồng có thể là một cách lấy nước từ nguồn tới nút thu. sao cho tổng lượng nước ra khỏi nút thu là không đổi. Về trực quan, tổng luồng của một mạng chính là tỷ lệ nước chảy ra từ điểm thu.

Luồng có thể so sánh với người hoặc vật liệu trên các mạng giao thông vận tải, hoặc với điện trên các hệ thống phân phối điện. Với mỗi mạng vật lý như vậy, luồng vào mỗi nút trung gian phải bằng luồng ra khỏi đó. Bollobás nêu đặc trưng này theo Kirchhoff's current law, trong khi các tác giả sau này (Chartrand) nhắc đến su duy rộng tới một số phương trình quy ước (*conservation equation*).

## Tổng quát hóa và chuyên biệt hóa

Bài toán đơn giản nhất và thông dụng nhất cho luồng trên mạng là bài toán tìm luồng cực đại trong một đồ thị cho trước, với kết quả mong muốn là luồng tổng lớn nhất có thể từ điểm nguồn đến điểm thu. Có nhiều bài toán khác có thể được giải bằng các thuật toán luồng cực đại, nếu chúng được mô hình hóa dưới dạng các mạng vận tải, chẳng hạn như các bài cặp ghép hai phía, bài toán phân công công việc (*assignment problem*), bài toán vận tải.

Trong một bài toán luồng đa (*multi-commodity flow problem*), ta có nhiều điểm phát, nhiều điểm thu, và nhiều loại "hàng" cần chảy từ một nút phát cho trước tới một nút thu cho trước. Ví du, nhiều loại hàng được sản xuất tại nhiều nhà máy, và cần được chuyên chở đến cho các khách hàng khác nhau qua *cùng* một mạng giao thông.

Trong một bài toán luồng chi phí cực tiểu,  mỗi cung u,v có một chi phí cho trước k(u,v), và chi phí gửi luồng f(u,v) qua cung đó là f(u,v) \cdot k(u,v). Mục tiêu là gửi một luồng có dung lượng cho trước từ nguồn tới điểm thu với chi phí thấp nhất.

Trong một bài toán luồng tuần hoàn (*circulation problem*), với mỗi cung (u,v), ngoài c(u,v) còn có một cận dưới l(u,v). Mỗi cung cũng có một chi phí. Thông thường, trong bài toán luồng tuần hoàn, điều kiện cân bằng luồng sẽ phải áp dụng cho *mọi* nút, và có một kết nối giữa điểm thu ngược trở lại điểm phát. Bằng cách này, ta có thể áp đặt luồng tổng bằng l(t,s) và c(t,s). Do luồng *tuần hoàn* trong mạng nên bài toán được đặt tên như vậy.

### Mối quan hệ giữa các bài toán luồng

Nhiều biến thể của các bài toán luồng có quan hệ với nhau với hình thức bài này là tổng quát hóa hay chuyên biệt  hóa của bài kia. Trong cây dưới đây, một bài toán có thể được giải bằng một lời giải cho bài toán cha.

* Bài toán luồng với các điều kiện và hàm mục tiêu tùy ý.
** Bài toán luồng với các điều kiện tuyến tính.
*** Bài toán luồng tuần hoàn đa (*Multi-commodity circulation problem*). Thuật toán thời gian đa thức duy nhất được biết là giải bằng quy hoạch tuyến tính.
**** Bài toán luồng đa chi phí cực tiểu. Đặt tất cả các cận dưới bằng 0.
***** Bài toán luồng chi phí cực tiểu. Giải với một loại hàng, 1 thu, 1 phát.
****** Bài toán luồng cực đại. Đặt tất cả chi phí bằng 0 và cực đại hóa luồng.
****** Bài toán tìm một đường đi ngắn nhất. Đặt tất cả các khả năng thông qua bằng 1, tìm luồng có độ lớn 1.
***** Bài toán luồng đa. Đặt tất cả chi phí bằng 0.
****** Đặt tất cả chi phí bằng 0. Giải với một loại hàng, 1 thu, 1 phát.
***** Bài toán tìm đường đi ngắn nhất cho mọi cặp đỉnh. Cho các khả năng thông qua là vô hạn, tìm luồng độ lớn 1 cho v(v-1)/2 loại hàng, mỗi loại cho 1 cặp đỉnh.
**** Bài toán luồng tuần hoàn. Giải với một loại hàng, 1 thu, 1 phát.

Trong tất cả các bài toán trên, ta có thể tìm một luồng cực đại hoặc một luồng có độ lớn cho trước.

## Liên kết ngoài
* Maximum Flow Problem 
* Maximum Flow 
* Ford-Fulkerson Max Flow Labeling Algorithm 

## Tham khảo

## Đọc thêm
* 
* 
* 
* 
* 

## Xem thêm
* Định lý luồng cực đại lát cắt cực tiểu