Bài toán tìm luồng lớn nhất trong mạng vận tả

Một phần của tài liệu Lập trình mô phỏng một số thuật toán trên đồ thị (Trang 26)

Mạng vận tải đƣợc định nghĩa là bộ GV E w s t, , , , , ở đây V E,  là một đồ thị có hƣớng liên thông không có khuyên,

   

: 0 | 0

w ER   r R r là hàm trọng lƣợng trên tập cung E, s là một đỉnh xác định cho trƣớc gọi là đỉnh phát, còn t là một đỉnh xác định cho trƣớc khác gọi là đỉnh thu.

Định lý Ford – Fulkerson về luồng lớn nhất: Trong mọi mạng vận

tải GV E w s t, , , , , giá trị luồng lớn nhất trong mạng bằng khả năng thông qua của lát cắt nhỏ nhất và tách đƣợc st của nó.

Thuật toán Ford – Fulkerson

Giả sử GV E w s t, , , ,  là một mạng vận tải nguyên, tức là

 

: 0,1, 2,...

w EN . Ta sẽ mô tả trong mục này thuật toán Ford–Fulkerson

mà cho phép ta giải quyết hữu hiệu bài toán tìm luồng lớn nhất trong mạng vận tải nguyên G. Thuật toán bao gồm hai phần: phần gán nhãn cho các đỉnh và phần tăng luồng. Hai phần đó thực hiện luân phiên nhau cho tới khi ta tìm đƣợc luồng lớn nhất trong mạng vận tải nguyên G.

Bƣớc 1. (Bƣớc xuất phát). Xác định một luồng nguyên f nào đó trong mạng vận tải nguyên GV E w s t, , , ,  là luồng xuất phát cho thuật toán. Vì hàm f E:  : u v, 0 luôn là luồng nguyên trong mọi mạng vận tải nguyên G, nên ta có thể chọn luồng này là luồng xuất phát.

PHẦN I. GÁN NHÃN CHO CÁC ĐỈNH

Mỗi đỉnh của mạng G có thể ở một trong ba trạng thái: chƣa có nhãn, đã có nhãn nhƣng chƣa đƣợc xét, đã có nhãn và đã xét xong. Nhãn của đỉnh

v V là bộ ba      v , v , v  với      v   , , vV còn  v  . Nhãn của đỉnh v sẽ đƣợc lƣu giữ nhƣ là giá trị của biến v. Nhãn của đỉnh v sẽ đƣợc lƣu giữ nhƣ là giá trị của biến v.

Bƣớc 2. s: , ,s .

Lúc này đỉnh s đƣợc coi là ở trạng thái đã có nhãn nhƣng chƣa đƣợc xét. Tất cả các đỉnh còn lại của G đƣợc coi là ở trạng thái chƣa có nhãn.

Bƣớc 3. Chọn một đỉnh đã có nhãn nhƣng chƣa đƣợc xét của G, chẳng hạn nhƣ đỉnh x với nhãn là      x , x , x  ra xét. Quá trình xét là quá trình gán nhãn cho một số đỉnh của G nhƣ ở (i) và (ii) dƣới đây:

(i) Nếu đỉnh yA x  z N   x | f x z, w x z ,  và y chƣa có nhãn, thì y:  , ,x y  với  y min   x w x y, ,  f x y , ;

 

: , ,

y   xy  với  y min   x , f y x, .

Sau khi thực hiện (i) và (ii), đỉnh x đƣợc coi là ở trạng thái đã có nhãn và đã xét xong. Bằng cách nào đó hãy đánh dấu đỉnh x để ta có thể nhận biết là x thuộc trạng thái nói trên. Các đỉnh y vừa đƣợc gán nhãn ở (i) và (ii) sẽ đƣợc coi là ở trạng thái đã có nhãn nhƣng chƣa đƣợc xét. Còn các đỉnh còn lại thì có trạng thái nhƣ nó đã có trƣớc đây.

Bƣớc 4. Nếu đỉnh thu t chƣa có nhãn và vẫn còn có những đỉnh đã có nhãn chƣa đƣợc xét trong G, thì ta quay lại thực hiện Bước 3.

