1. Trang chủ
  2. » Luận Văn - Báo Cáo

BÀI TOÁN LUỒNG CỰC ĐẠI .doc

16 1,5K 9
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 238 KB

Nội dung

BÀI TOÁN LUỒNG CỰC ĐẠI

Trang 1

Chương 2

BÀI TOÁN LUỒNG CỰC ĐẠI VỚI KHẢ NĂNG THÔNG QUA CÁC CUNG – CÁC ĐỈNH

Bài toán luồng cực đại trong mạng là một trong số những bài toán tối ưu trên đồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý thuyết tổ hợp Bài toán được đề xuất vào đầu những năm 1950, và gắn liền với tên tuổi của hai nhà bác học Mỹ là Ford và Fulkerson Bài toán luồng cực đại trong mạng có nhiều ứng dụng trong thực tế như: Bài toán xác định cường độ dòng lớn nhất của dòng vận tải giữa hai nút của một bản đồ giao thông, bài toán tìm luồng dầu lớn nhất có thể bơm từ tàu chở dầu vào bể chứa của một hệ thống đường ống dẫn dầu… Ngoài ra, ứng dụng của bài toán còn để giải các bài toán như: Bài toán đám cưới vùng quê, bài toán về hệ thống đại diện chung, bài toán phân nhóm sinh hoạt, bài toán lập lịch cho hội nghị …Trong phạm vi đề tài này tôi sẽ trình bày “bài toán luồng cực đại trong mạng với khả năng thông qua các cung các đỉnh” và phải nhờ thuật toán của Ford và Fulkerson để giải bài toán đặt ra và nêu một số ứng dụng của bài toán.

I PHÁT BIỂU BÀI TOÁN1.Bài toán

Giả xử trong đồ thị G = (V,E), ngoài khả năng thông qua của các cung c(u,v), ở mỗi đỉnh v V còn có khả năng thông qua của đỉnh là d(v), và đòi hỏi tổng luồng đi vào đỉnh v không còn vượt quá d(v), tức là

Cần phải tìm luồng cực đại giữa s và t trong mạng như vậy.

Xây dựng một mạng G’ sao cho: mỗi đỉnh v của G tương ứng với hai đỉnh v+, v-

trong G’, mỗi cung (u,v) trong G ứng với cung (u,v+) trong G’, mỗi cung (v,w) trong G ứng với cung (v-,w+) trong G’ Ngoài ra, mỗi cung (v+,v-) trong G’ có khả năng thông qua là d(v), tức là bằng khả năng thông qua của đỉnh v trong G.

2 Giải quyết bài toán

Từ mạng G = (V,E) khả năng thông qua các cung và các đỉnh Ta sẽ giải quyết

theo hai bước sau:

Trang 2

Thí dụ 1 Hình 1a cho ví dụ mạng G với khả năng thông qua ở cung và đỉnh

Hình 1b là mạng G’ tương ứng chỉ có khả năng thông qua ở các cung.

Hình 1

Do luồng đi vào đỉnh v+ phải đi qua cung (v+,v-) với khả năng thông qua d(v), nên luồng cực đại trong G’ sẽ bằng luồng cực đại trong G với khả năng thông qua của

Trang 3

-3 Ma trận biểu diễn đồ thị của bài toán luồng cực đại.

3.1 Biểu diễn mạng G với khả năng thông qua các cung - đỉnh

Giả sử mạng G = (V,E), |V| = n Ta có thể biểu diễn bởi ma trận trọng số A cấp

n x n như sau:

Trong đó: di là khả năng thông qua đỉnh i; C[i,j] khả năng thông qua cung [i,j].

3.2 Biểu diễn mạng G’ tương ứng với mạng G

Mạng tương ứng với G = (V,E), |V | = n là mạng G’ = (V’,E’), |V’| = 2 |V |, |E’| = 2 |E | - 1 Được biểu diễn thông qua ma trận A’ cấp (2n x 2n) như sau:

Trang 4

-Thí dụ 2 Như thí dụ trên có mạng G như sau:

Trang 5

-Áp dụng T.T Ford-Fulkerson tìm luồng cực đại cho mạng G’ ta được mạng cực

đại và ma trận biểu diễn nó như sau:

Với Val(f*) = 6

4 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 như vậy ta sẽ gọi là luồng cực đại trong mạng.

4.1 Thuật toán Ford – Fulkerson tìm luồng cực đại trong mạng

Bắt đầu từ mạng với luồng trên tất cả các cung bằng 0 ( ta sẽ gọi luồng như vậy là luồng không ), và lặp lại bước lặp sau đây cho đến khi thu được luồng mà đối với nó không còn luồng tăng:

Thuật toán

10 Xuất phát từ một luồng chấp nhận được f.

20 Tìm một đường đi tăng luồng P Nếu không có thì thuật toán kết thúc Nếu có, tiếp bước 3 dưới đây.

30 Nếu δ(P) = + thuật toán kết thúc.

Trong đó δ(P) - Lượng luồng tăng thêm, hay nói khác là làm sự tăng luồng (flow

augmentation) dọc theo đường đi tăng luồng P một lượng thích hợp mà các ràng buộc của bài toán vẫn thoả.

Sơ đồ của thuật toán Ford – Fulkerson có thể mô tả trong thủ tục sau đây:

Trang 6

-for v 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;

Để tìm đường tăng luồng trong Gf có thể sử dụng thuật toán tìm kiếm theo

