• 検索結果がありません。

最小全域木と最大流問題

N/A
N/A
Protected

Academic year: 2021

シェア "最小全域木と最大流問題"

Copied!
45
0
0

読み込み中.... (全文を見る)

全文

(1)

最小全域木と最大流問題

落合 秀也

離散数学

(2)

今日の内容

最小全域木

プリムのアルゴリズム

最大流問題

フォード・ファルカーソンのアルゴリズム

2

(3)

今日の内容

最小全域木

プリムのアルゴリズム

最大流問題

フォード・ファルカーソンのアルゴリズム

3

(4)

最小全域木を考える

Minimum Spanning Tree Problem

ラベル付

(

重み付

)

グラフ

G(V, E)

が与えられたとき、ラ

ベルの和が最小となる全域木を作りたい

全域木

G(V, T)

Vのすべての頂点で構成される木

最小全域木

eT Ce

を最小にする T で作られる G(V,T) (Ceは辺eのラベル)

例:ラベルを地点間の配線コストとする

このとき、全地点がつながるネットワークを

最小コストで配線したい

4

2

3 5

2 2

4 1

6 7

9 8

4

1 8

8 4

8 5

3 1 5

4 2

(5)

H

プリム法による最小全域木の作成

考え方

任意の頂点を選び開始点sとする

Tを辺の集合とする (開始時は空と する)

Hの領域まで最小全域木の一部を 作っているとする。

Hから出る辺のうち、そのコストが 最小の辺で接続する頂点をHに取 り込む ・・・ (*)

その辺をTに追加する

H=Vとなるまで(*)を繰り返す

G(V,T) が最小全域木となる

5

5 2

a 3

b

c

d

e f

g

h s

6 7

4 7

3 6

5 8 8

5

3

(6)

プリムのアルゴリズム: 素直な実装

H := {s}

T := {}

While H ≠ V

min_length := ∞, min_edge := null Foreach (u,v) : uH, vH-V

If min_length > length(u,v) Then, min_length := length(u,v)

min_edge := (u,v) EndIf

EndFor

T.add ( min_edge )

H.add( min_edge.right ) EndWhile

6

5 2

a 3

b

c

d

e f

g

h s

6 7

4 7

3 6

5 8 8

5

3 時間計算量 O(nm)

この疑似コードの場合

(7)

練習

プリム法により、以下のグラフに対する最小全域木 を作成せよ

7

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

8

5

3 5

1 4 2

(8)

8

1.開始点を選ぶ

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(9)

9

2.コストが最小の辺を選び

接続する頂点を取り込む

