Tải bản đầy đủ (.pdf) (16 trang)

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 pot

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 (880.85 KB, 16 trang )

1

Chương 2

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

Bài tốn luồng cực đại trong mạng là một trong số những bài tố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 tố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 tốn luồng cực đại
trong mạng có nhiều ứng dụng trong thực tế như: Bài tố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 tố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…Ngồi ra, ứng dụng của bài tốn còn để giải các bài tốn như: Bài tốn đám cưới
vùng quê, bài tốn về hệ thống đại diện chung, bài tốn phân nhóm sinh hoạt, bài tố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 tố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 tốn của
Ford và Fulkerson để giải bài tốn đặt ra và nêu một số ứng dụng của bài tốn.

I. PHÁT BIỂU BÀI TỐN
1.Bài tốn

Giả xử trong đồ thị G = (V,E), ngồ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à




Vw
vdvwf )(),(

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’. Ngồ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 tố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:

1
0

Xác định mạng G’.
2
0
Tìm luồng cực đại trong mạng G’. Bắt đầu từ luồng zero với khả năng
thông qua cung.



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 các cung và đỉnh.

Hai bước trên ta có thể biểu diễn dưới dạng sơ đồ thuật tốn sau:



















C[v,t]

C[u,t]

C[s,v]
C[s,u]

t
-

d
t
t
+

C[u,v]

v
-

d
v
v
+

u
-

d

u
u
+

s
-

d
s
s
+

(b)
C[u,v]
C[v,t] C[s,v]
C[u,t]
C[s,u]
t d
t
v d
v
u d
u
s

d
s
(a)
3

























3. Ma trận biểu diễn đồ thị của bài tố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 đó: d
i
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:







d
i
,nếu i = j

c[i,j] ,nếu [i,j]  E

0 ,nếu [i,j]  E
A = ( a
ij
) =
A’ = ( a’
ij


) =

0 nếu i = j

c[i,j] nếu [i,j]  E’

Begin


Mạng G
Mạng G’

Luồng cực đại trên G’

End

4

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









Ta có ma trận biểu diễn mạng G :









Tương tự từ mạng G’:











Ta có ma trận biểu diễn mạng G’ như sau:














s
[7]

1

3

2

4

5

t[6]

v[8]

u[6]

t
-

6

t
+


4

3

1

v
-

8

v
+

u
-

6

u
-

5

s
-

7


2

s
+

A =

s

u

v

t

7 5 2 0 s
0 6 1 4 u
0 0 8 3 v
0 0 0 6 t
A’ =

s
+
s
-
u
+
u
-
v

+
v
-
t
+
t
-

0 7 0 0 0 0 0 0 s
+

0 0 5 0 2 0 0 0 s
-

0 0 0 6 0 0 0 0 u
+

0 0 0 0 1 0 4 0 u
-

0 0 0 0 0 8 0 0 v
+

0 0 0 0 0 0 3 0 v
-

0 0 0 0 0 0 0 6 t
+

0 0 0 0 0 0 0 0 t

-
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 tố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 tố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 tốn

1
0
Xuất phát từ một luồng chấp nhận được f.
2
0
Tìm một đường đi tăng luồng P. Nếu không có thì thuật tốn kết thúc. Nếu
có, tiếp bước 3 dưới đây.
3
0
Nếu

(P) = +

thuật tố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 tốn vẫn thoả.

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


Procedure Max_Flow;
(* Thuật tốn Ford – Fulkerson *)
begin
(* Khởi tạo: Bắt đầu từ luồng với giá trị 0 *)
for u

V do
C

=

s
+
s
-
u
+
u
-
v
+
v
-
t
+
t
-

0 6 0 0 0 0 0 0 s

+

0 0 4 0 2 0 0 0 s
-

0 0 0 4 0 0 0 0 u
+

0 0 0 0 0 0 4 0 u
-

0 0 0 0 0 2 0 0 v
+

0 0 0 0 0 0 2 0 v
-

0 0 0 0 0 0 0 6 t
+

0 0 0 0 0 0 0 0 t
-
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 G
f
có thể sử dụng thuật tốn tìm kiếm theo
chiều rộng ( hay thuật tố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ị G
f
. Ford- Fulkerson đề nghị thuật tốn gán nhãn chi
tiết sau đây để giải bài tốn luồng trong mạng. Thuật tố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 tố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 đó
xố 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 tố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 tốn gán nhãn (The labeling algorithm)

Gọi V
T
là tập mọi đỉnh đã gán nhãn nhưng chưa được thăm. Ta có thuật tốn để
tìm đường đi tăng luồng.
Xuất phát với V
T
= {s} và s là nút đã đánh dấu duy nhất.
Một bước lặp sẽ có V
T
hiện hành và gồm ba bước như sau.

1
0
Nếu t

V
T
hoặc V
T
=


, thuật tốn kết thúc. Ngược lại thì chọn một đỉnh u

V
T
để thăm và đưa nó ra khỏi V
T
. 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).
2
0
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 V
T
.
7

3
0
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 V
T
.
Bây giờ ta xét kết quả của thuật tố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 V
T
chỉ khi chuyển từ chưa gán nhãn.

Do đó một đỉnh chỉ được vào V
T
nhiều nhất là một lần. Mà mỗi bước lặp bỏ một đỉnh
ra khỏi V
T
. Do đó, vì số đỉnh của mạng là hữu hạn, thuật tốn phải kết thúc hữu hạn.

Thí dụ 3. Áp dụng thuật tốn Ford-Fullkerson tìm luồng cực đại bằng cách gán
nhãn cho luồng zero sau:







+ Bước lặp 1: s  a  b  t,

1
= 4

















+ Bước lặp 2: s  a  b  c  e  t,

2
= 2











7,0

4,0

12,0

3,0

4,0


5,0

9,0

5,0

7,0

4,0

6,0

c

d

e

t

b

s

a

c(s+,
4
)


7,0

4,0

12,0

3,0

4,0

5,0

9,0

5,0

7,0

4,0

6,0

d(s+,
7
)

e(d+,
4
)


t(e+,
2
)

b(a+,
6
)

s
(s,

)
a(s+,
6
)

7,4

4,4

12,0

3,0

4,0

5,0

9,0


5,0

7,
0

4,0

6,4

c

d

e

t

b

s

a

c(b+,2)
7,4

4,4

12,0


3,0

4,0

5,0

9,0

5,0

7,0

4,0

6,4

d(s+,
7
)

e(c+,
2
)

t(e+,2)
b(a+,
2
)


s
(s,

)
a(s+,
2
)

8










+ Bước lặp 3: s  c  e  t,

3
= 1


















+ Bước lặp 4: s  d  e  t,

4
= 7


















c

7,6

4,4

12,2

3,2

4,2

5,0

9,0

5,0

7,0

4,0

6,6

d

e

t


b
s

a

c(s+,
4
)

7,6

4,4

12,2

3
,2

4,2

5,0

9,0

5,0

7,0

4,0


6,6

d(s+,7)
e(c+,
1
)

t(e+,
1
)

b(a+,1)
s
(s,

)

a(s+,0)
c

7,6

4,4

12,3

3,3

4,2


5,0

9,0

5,0

7,0

4,1

6,6

d

e

t

b

s

a

c(s+,
3
)

7,6


4,4

12,3

3,3

4,2

5,0

9,0

5,0

7,0

4,1

6,6

d(s+,7)
e(d+,
7
)

t(e
+,
7
)


b(a+,1)
s
(s,

)

a(s+,0)
c

7,6

4,4

12,10

3,3

4,2

5,0

9,7

5,0

7,7

4,1


6,6

d

e

t

b

s

a

9

+ Bước lặp 5: s  c  d  e  t,

5
= 2


















+ Bước lặp 6: Không còn đường tăng luồng nữa, Val(f
max
) = 6+3+7 = 16.



























c(s+,
3
)

7,6

4,4

12,10

3,3

4,2

5,0

9,7

5,0

7,7

4,1


6,6

d(c+,3)
e(d+,
2
)

t(e+,
2
)

b(a+,1)
s
(s,

)

a(s+,0)
c

7,6

4,4

12,12

3,3

4,2


5,0

9,9

5,2

7,7

4,3

6,6

d

e

t

b

s

a

10

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













































False

True

False

True


Begin


Mạng với luồng zero

Stop:= False


not Stop



Find_Path

Path
-
Found


Tăng luồng

Stop:= False

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

End

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














































False

False

True

False

True

False

True


C[u,v] >0 and
(F[u,v]<C[u,v])

True


Begin


V
T







u


V
T
;


PathFound:= True


v= t


P[v]:= u;

[v]:=min{

[u],C[u,v]-F[u,v]}
V
T
:= V
T


{v}


P[t]:= s ;

[t]:= +


V
T

= V\{s}
For vV\V
T


C[v,u]>0 and
F[v,u]>0


P[v]:= -u;

[v]:= min{

[u],F[v,u]}
V
T
:= V
T
 {v}

End


12














































False


End


PathFound:= False

True


v= t



End

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












































False

False

True

True


Begin


f[v,u]:=f[v,u] + tang


u:=v; v:=P[u]

End


u  s

v > 0



v:=
-
v

f[v,u]:=f[v,u]
-

tang


v:= P[
t] ; u:= t ; tang:=

[t]

14


Chương 3

CÀI ĐẶT BÀI TỐ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.
* Nhập số đỉnh:
* Nhập ma trận A biểu diễn mạng G = (V,E) với khả năng thông qua các cung
các đỉ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 đó: d
i
là khả năng thông qua đỉnh i; C[i,j] là khả năng thông qua cung [i,j].

2. Output
* Ma trận A’ 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 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 đó.



A’ = ( a’
ij

) =

0 nếu i = j

c[i,j] nếu [i,j]  E’

d
i
,nếu i = j

c[i,j] ,nếu [i,j]  E


0 ,nếu [i,j]  E
A = ( a
ij
)
=

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 tồ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
các cung }
…………………………………………………

III.Một số giao diện của chương trình

1. Giao diện chính






























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.










×