Nếu đỉnh thu t chƣa có nhãn và không còn có đỉnh nào đã có nhãn nhƣng chƣa đƣợc xét trong G thì ta kết thúc thuật toán. Khi đó luồng nhận đƣợc cuối cùng là luồng lớn nhất trong G. Hơn thế nữa, nếu ta ký hiệu bằng

0

X tập các đỉnh đã có nhãn ở lần gán nhãn cuối cùng thì E X 0,X0 là lát cắt nhỏ nhất tách đƣợc st trong Gw X 0,X0 bằng giá trị của luồng lớn nhất.

Nếu đỉnh thu t đƣợc gán nhãn là      t , t , t , thì ta kết thúc Phần I của thuật toán và chuyển sang Phần II của thuật toán (Phần tăng luồng) từ

Bước 5.

PHẦN II. TĂNG LUỒNG (adsbygoogle = window.adsbygoogle || []).push({});

Bƣớc 5. u:t

Bƣớc 6. Nếu u:      u , u , u  với  u  , thì ta tăng luồng qua cung  u u,  từ f  u u,  lên f  u u,  t .

Nếu u:      u , u , u  với  u  , thì giảm luồng qua cung

 

u, u  từ f u , u  xuống f u , u  t .

Bƣớc 7. Nếu  us, thì ta gán u: u và quay lại Bước 6.

2 để gán lại nhãn cho các đỉnh với luồng mới đƣợc điều chỉnh từ Bước 6. Thuật toán Ford–Fulkerson để tìm luồng cực đại trên mạng đƣợc cài đặt nhƣ sau: Bắt đầu từ một luồng f trên mạng (chẳng hạn f 0), thuật toán tìm đƣờng tăng luồng P trên mạng thặng dƣ, gán f : f fp để tăng giá trị luồng f và lặp lại cho tới khi không tìm đƣợc đƣờng tăng luồng nữa.

f := <<Một luồng bất kỳ>>;

While <<Tìm được đường tăng luồng P>> do

: P

f  f f ; Output f Output f

Ví dụ: Tìm luồng cực đại trong mạng

Hình 1.12 Tìm luồng cực đại trong mạng đỉnh phát S và đỉnh thu t

Lặp lần 1: Hình 1.13 Mạng vận tải với lần lặp 1 Bƣớc 1. f 0 Bƣớc 2. + Gán nhãn cho đỉnh xuất phát S:, ,S . + S đã có nhãn nhƣng chƣa xét.

+ Tất cả các đỉnh khác chƣa có nhãn. Bƣớc 3.

+ Xét S (S đã đƣợc xét). Gán nhãn: A:, ,9S ; B:, , 4S ; C:, ,8S  Bƣớc 4.

+ Đỉnh thu t chƣa có nhãn, quay lại bƣớc 3 + Xét A (A đã đƣợc xét). Gán nhãn E:, ,3A . + Xét B (B đã đƣợc xét). Gán nhãn t:, , 4B .

+ Vì đỉnh thu t đã đƣợc gán nhãn. Chuyển sang bƣớc 5 Bƣớc 5. Đặt u: t:, , 4B  Bƣớc 6 và 7. + Tăng luồng: f B t ,  f B t ,  t   0 4 4. + Đặt uB:, , 4S  + Tăng luồng: f S B ,  f S B ,  t   0 4 4. + Đặt uS

+ Vì  uS nên xóa tất cả các nhãn, cập nhật lại luồng và quay về bƣớc 2.

Lần lặp 2 (với luồng đã điều chỉnh)

Hình 1.14 Mạng vận tải với lần lặp 2 Bƣớc 2.

+ Gán nhãn cho đỉnh xuất phát S:, ,S . + S đã có nhãn nhƣng chƣa xét.

+ Tất cả các đỉnh khác chƣa có nhãn. Bƣớc 3.

+ Xét S (S đã đƣợc xét). Gán nhãn: A:, ,9S ; C:, ,8S . Bƣớc 4.

+ Đỉnh thu t chƣa có nhãn, quay lại bƣớc 3.

+ Xét A (A đã đƣợc xét). Gán nhãn B:, , 4A ; E:, ,3A . + Xét E (E đã đƣợc xét). Gán nhãn t:, ,3E .