(1/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(10)

10

2.コストが最小の辺を選び

接続する頂点を取り込む

(2/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(11)

11

2.コストが最小の辺を選び

接続する頂点を取り込む

(3/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(12)

12

2.コストが最小の辺を選び

接続する頂点を取り込む

(4/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(13)

13

2.コストが最小の辺を選び

接続する頂点を取り込む

(5/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(14)

14

2.コストが最小の辺を選び

接続する頂点を取り込む

(6/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(15)

15

2.コストが最小の辺を選び

接続する頂点を取り込む

(7/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(16)

16

2.コストが最小の辺を選び

接続する頂点を取り込む

(8/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(17)

17

2.コストが最小の辺を選び

接続する頂点を取り込む

(9/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(18)

18

2.コストが最小の辺を選び

接続する頂点を取り込む

(10/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(19)

19

2.コストが最小の辺を選び

接続する頂点を取り込む

(11/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(20)

20

2.コストが最小の辺を選び

接続する頂点を取り込む

(12/12)

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

s

8

5

(21)

21

3.最小全域木の完成

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

3 5

1 4 2

8

5

(22)

プリムのアルゴリズム(改良版)

H := {s}

T := {}

While H ≠ V

min_length := ∞, min_edge := null Foreach (u,v) : uH, vH-V

If min_length > length(u,v) Then, min_length := length(u,v)

min_edge := (u,v) EndIf

EndFor

T.add ( min_edge )

H.add( min_edge.right ) EndWhile

Foreach v V (v≠s) c[v] :=∞, prev[v]:=null Q.add(v)

EndFor c[s] :=0

While Q is not empty u := Q.extractMin() Foreach v in Adj[u]

If c[v] > length(u,v) Then, c[v] := length(u,v)

prev[v] := u

( Q.changeKey() ) EndIf

EndFor EndWhile ダイクストラ法で工夫したように、

ダイクストラ法とよく似た形に実装できる

改良前 改良後

(23)

確認

プリム法(改良版)により、以下 のグラフに対する最小全域木 を作成してみよ

23

2

3

5

2 2

4

1

6

7

9 8

4

1

8 8

4

8

5

3 5

1 4 2

While Q is not empty u := Q.extractMin() Foreach v in Adj[u]

If c[v] > length(u, v) Then, c[v] := length(u, v)

prev[v] := u EndIf

EndFor EndWhile

(24)

プリム法

:

計算量の考察

While文の内部は n回実行される。

Foreach文の内部は nm回実行される。

実装によっては O(nm) となりえる。

Q に リストや配列を使う場合

Q.extractMin() O(n) の時間を要する

Q.extractMin() n回 呼び出される

O(n2)

Q 2分ヒープを使う場合

Q.extractMin() O(log n)の時間を要する

Q.extractMin()の呼び出しはn回ある O(n log n)

c[v]の更新に伴うヒープの組換え処理に、O(log n)の時間を要する

c[v]の更新は、m回発生する O(m log n)

O( (n+m) log n ) 24

While Q is not empty u := Q.extractMin() Foreach v in Adj[u]

If c[v] > length(u, v) Then, c[v] := length(u, v)

prev[v] := u

( Q.changeKey() ) EndIf

EndFor EndWhile

(25)

今日の内容

最小全域木

プリムのアルゴリズム

最大流問題

フォード・ファルカーソンのアルゴリズム

25

(26)

最大流問題

Maximum Flow Problem

ラベル付

(

重み付

)

グラフ

G(V, E)

が与えられたとき、流入点

s

から流出点

t

までの総流量を最大化したい

辺のラベルの意味: 流量の容量

(

最大量

)

運べる荷物の量

流せる水の量

送れるパケット数

このとき、

sに流れ込む流量 = tから流れ出る流量 (グラフの外から見た場合) sから流れ出す流量 = tに流れ込む流量 (グラフの中で見た場合)

である。

この量の最大値

(とそのときのフロー)

をどう求めればよいか?

26

2

3 5 2

2

4

1 6 7

9 8

4

1 8

8 4

8 5

3 1 5

4 2

s

2 t

2 5 5

5 3

5 3

1 1 1

1 1

4 4

10 4

10

(27)

最大流問題:解決へのアプローチ

s-t間の適当な道を考え、その流 量上限(最小容量)を算出す

る・・・赤色のケース

赤色のフローを流しても余って いる別のs-t間の道を考える(逆 向きは押し戻すと考える)。この 際の、流量上限を算出する・・・

青色のケース

上記を繰り返していけば、徐々 に総流量が増えてやがてそれ 以上流せなくなる。これにより、

ネットワーク全体の最大流が求 まるのではないか?? 27

s t

u

v

20

30 20 10

10

20 10

(28)

フローの定式化

辺を流れるフロー

頂点への流入量と流出量

28

u v

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

-C(v, u) f(u, v) C(u, v)

ただし C(u, v) = C(v, u)とは限らない

C(u,v) C(v,u)

v

流入量

: fin(v) = ∑ uV, f(u,v)>0 f(u,v)

流出量

: fout (v) = ∑ wV, f(v,w)>0 f(v,w) v≠s,t

であれば

fin(v) = fout(v)

総流量

: total(f)= fout(s) = fin(t)

(29)

フォード・ファルカーソン法

Ford-Fulkerson Algorithm

考え方

s-t間の何らかの道を考え、その流量の上限 を算出する

そのフローfを容量Cから引いた値(残余容 量)を計算し、グラフから差し引く ・・・そのグ ラフをGfとする

Gfに対して、同様のことをする(つまり、s-t 間の何らかの道を考え、その流量の上限を 算出し、総フローを算出し、容量から差し引 いて・・・)

s-t間の道が無くなれば、終了

29

s t

u

v

20 30

10

20 20

20

30

10

10 10

s t

u

v

40 10

10

0 40

0

50

10

10 10

20

フローに沿って

-20

10

s t

u

v

40 20

0

0 40

0

40

20

0 フローに沿って(さらに) 20

-10

s-t間の道がなくなった

(容量>0の弧についてのみ考える)

このとき差し引いている 総フローが求める最大流

(30)

練習

フォード・ファルカーソン法を用いて、以下のフロー グラフにおける

s

から

t

への最大流を求めよ。

30

s

t

50

20 30

20

40 30

20 10

10

10

50 20

10 30

20 20 10

10 10

(*) 辺のラベルは、

容量(向きは問わない)を 表している。

(31)

容量を、まず有向グラフに置き換える

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 30 30

50 50 20

20 20

20 10 10

20 20

40 40 10 10

20 20

10 10 30

30 50

50

(32)

s-t間の適当な道を考え、その流量の上限を算出する。

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 30 30

50 50 20

20 20

20 10 10

20 20

40 40 10 10

20 20

10 10 30

30 50

50 20

(33)

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし、Gfを作成する

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 30 30

70 30 20

20 0

40 10 10

0 40

40 40 10 10

20 20

10 10 50

10 50

50

(34)

Gfにおいて、s-t間の適当な道を考え、その流量の上限を算出する。

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 30 30

70 30 20

20 0

40 10 10

0 40

40 40 10 10

20 20

10 10 50

10 50

50 20

(35)

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし、Gfを作成する

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 30 30

90 10 0

40 0

40 10 10

0 40

20 60 10 10

40 0

10 10 50

10 50

50

(*) 本来はf(u,v)はフローの総和

Pによって作られるフローではない

(36)

Gfにおいて、s-t間の適当な道を考え、その流量の上限を算出する。

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 30 30

90 10 0

40 0

40 10 10

0 40

20 60 10 10

40 0

10 10 50

10 50

50 10

(37)

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 40 20

90 10 0

40 0

40 10 10

0 40

10 70 10 10

40 0 60 0 0 20 50

50

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし、Gfを作成する

(*) 本来はf(u,v)はフローの総和

Pによって作られるフローではない

(38)

Gfにおいて、s-t間の適当な道を考え、その流量の上限を算出する。

(ここでは複数回まとめて表示)

s

t

20 20

10 10 10 10

10

1030 30

20 20 10

10 40 20

90 10 0

40 0

40 10 10

0 40

10 70 10 10

40 0 60 0 0 20 50

50

10 10

1010 10

(39)

s

t

40 0

20 0 20 0

0

2010

50

20 20 0

20 60 0

90 10 0

40 0

40 10 10

0 40

0 80 20 0

40 0 60 0 0 20 0

100

残余容量 Cf(u,v) = C(u,v) - f(u,v) とし、Gfを作成する

(*) 本来はf(u,v)はフローの総和

Pによって作られるフローではない

(40)

Gfにおいて、 s-t間の(Cf>0の辺で作られる)道が存在しないので、終了

s

t

40 0

20 0 20 0

0

2010 50

20 20 0

20 60 0

90 10 0

40 0

40 10 10

0 40

0 80 20 0

40 0 60 0 0 20 0

100

(41)

s

t

最大流は以下のフローの総和である。

20 20

10

10

10

10 10

10

(42)

各辺が以下のフローを通すとき、

s

から

t

に対して最大流 が得られる。その流量は

100

42

s

t

50

20 30

20

40 30

10

10

10

40 20

10 30

20 20 10

10

s

t

20 20

10

10

10

10 10

10

(43)

フォード・ファルカーソンの アルゴリズム

Max-Flow(G(V,E), s, t)

eE, f(e)=0

While any paths from s to t exist in residual graph Gf P := simple-path(s,t) in Gf

f’ := augment(f, P) Update f to be f’

Update Gf to be Gf’

EndWhile Return f

43

フロー f に道Pを流れるフローの上限分を 追加し、それを f’ に代入する処理

道の発見には

「幅優先探索」「深さ優先探索」

などが用いられる

このアルゴリズムの停止性について 考察してみよ

(44)

今日の内容

最小全域木

プリムのアルゴリズム

最大流問題

フォード・ファルカーソンのアルゴリズム

44

(45)

今後の予定

6

24

日: 平面的グラフ、地図

7

1

日: スキップグラフ

7

8

日: 内容未定

7

22

日: 試験

13:00 – 14:30

241

講義室

(

未確定

)

45

参照

関連したドキュメント

東京大学 大学院情報理工学系研究科 数理情報学専攻. [email protected]

[r]

[r]

[r]

最大消滅部分空間問題 MVSP Maximum Vanishing Subspace Problem.. MVSP:

参考文献 Niv Buchbinder and Joseph (Seffi) Naor: The Design of Com- petitive Online Algorithms via a Primal-Dual Approach. Foundations and Trends® in Theoretical Computer

"A matroid generalization of the stable matching polytope." International Conference on Integer Programming and Combinatorial Optimization (IPCO 2001). "An extension of

FOCS2007: Maximizing non-monotone submodular functions, by Uriel Feige, Vahab Mirrokni and Jan Vondrak..