Tải bản đầy đủ (.doc) (13 trang)

Bao cao PTĐGTT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (172.09 KB, 13 trang )

CHƯƠNG 1: LUỒNG CỰC ĐẠI
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
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.
1. Mạng
Định nghĩa: Ta gọi mạng là đồ thị có hướng G = (V,E), trong đó có duy nhất
một đỉnh s không có cung đi vào gọi là điểm phát, duy nhất một đỉnh t không có cung
đi ra gọi là điểm thu và mỗi cung e = (v,w)  E được gán với một số không âm c(e)
= c(v,w) gọi là khả năng thông qua của cung e.
Để thuận tiện cho việc trình bày ta sẽ quy ước rằng nếu không có cung (v,w)
thì khả năng thông qua c(v,w) được gán bằng 0.
2. Luồng trên mạng
Định nghĩa: Giả sử cho mạng G = (V,E). Ta gọi luồng f trong mạng G = (V,E)
là ánh xạ f: Eà R+ gán cho mỗi cung e =(v,w)  E một số thực không âm f(e) =
f(v,w), gọi là luông trên cung e, thoả mãn các điều kiện sau:
+ Luồng trên mỗi cung e  E không vượt quá khả năng thông qua của nó: 0 ≤
f (e) ≤ c(e),
+ Điều kiện cân bằng luồng trên mỗi đỉnh của mạng : Tổng luồng trên các
cung đi vào đỉnh v bằng tổng luồng trên các cung đi ra khỏi đỉnh v, nếu v  s,t:
Div f (v) 



f (v ) 

w ( v )



f (v, w) 0



w ( v )

Trong đó   (v) - tập các đỉnh của mạng mà từ đó có cung đến v,   (v) - tập các đỉnh
của mạng mà từ v có cung đến nó:
  (v)  w  V : ( w, v)  E ,   (v)  w  V : (v, w)  E .

3. Giá trị của luồng
val ( f ) 

 f ( s, w)   f ( w, t ).

w ( s )

w ( t )

1


Giá trị của một luồng được tính bằng tổng giá trị trên các cung đi ra từ đỉnh
nguồn s (đỉnh 1 Hình 1), hoặc tổng giá trị trên các cung đi vào đỉnh thứ t (đỉnh 6 Hình
1).

Hình 1: Luồng cực đại. Hai số trên từng cạnh tương ứng là giá trị luồng -  và khả năng
thông qua của từng cặp cạnh - f. x0 là đỉnh phát, z là đỉnh thu.

4. Ứng dụng thực tế. Ví dụ.
- Xét đồ thị tương ứng hệ thống ống dẫn dầu. Trong đó các ống tương ứng với
các cung, điểm phát là tàu chở dầu, điểm thu là bể chứa, các điểm nối của ống là các
nút của đồ thị. Khả năng thông qua của các cung tương ứng là tiết diện các ống. Cần

phải 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.
- Xác định cường độ lớn nhất của dòng vận tải giữa 2 nút của một bản đồ giao
thông.
- Bài toán cặp ghép: có m chàng trai và n cô gái. Mỗi chàng trai ưa thích một
số cô gái. Hãy tìm cách ghép cặp sao cho số cặp ghép được là nhiều nhất.
5. Một số thuật toán về luồng cực đại
5.1. Bài toán luồng cực đại trên mạng
5.1.1. Lát cắt. Đường tăng luồng
- Lát cắt.
Định nghĩa. Ta gọi lát cắt (X,X*) là một cách phân hoạch tập đỉnh V của
mạng ra thành hai tập X và X*=V \ X, trong đó s ∈ X và t ∈ X*. Khả năng thông
qua của lát cắt (X,X*) là số.
Lát cắt với khả năng thông qua nhỏ nhất được gọi là lát cắt hẹp nhất.

2