chiều rộng ( hay thuật toán tìm kiếm theo chiều sâu) bắt đầu từ đỉnh s, trong đó không cần xây dựng tường minh đồ thị Gf Ford- Fulkerson đề nghị thuật toán gán nhãn chi tiết sau đây để giải bài toán luồng trong mạng Thuật toán bắt đầu từ luồng chấp nhận được nào đó trong mạng ( có thể bắt đầu từ luồng không) sau đó ta sẽ tăng luồng bằng cách tìm các đường tăng luồng Để tìm đường tăng luồng ta sẽ áp dụng phương pháp gán nhãn cho các đỉnh Mỗi đỉnh trong quá trình thực hiện thuật toán sẽ ở một trong ba

trạng thái: chưa có nhãn, có nhãn chưa xét, có nhãn đã xét Nhãn của một đỉnh v gồm 2 phần và có một trong hai dạng sau: [+p(v), ε(v)] hoặc [-p(v), ε(v)] Phần thứ nhất +p(v) (-p(v)) chỉ ra là cần tăng (giảm) luồng theo cung (p(v),v) cung (v,p(v)) còn phần

thứ hai ε(v) chỉ ra lượng lớn nhất có thể tăng hoặc giảm theo cung này Đầu tiên chỉ có đỉ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 cho tất cả các đỉnh kề với nó và nhãn của đỉnh s sẽ trở thành nhãn đã 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ả các nhãn chưa có nhãn kề với nó và nhãn của đỉnh v trở thành nhãn đã xét Quá trình sẽ được lặp lại cho đến 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 là đã xét nhưng đỉnh t vẫn chưa có nhãn Trong trường hợp thứ nhất

ta tìm được đường tăng luồng, còn trong 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 và đối với luồng mới thu được 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 sẽ kết thúc khi nào đối với luồng đang có trong mạng không tìm được đường tăng luồng.

Thuật toán gán nhãn (The labeling algorithm)

Gọi VT là tập mọi đỉnh đã gán nhãn nhưng chưa được thăm Ta có thuật toán để tìm đường đi tăng luồng.

Xuất phát với VT = {s} và s là nút đã đánh dấu duy nhất.Một bước lặp sẽ có VT hiện hành và gồm ba bước như sau.

10 Nếu t VT hoặc VT = , thuật toán kết thúc Ngược lại thì chọn một đỉnh u

VT để thăm và đưa nó ra khỏi VT Xét tất cả các đỉnh cạnh u, tức là xét mọi cung có dạng (u,v) và (v,u).

20 Nếu (u,v) E, F(u,v) < C(u,v) và v chưa gán nhãn thì gán nhãn nó và đưa v vào tập VT.

6

Trang 7

30 Nếu (v,u) E, F(v,u) > 0 và v chưa gán nhãn thì gán nhãn nó và đưa vào tập VT.

Bây giờ ta xét kết quả của thuật toán gán nhãn Nó có kết thúc hữu hạn hay

không? Nhận xét rằng một đỉnh được vào tập VT chỉ khi chuyển từ chưa gán nhãn Do

đó một đỉnh chỉ được vào VT nhiều nhất là một lần Mà mỗi bước lặp bỏ một đỉnh ra

khỏi VT Do đó, vì số đỉnh của mạng là hữu hạn, thuật toán phải kết thúc hữu hạn.

Thí dụ 3 Áp dụng thuật toán Ford-Fullkerson tìm luồng cực đại bằng cách gán

nhãn cho luồng zero sau:

Trang 10

Sơ đồ thuật toán Ford-Fullkerson tổng quát

Trang 11

Sơ thuật toán Find_Path (Chi tiết) { Trả về TRUE nếu có đường tăng luồng }

Trang 13

Sơ đồ thuật toán tăng luồng (Inc_Flow) { Tăng luồng nếu có đường tăng }

Trang 14

Chương 3

CÀI ĐẶT BÀI TOÁN

I.Cấu trúc dữ liệu trong chương trình

1 Input: Nhập mạng G = (V,E) với khả năng thông qua các cung các đỉnh.

* Ma trận luồng cực đại của mạng đó

* Giá trị luồng cực đại Val(f*).

Mạng tương ứng với G = (V,E), |V | = n là mạng G’ = (V’,E’), |V’| = 2 |V |, |E’| = 2 |E | - 1 Được biểu diễn thông qua ma trận A’ cấp (2n x 2n) như sau:

Chú ý: Ta có thể Input ma trận A biểu diễn mạng G = (V,E) với khả năng thông

qua các cung Sau đó, Output ma trận và giá trị luồng cực đại của mạng đó

Trang 15

II Tên một số hàm và thủ tục của chương trình nguồn

Chương trình được viết bằng ngôn ngữ Pascal Sau đây là tên một số hàm và thủ tục của chương trình nguồn:

Procedure NMatranCD; { Thủ tục nhập ma trận biểu diễn mạng với khả năng thông qua các cung các đỉnh }

Procedure Find_PathL; { Thủ tục tìm đường tăng luồng } Procedure inc_FlowL; { Thủ tục tăng luồng }

Procedure Max_Flow; { Thủ tục tăng luồng toàn bộ }

Procedure NewfileL; { Thủ tục nhập ma trận biểu diễn mạng với khả năng thông qua

Trang 16

2 Giao diện Input ma trận biểu diễn mạng G = (V,E) với khả năng thông qua các cung các đỉnh.

3 Giao diện Output ma trận biểu diễn mạng G’ = (V’,E’) với khả năng thông qua các cung tương ứng, ma trận luồng cực đại và giá trị luồng cực đại.

16

Ngày đăng: 21/08/2012, 16:14

HÌNH ẢNH LIÊN QUAN

Thí dụ 1. Hình 1a cho ví dụ mạng G với khả năng thông qua ở cung và đỉnh. - BÀI TOÁN LUỒNG CỰC ĐẠI .doc
h í dụ 1. Hình 1a cho ví dụ mạng G với khả năng thông qua ở cung và đỉnh (Trang 2)

TỪ KHÓA LIÊN QUAN

w