+ Vì đỉnh thu t đã đƣợc gán nhãn. Chuyển sang bƣớc 5 Bƣớc 5. Đặt u:t:, ,3E . Bƣớc 6 và 7. + Tăng luồng: f E t ,  f E t ,  t   0 3 3. + Đặt uE:, ,3A  + Tăng luồng: f S A ,  f S A ,  t   0 3 3. + Đặt uS

+ Vì  uS nên xóa tất cả các nhãn, cập nhật lại luồng và quay về bƣớc 2.

Lần lặp 3 (với luồng đã điều chỉnh)

Hình 1.15 Mạng vận tải với lần lặp 3 Bƣớc 2. (adsbygoogle = window.adsbygoogle || []).push({});

+ S đã có nhãn nhƣng chƣa xét. + Tất cả các đỉnh khác chƣa có nhãn. Bƣớc 3.

+ Xét S (S đã đƣợc xét). Gán nhãn: A:, ,6S ; C:, ,8S . Bƣớc 4.

+ Đỉnh thu t chƣa có nhãn, quay lại bƣớc 3. + Xét C (C đã đƣợc xét). Gán nhãn D:, ,5C . + Xét D (D đã đƣợc xét). Gán nhãn t:, , 2D .

+ Vì đỉnh thu t đã đƣợc gán nhãn. Chuyển sang bƣớc 5 Bƣớc 5. Đặt u:t:, , 2D . Bƣớc 6 và 7. + Tăng luồng: f D t ,  f D t ,  t   0 2 2. + Đặt uD:, ,5C  + Tăng luồng: f C D ,  f C D ,  t   0 2 2. + Đặt uC:, ,8S  + Tăng luồng: f S C ,  f S C ,  t   0 2 2 + Đặt uS

+ Vì  uS nên xóa tất cả các nhãn, cập nhật lại luồng và quay về bƣớc 2.

Lần lặp 4 (với luồng đã điều chỉnh)

Hình 1.16 Mạng vận tải với lần lặp 4 Bƣớc 2.

+ Gán nhãn cho đỉnh xuất phát S:, ,S . + S đã có nhãn nhƣng chƣa xét. + Tất cả các đỉnh khác chƣa có nhãn. Bƣớc 3. + Xét S (S đã đƣợc xét). Gán nhãn: A:, ,6S ; C:, ,6S . Bƣớc 4.

+ Đỉnh thu t chƣa có nhãn, quay lại bƣớc 3. + Xét A (A đã đƣợc xét). Gán nhãn B:, , 4A . + Xét B (B đã đƣợc xét). Gán nhãn t:, ,3B .

+ Vì đỉnh thu t đã đƣợc gán nhãn. Chuyển sang bƣớc 5 Bƣớc 5. Đặt u: t:, ,3B . Bƣớc 6 và 7. + Tăng luồng: f B t ,  f B t ,  t   4 3 7. + Đặt uB:, , 4A  + Tăng luồng: f A B ,  f A B ,  t   0 3 3. + Đặt uA:, ,6S  + Tăng luồng: f S A ,  f S A ,  t   3 3 6 + Đặt uS

+ Vì  uS nên xóa tất cả các nhãn, cập nhật lại luồng và quay về bƣớc 2.

Lần lặp 5 (với luồng đã điều chỉnh)

Bƣớc 2. + Gán nhãn cho đỉnh xuất phát S:, ,S . + S đã có nhãn nhƣng chƣa xét. + Tất cả các đỉnh khác chƣa có nhãn. Bƣớc 3. + Xét S (S đã đƣợc xét). Gán nhãn: A:, ,3S ; C:, ,6S . Bƣớc 4.

+ Đỉnh thu t chƣa có nhãn, quay lại bƣớc 3. + Xét A (A đã đƣợc xét). Gán nhãn B:, ,1A .

+ Xét B (B đã đƣợc xét). Không gán đƣợc nhãn cho B. + Xét C (C đã đƣợc xét). Gán nhãn D:, ,3C .

+ Xét D (D đã đƣợc xét). Không gán đƣợc nhãn cho D. + Vì đỉnh thu t không đƣợc gán nhãn. Kết thúc thuật toán.

Hình 1.18 Mạng vận tải sau khi kết thúc thuật toán

Giá trị luồng cực đại bằng tổng khả năng thông qua của các cung. Do đó luồng cực đại bằng f 12

Một phần của tài liệu Lập trình mô phỏng một số thuật toán trên đồ thị (Trang 26)