Bổ đề 1. Giá trị của mọi luồng f trong mạng luôn nhỏ hơn bằng khả năng thông
qua lát cắt (X,X*) bất kỳ trong nó: val(f) <= c(X,X*).
Hệ quả 1. Giá trị luồng cực đại trong mạng không vượt quá khả năng thông
qua của lát cắt hẹp nhất trong mạng. Giả sử f là một luồng trong mạng G = (V,E). Từ
mạng G = (V,E) ta xây dựng đồ thị có trọng số trên cung Gf =(V,Ef), với tập cung Ef
và trọng số trên các cung được xác định theo quy tắc sau:
* Nếu e = (v,w) ∈ E với f(v,w) = 0, thì (v,w)∈ Ef với trọng số c(v,w);
* Nếu e = (v,w) ∈ E với f(v,w) = c(v,w), thì (v,w)∈ Ef với trọng số f(v,w);
* Nếu e = (v,w) ∈ E với 0
Các cung của Gf đồng thời cũng là cung của G được gọi là cung thuận, các
cung còn lại gọi là cung nghịch. Đồ thị Gf được gọi là đồ thị tăng luồng.
Ví dụ: Các số viết cạnh các cung của G ở hình 1 theo thứ tự là khả năng thông

qua và luồng trên cung.
- Đường tăng luồng.
Giả sử P = (s = v0,v1,v2,…,vk= t) là một đường đi từ s đến t trên đồ thị tăng
luồng Gf. Gọi d là giá trị nhỏ nhất của các trọng số của các cung trên đường đi P. Xây
dựng luồng f' trên mạng G theo quy tắc sau:
f(u,v) = f(u,v) + d,

nếu (u,v) ∈ P là cung thuận

f(u,v) = f(u,v) - d,

nếu (u,v) ∈ P là cung nghịch

f(u,v) =

nếu (u,v) không

f(u,v),

Ví dụ:
Dãy { (x0x1) (x1x4) (x4 x3) (x3z) } là đường tăng được. Thêm vào các cung
trên dãy này một giá trị là 2. Hàm ’ nhận được vẫn là luồng.

3


Hình 2: Đường tăng luồng

Dễ dàng kiểm tra được rằng f' được xây dựng như trên là luồng trong mạng và
val(f')= val(f) + d. Ta sẽ gọi thủ tục biến đổi luồng vừa nêu là tăng luồng dọc theo

đường P.
5.1.2. Thuật toán Ford-Fulkerson
+ Xuất phát từ một luồng chấp nhận được f.
+ 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.
+ 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ả.
Cách tìm đường đi tăng luồng. Ta sử dụng thuật toán gán nhãn có nội dung
như sau. Một đường đi P thoả mãn về đường đi tăng luồng, nhưng chỉ đi từ s đến k
nào đó (chưa tới t, nói chung) sẽ được gọi là đường đi chưa bão hoà (unsaturated
path).
Ta nói đỉnh u là đã đánh dấu (u is labeled) nếu ta biết là có một đường đi chưa
bão hoà từ s tới u. Bây giờ ta sẽ xét tất cả các đỉnh v có nối trực tiếp đến đỉnh u (sẽ
gọi là ở cạnh đỉnh u) xem chúng có thể được gán nhãn hay không khi u đã gán nhãn.
Việc này được gọi là thăm (scanning) đỉnh u.
Nếu (u,v) có luồng trên cung F(u,v) < C(u,v) thì ta có thể nối thêm cung (u,v)
và đường đi chưa bão hoà P từ s đến u để được đường đi chưa bão hoà tới v. Vậy v có
thể gán nhãn.
Bước lặp tăng luồng (Ford - Fulkerson): Tìm dường tăng P đối với luồng hiện
có. Tăng luồng dọc theo đường P.
Khi đã có luồng cực đại, lát cắt hẹp nhất có thể tìm theo thủ tục mô tả trong
chứng minh định lý 1.
Thuật toán Ford – Fulkerson được mô tả trong thủ tục sau:
Procedure Max_Flow;
4


(* Thuật toán Ford – Fulkerson *)

begin
(* Khởi tạo: Bắt đầu từ luồng với giá trị 0 *)
for u  V do
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;
* 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.
+ 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).
+ 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.
+ 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.

5


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

Mạng với luồng zero


Stop:= False

Tăng luồng
True
not Stop

True

Find_Path

False

Path-Found
False
Stop:= False

Mạng với luồng
cực đại

End

Định lý 2 (Định lý về luồng cực đại trong mạng và lát cắt hẹp nhất). Luồng
cực đại trong mạng bằng khả năng thông qua của lát cắt hẹp nhất.
Định lý 3. (Định lý về tính nguyên). Nếu tất cả các khả năng thông qua là các
số nguyên thì luôn tìm được luồng cực đại với luồng trên các cung là các số nguyên.
5.2. Thuật toán song song tìm luồng cực đại
Hiện nay, mô hình xử lý song song đã và đang phát triển mạnh mẽ giải quyết
những vấn đề bế tắc mà mô hình xử lý tuần tự gặp phải như vấn đề thời gian thực hiện
6



chương trình, tốc độ xử lý, khả năng lưu trữ của bộ nhớ, xử lý dữ liệu với quy mô
lớn....
Trong bối cảnh đó, thuật toán tìm luồng cực đại cần được phát triển theo hướng
song song nhằm phát huy sức mạnh của bài toán.
5.2.1. Bài toán tìm luồng cực đại trên mạng
Cho mạng G(V,E,C), nguồn a, đích z. Trong số các luồng trên mạng G, hãy tìm
Client
Server
luồng

giá
trị
lớn
nhất.
1

Client
1

5.2.2. Ý tưởng thuật toán
Connect

Connect

Connect
Dựa trên thuật toán truyền thống và thuật toán hoán
chuyển nguồn đích, xây


dựng thuật toán song song tìm luồng cực đại. Ý tưởng của phương pháp này là thay vì
getData
trong

getNetworks
thuật toán truyền thống
dùng một bộ vi xử lý thực hiện
công việc tuần tự từ đỉnh
getData

nguồn đến đỉnh đích. Trong thuật toán song song sử dụng hai bộ vi xử lý thực hiện
công
Waiting

việc song song, vi xử lý 1 xuất phát từ đỉnh nguồn, viWaiting
xử lý 2 xuất phát từ đỉnh
Start

đích. Hai vi xử lý trong quá trình tìm đường tăng luồng sẽ gặp nhau ở đỉnh trung gian
t nào đó, công việc tiếp theo vi xử lý 1 xử lý công việc từ đỉnh t đến nút nguồn, vi xử
lý 2 xử lý công việc từ đỉnh
t đến nút đích.
getDat

Init()

Init()

a


5.2.3. Xây dựng thuật toán song song
getData

 với nguồn
 Đầu vào: Mạng G V , E T
a, đích z, khả năng thông qua:
Display
St
op

C   cij  ,  i, j  �G .

getData

F

Các
sắp xếp theo thứEnd
tự nào đó.
CheckSteped
T đỉnh trong G được
Exit

St
op

T

 Các bước


Step
ed=1
=2

getStep

Bước1: Khởi tạo

F

Bước 2: Sinh nhãn
F
T

Step
=2

T

If(c1ed=1&c2ed=
1) then Step=2;
Danh thuc C1, C2
sinh nhan

ed
=2

_label

C1, C2 tang luong,

xoa nhan

Exit

getStep

If(c1ed1=2|c2ed=2)

then c1ed=2, c2ed=2,
Bước 3: Hiệu chỉnh
xóa
Step tăng luồng,
Step=3, Danh
thucnhãn.
Assign

T

St
op
F

 Đầu ra: Luồng cực đại F  f ij ,  i, j   G .

F

F

_Maxflow


T
Assign
_label

Step
=2

Đây là thuật toán song song tổng quát, có thể áp dụng hiệu quả cho các loại
F

F

mạng. Nếu thuật toán được cài đặt trong môi trường xử lý song song tối ưu, dự kiến
T

Step

Inc_flow

T

T

if(c1ed1=3&c2ed=3

then c1ed=1,
Stepthống.
thời gianDel_label
tính toán sẽ giảm đied một nửa)c2ed=1,
so với

thuật toán truyền
Step=2,
=3

Step
=3

=3

F

F
T

Step
=4

Danh thuc C1, C2
sinh nhan
l

T
Step
ed
=4

Stop=True

F


F
Waiting

If(c1ed=4|
c2ed=4)then c1ed=4,
c2ed=4, Step=4;
Thong bao dung C1,
C2

Inc_flow
Del_label

F
T
Step
=4

Stop=True

7

F
Waiting


CHƯƠNG 2: BÀI TOÁN ỨNG DỤNG
1. Ứng dụng thuật toán Ford-Fullkerson giải bài toán luồng cực đại
Bài toán thực tế:
Dầu được bơm từ tàu chở dầu (đỉnh s) qua các trạm trung chuyển (các đỉnh b,
c, d, e) tới bể chứa (đỉnh t). Các cung có hướng của đồ thị biểu diễn các đường ống

dẫn và cho biết hướng của luồng dầu trong ống. Các số trên cung là các khả năng
thông qua (có thể hiểu là thiết diện) của các ống dẫn dầu tương ứng. Cần xác định
luồng dầu lớn nhất có thể bơm từ tàu chở dầu vào bể chứa bằng cách nào (lượng dầu
bơm qua từng trạm theo các đường ống đã cho)?
Á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
đỉnh của mạng G với luồng f được cho như Hình 3, hai số viết bên cạnh mỗi cung là
khả năng thông qua và luồng của các cung. Kết quả các bước của thuật toán mô tả bởi
các đồ thị và bảng dưới đây. Mạng với luồng cực đại thu được ở Hình 4. Lát cắt bé
nhất là X = {s,c}, X* = {b,d,e,t} và giá trị luồng cực đại là 9.
b

d

6,4

6,5

5,4

t

3,1

s

3,0
5,2

c


6,1

e

1,1

Hình 3
+ Bước lặp 1: s  b  d  t, 1 = 1
b(s+,1)

6,4

6,5

5,4

s
(s,)

d(b+,1)
t(d+,1)

3,1
3,0

5,2

c(s+,3)
b


6,1

e(b+,1)

1,1

d

6,5

6,6

5,5

t

3,1

s

3,0
5,2

c

1,1

6,1

e


8


+ Bước lặp 2: s  c  d  b  e  t, 2 = 2
b(d-,2)

d(c+,2)

6,5

6,6

5,5

s
(-,)

t(e+,2)

3,1
3,0

5,2

c(s+,3)
b

6,1


e(b+,2)

1,1

d

6,3

6,6

5,5

t

3,3

s

3,2
5,4

c

6,3

e

1,1

+ Bước lặp 3: Không còn đường tăng luồng, Val(fmax) = 5+4 = 9

b

d

6,3

6,6

5,5

t

3,3

s

3,2
5,4

c

1,1

6,3

e

Hình 4. Mạng G với luồng cực đại và lát cắt hẹp nhất

Độ phức tạp của thuật toán:

Nếu các khả năng thông qua là các số rất lớn thì giá trị luồng cực đại cũng có
thể là rất lớn và khi đó thuật toán mô tả ở trên sẽ đòi hỏi rất nhiều bước tăng luồng.
Ví dụ trong hình 5 sẽ minh hoạ cho điều này. Hình 5(a) mô tả mạng cần xét với khả
năng thông qua trên các cung. Hình 5(b) mô tả luồng trên các cung (số thứ hai bên
cạnh cung) sau khi thực hiện tăng luồng dọc theo đường tăng luồng (s,a,b,t). Hình
5(c) mô tả luồng trên các cung sau khi thực hiện tăng luồng dọc theo đường tăng
luồng (s,b,a,t). Rõ ràng, sau 2.106 lần tăng luồng theo đường (s,b,a,t) và (s,b,a,t) một
cách luân phiên ta thu được luồng cực đại.

9


s

s
106

106,1

106
1

a

b
106

106

a


s
106,0

1,1

b
106,0

106,1

106,1

106,1
1,0

a

b
106,1

106,1

t

t

t

(a)


(b)

(c)

Hình 5: Ví dụ tồi tệ với thuật toán Ford- Fulkerson.
Hơn thế nữa nếu các khả năng thông qua là các số vô tỷ, người ta còn xây dựng
được ví dụ để cho thuật toán không dừng, và tệ hơn là dãy các giá trị luồng xây dựng
theo thuật toán hội tụ thì nó còn không hội tụ đến giá trị luồng cực đại. Như vậy,
muốn thuật toán làm việc hiệu quả, việc lựa chọn đường tăng luồng cần được tiến
hành hết sức cẩn thận.
Edmonds và Karp chỉ ra rằng nếu đường tăng luồng được chọn là đường ngắn
nhất từ s đến t trên đồ thị Gf . Điều đó có thể thực hiện, nếu trong thủ tục tìm đường
tăng Find_Path mô tả ở trên, danh sách V T được tổ chức dưới dạng QUEUE (nghĩa là
ta thực hiện tìm đường tăng bởi thủ tục tìm kiếm theo chiều rộng) thì thuật toán sẽ kết
thúc sau không quá mn/2 lần sử dụng đường tăng luồng. Nếu để ý rằng, tìm kiếm theo
chiều rộng trên đồ thị đòi hỏi thời gian O(n+m), thì thuật toán thu được sẽ có độ phức
tạp tính toán là O(nm2).
2. Chương trình ứng dụng
2.1. Dữ liệu đầu vào
Input: file văn bản “luong.inp”
- Dòng 1: Chứa 3 số nguyên là số đỉnh của mạng n, đỉnh phát s, đỉnh thu t.
- Các dòng tiếp theo: Là một ma trận kích thước n x n thể hiện ma trận trọng số
của đồ thị có hướng minh hoạ cho mạng cần tìm luồng cực đại.

10


2.2. Dữ liệu đầu ra
Output: Dữ liệu đầu ra được cho trong file Luong.out có dạng như sau:

- Phần đầu tiên là một ma trận kích thước n x n thể hiện luồng cực đại tìm
được (phần tử (i,j) của ma trận là luồng trên cung (i,j)).
- Dòng tiếp theo là một số nguyên cho biết giá trị luồng cực đại trong mạng.
2.3. Mô tả dữ liệu

b

d

6,4

6,5

5,4

t

3,1

s

3,0
5,2

c

1,1

6,1


e

Hình 6
Mô tả dữ liệu dựa trên hình 6

Luong.inp
616

Luong.out
0 5 4 0 0 0

055000

0 0 0 2 3 0

000630

0 0 0 3 1 0

000310

0 0 0 0 0 5

000006

0 0 0 0 0 4

000006

0 0 0 0 0 0


000000

9

11


Tài liệu tham khảo
[ 1 ] Nguyễn Đức Nghĩa – Nguyễn Tô Thành Toán rời rạc
[ 2 ] Lê Minh Hoàng Giải thuật và lập trình
[ 3 ] Kenet H. Rosen Toán học rời rạc và ứng dụng trong tin học
[ 4 ] Nguyễn Anh Cường Xử lý tự động trong tin học văn phòng
[ 5 ] Nguyễn Anh Cường Hướng dẫn lập trình với C#
[ 6 ] , Website của K23 CNTT, Học viện Kỹ thuật Quân sự.
, Website của Khoa CNTT, Học viện Kỹ thuật Quân sự.

12


13



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×