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

アルゴリズム入門(6)(動的計画法))(動的計画法)

N/A
N/A
Protected

Academic year: 2021

シェア "アルゴリズム入門(6)(動的計画法))(動的計画法)"

Copied!
45
0
0

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

全文

(1)

宮崎修一

京都大学 学術情報メディアセンター

アルゴリズム入門( 6 )

(動的計画法)

(2)

2

動的計画法の考え方:

 元の問題から、よりサイズの小さい「部分問題」を定義する。

 部分問題を解いた結果を表にまとめておき、

 より大きなサイズの部分問題を解くときに、表の結果を利用する。

 小さい部分問題から順番に解いて行って、最後の部分問題が  元の問題そのものである。(よって、最後には元の問題が  解けたことになる。)

(3)

3

行列の掛け算

6  1 0  2

8  1  6 0  1  2 2  0  0

2 × 3行列     3 × 4行列

26 9 30=

16 36 4 24 2 × 4行列

(4 × 8)+(0 × 0)+(2 × 2)

  3回の掛け算

掛け算の回数は全体で(2 × 4) × 3回

問題:掛け算は   全部で何回?

(4)

4

。。。。。。。

。。。。。。。

。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

p×q )行列      ( q×r )行列

=。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

p×r )行列

掛け算の回数は全体で p×q×r

q

p q

r

r p

(5)

5

4つの行列の掛け算

A  ×  A   ×  A   ×  A

(50 × 2)  (2 × 80)  (80 × 3)  (3 × 20)

 ・掛け算結果は、順番に依らない。

 ・掛け算回数は、順番に大きく依存する。

A  × A  → 50 ×  2 × 80= 8000回 結果は50 × 80行列 A  × A  → 80 ×  3 × 20= 4800回 結果は80 × 20行列

   ×     → 50 × 80 × 20=80000回        計 92800回

A  × A  →  2 × 80 ×  3=  480回 結果は 2 ×  3行列 A  ×    → 50 ×  2 ×  3=  300回 結果は50 ×  3行列

   × A  → 50 ×  3 × 20= 3000回        計  3780回

問題:これより少ない回数で出来る?

(6)

6

(    )

(    ) n 個の行列が与えられたとき

A   ×  A   ×  ・・・  ×  A

どういう順番で掛けていくのが、掛け算回数が最も少ないか?

A A A A 

A A  A A  A A A A 

(      )(    )(    ) A (      )A A A 

A (    ) A  A A  (    )A  A  A A  A  A  A A 

4800回 480回 8000回 480回

480+120回 3200+

4800回 12000+

8000回

8000回4800回

300+480回

600回 780回

2000+

600回 8000+

4800+

80000回

780+3000回

2600回

(7)

7

n 個の場合、場合分けは≧4n

木全体を計算していたのでは、多項式時間では収まらない。

       ↓       動的計画法

(8)

8

動的計画法の考え方( n =6の場合の例)

A A A A A A 

1、2-6 1-2、3-61-3、4-6 1-4、5-6 1-5、6

2、3-62-3、4-62-4、5-62-5,6

3-6を計算 する最小値

3-6を計算 する最小値

4-6を計算 する最小値

4-6を計算 する最小値

木のサイズは大きいのだけど、

同じものが何度も出てくる。

      ↓

同じ部分は1度だけ計算して 表に蓄えておいて、後で使う。

     | |

動的計画法の考え方

4-6を計算 する最小値

4-6を計算 する最小値

(9)

9

m[i, j] :      を計算するのに、掛け算回数を

     一番少なくした場合の掛け算回数。

p

p

p

p

n pn

-1

p n

・・・

A i A i+1・・・A j-1A j

つまり、求めたいのは m[1, n]

(10)

10

第1ステップ:

m[i, i]=0 (全ての i に対して)

 つまり、  を求めるのに掛け算回数は0回。A i 第2ステップ:

m[i, i+1] を求める( 1≦in-1

 つまり、     を求める掛け算回数。A i A i+1

i pi -1

p i

i+1 pi

pi+1 m[i, i+1]= p p pi-1 i i+1

(11)

11

第3ステップ:

m[i, i+2] を求める( 1≦in-2

 つまり、        を求める掛け算回数。

pi-1

p i+1

p i+1

p i+2

A i A i+1A i+2

A iA i+1 A i+2

(     ) (      )A i A i+1A i+2

A iA i+1 A i+2 p

i -1

pi

p i

p i+2

A i A i+1A i+2

m[i, i+2]= min{m[i, i+1] + m[i+2, i+2] + p p p , m[i, i] + m[i+1,i+2] + p p p }i-1 i-1i i+1i+2 i+2

この2通りのうち、少ない方。

(12)

12

k ステップ:

m[i, i+k-1] を求める( 1≦in-k+1 ) A iA i+1A i+2

m[i, i+k-1]= min{m[i, i]+ m[i, i+k-1]+ p p p ,

m[i, i+1]+m[i+2, i+k-1]+ p p p , ・・・

m[i, i+k-3]+m[i+k-2,i+k-1]+p p p , m[i, i+k-2]+m[i+k-1,i+k-1] + p p p }

i

i-1 i+k-1

A i+k-2A i+k-1

・・・

(      )A i A i+1A i+2・・・A i+k-2A i+k-1

(     ) A iA i+1 A i+2・・・A i+k-2A i+k-1

(  )

・・・

(     )A iA i+1A i+2・・・A i+k-2 A i+k-1

( )

A iA i+1A i+2 A i+k-2A i+k-1

( )・・・A i+k-3

i+1

i-1 i+k-1

i+k-3

i-1 i+k-1

i+k-2

i-1 i+k-1

(13)

13

同様に進めて、第 n ステップで m[1, n] が求まる。

計算時間は O(n ) 。3

m[i, j] は O(n ) 。

1つを計算するのに O(n) 。

2

(14)

14

最大独立頂点集合問題(以前やった)

 入力:グラフ G=(V, E )

独立頂点集合:間に枝のない頂点集合

(15)

15

最大独立頂点集合問題(以前やった)

 入力:グラフ G=(V, E )

問題:最大サイズの独立頂点集合を求めよ。

(16)

16

重み付き最大独立頂点集合問題

 入力:グラフ G=(V, E )  (各頂点に重みが付いている)

1

2

3 3

4 1

6 8

問題:最大サイズの独立頂点集合を求めよ。

    (ただしここでは、「サイズ」とは頂点の重みの和。)

(17)

17

重み無しの場合は、木では貪欲アルゴリズムで多項式時間で 解けることを見た。

重み付きの場合は、貪欲アルゴリズムはうまく働かない。

問題:貪欲アルゴリズムがうまく働かない木の例を挙げよ。

9

1 1

(18)

18

動的計画法を使うと、重み付きでも(木に限定すれば)

多項式時間で解ける。

T(v): v を根とする    部分木

v

(19)

19

A(v): v を選ぶ」という条件の下での、

     T(v) の最大独立頂点集合のサイズ。

B(v): v を選ばない」という条件の下での、

     T(v) の最大独立頂点集合のサイズ。

5

問題:今の場合の

A(v)B(v)C(v) を求めよ

C(v): (何の条件もなく)、 T(v) の最大独立頂点集合のサイズ。

A(v)=9 B(v)=10

C(v)=max{A(v), B(v)}=10

v

6 3

1 3

1

(20)

20

A(v): v を選ぶ」という条件の下での、

     T(v) の最大独立頂点集合のサイズ。

B(v): v を選ばない」という条件の下での、

     T(v) の最大独立頂点集合のサイズ。

C(v): (何の条件もなく)、 T(v) の最大独立頂点集合のサイズ。

根を r とすると、

元の問題の最終的な

答えは C(r) v

r

(21)

21

動的計画法の方針: 葉から根に向かって、 A(v)B(v)C(v) を  計算していく。

v が葉の場合

T(v)v1 個からなるので、 A(v)= w(v), B(v)=0, C(v)=max{A(v), B(v)}= w(v).

以降、頂点 v の重みを w(v) と書くことにする。

v

(22)

22

v が葉でない場合

v

x y z

A(v)=

B(v)=

C(v)=max{A(v), B(v)}

    w(v)+B(x)+B(y)+B(z)

v を選ぶとすると、 x, y, z は選べない。)

    C(x)+C(y)+C(z)

v を選ばないとすると、 x, y, z は選んでも選ばなくても良い。)

(23)

23

v

x y z

T(x) T(y) T(z)

T(x), T(y), T(z) 間にはお互いに枝がなく、また v とも枝が ないので、それぞれ独立に計算できる。

(24)

24

A(v)= w(v)+B(x)+B(y)+B(z) B(v)=C(x)+C(y)+C(z)

C(v)=max{A(v), B(v)}

計算時間

d(v)-1 個の表参照と d(v)-1 回の足し算 d(v)-1 個の表参照と d(v) 回の足し算

1 回の大小比較 頂点 v に関する表計算に O(d(v)) 時間

全体では、 Σd(v) = 2|E| = 2(n-1)

d(v) :頂点 v の次数

(木は |E| = n-1 ) よって、計算時間は O(n)

(25)

25

最短経路問題

 入力:重みつきグラフ G=(V, E)       V の 2 頂点 st

 出力: s から t への最短経路

4

3

10

7

s 8 例: t

2

5 2

1

2+2+5+1=10 v1

v2

v3

v4

問題: s から t への最短経路は?

    その距離は?

(26)

26

単純な方法

  ・全ての s-t パスを列挙。

  ・それぞれの経路のコストを計算。

  ・最も短い経路を解として出力。

s v1 v3 t

s v2 v4 t

s v1 v4 t

12 16 11

s v1 v2 v4 t 10

… …

原理的には最適解が求まる。しかし。。。

 ・全てのパスを簡単に列挙できる?

 ・出来たとしても、そもそもパスが指数個あったら、

  多項式時間アルゴリズムにはならない。

(27)

27

問題: s から t へのパスの数が(頂点数の)指数個ある例はあるか?

st

k 個 頂点数: n=5k+1

s-t パスの数: k4 = 4n-15

前ページのアルゴリズムは多項式時間では終了しない。

(もちろん、上記の例だけに対応するのは簡単。

 各コンポーネントでの最短経路を繋ぎ合わせれば良い。)

(28)

28

Dijkstra (ダイクストラ)のアルゴリズム

ステップ 1 : L=Φ (空集合)とする。

       各頂点( v )に値( δ(v) )をつける。

δ(s)=0

δ(v)=∞ ( s 以外の頂点 v

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

(29)

29

Dijkstra (ダイクストラ)のアルゴリズム

ステップ 2 : L に頂点 s を加える。

        s に隣接する頂点の値を d(s,v) に更新

       (更新された頂点は、 s にリンクを張る)

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

∞ ∞

∞ 2 ∞

∞ 10

d(s,v) :枝 (s,v) の重 み

(30)

30

Dijkstra (ダイクストラ)のアルゴリズム

ステップ 3 : tL に入るまで、以下を繰り返す。

    ・ L に入っていない頂点の中で、値が最小のものを v とする。

    ・ vL に加える。

    ・ L に入っていない、 v に隣接する全ての頂点 u に対して、

          δ(u)= min {δ(u), δ(v)+d(v,u) } とする。

    ・値が更新されたものはリンクを更新する。

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

2 ∞

10

∞9

∞ 4 10

(31)

31

Dijkstra (ダイクストラ)のアルゴリズム

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

2 ∞

10 4

9 8

9

ステップ 3 : tL に入るまで、以下を繰り返す。

    ・ L に入っていない頂点の中で、値が最小のものを v とする。

    ・ vL に加える。

    ・ L に入っていない、 v に隣接する全ての頂点 u に対して、

          δ(u)= min {δ(u), δ(v)+d(v,u) } とする。

    ・値が更新されたものはリンクを更新する。

(32)

32

Dijkstra (ダイクストラ)のアルゴリズム

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

2

4

8

9

∞ 11 ステップ 3 : tL に入るまで、以下を繰り返す。

    ・ L に入っていない頂点の中で、値が最小のものを v とする。

    ・ vL に加える。

    ・ L に入っていない、 v に隣接する全ての頂点 u に対して、

          δ(u)= min {δ(u), δ(v)+d(v,u) } とする。

    ・値が更新されたものはリンクを更新する。

(33)

33

Dijkstra (ダイクストラ)のアルゴリズム

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

2

4

8

9

111 0 ステップ 3 : tL に入るまで、以下を繰り返す。

    ・ L に入っていない頂点の中で、値が最小のものを v とする。

    ・ vL に加える。

    ・ L に入っていない、 v に隣接する全ての頂点 u に対して、

          δ(u)= min {δ(u), δ(v)+d(v,u) } とする。

    ・値が更新されたものはリンクを更新する。

(34)

34

1 0

Dijkstra (ダイクストラ)のアルゴリズム

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

2

4

8

9

ステップ 3 : tL に入るまで、以下を繰り返す。

    ・ L に入っていない頂点の中で、値が最小のものを v とする。

    ・ vL に加える。

    ・ L に入っていない、 v に隣接する全ての頂点 u に対して、

          δ(u)= min {δ(u), δ(v)+d(v,u) } とする。

    ・値が更新されたものはリンクを更新する。

(35)

35

1 0

Dijkstra (ダイクストラ)のアルゴリズム

ステップ 4 :この時点で t についている値が、 s から t までの        最短距離。

        t にその値を付けるに至った経路が最短経路。

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

2

4

8

9

(36)

36

正しさの証明

アルゴリズムの任意の時点で、

  「 L に入っている頂点の値は、 s からそこまでの最短距離」

を証明する。

つまり、

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

2

4

9

10

(37)

37

帰納法で証明する

最初:   L に入っているのは s のみ。

   s の値は 0 。

   s から s までの最短距離は 0 。     よって成り立つ。

4

3

10

7

s 8

t 2

5 2

1 v1

v2

v3

v4 0

(38)

38

あるステップで正しいとする

s 0

1

2 2

4 5

6

このとき、新たに加えられた頂点についても正しいことを示す。

11

→8

→9

(39)

39

いま xy, xz が成り立っている。( v が選ばれたのだから)

x=min{a+d, c+e} である。( x の値の決め方から)

d s

0 e

a

b c

x y

z v

s から v への最短距離が x でないとして、矛盾を導く。

x より短い sv パスがあったとする。その長さを x’ < x とする。

*

*

*

*

v1 v2

v3

v4

v5

(40)

40

d s

0 e

a

b c

x y

z v

x’=s から v までの経路) +d xa+d

x’<x

なので、( s から v までの経路 ) < a となる。

ということは、 s から( L の中にある) v への最短距離が a であること(つまり帰納法の仮定)に矛盾。

場合 (1) :最後に使われた枝が、 L の中の頂点から v に向かう。

v1

v5 v4

*

*

1

1 1

(41)

41

d s

e 0

a

b c

x

y v

場合 (2) :最後に使われた枝が、 L の外の頂点から v に向かう。

f

v から逆にたどって、初めて L に入るところ。

w

s から u への最短経路は、帰納法の仮定より c

なので、紫の道も、その最短路を通っているはず。

(さもなければ、 s から v へ、紫よりも短い道がある。)

*

*

*

v1

u

*

(42)

42

d s

e 0

a

b c

x

y v

場合 (2) :最後に使われた枝が、 L の外の頂点から v に向かう。

f

s→u→w 路は、 x’ より短い。(紫が x’ なのだから) つまり c+r < x’wu につながっているので、 uL に入った時点で δ(w)

c+r 以下であるはず。

δ(w)c+r < x’< x  つまり δ(w)<x

したがって、次のステップで v L に入れられるのはおかしい。

矛盾。

r

*

u w

*

*

(43)

43

直観的には

s 0

1

2 2

4 5

8

これは確定

4 より短くなりようがない

(他の頂点へ、赤の中から行くのは、

4 以上かかるから)

こいつは確定してはいけない 8 より短い道があるかも

1

1

(44)

44

計算時間 頂点は n 個あり、それぞれが高々 n 回しか更新されない。

   O(n )

 枝は m 本あり、それぞれ 1 回しか走査されない。

   O(m)

 よって全体で O(n +m) 。

2

2

(45)

45

問題:次のグラフの最短経路とその値を求めよ A

4 2

4 9

2 1

1

5

2 7

5 s

D 1

t 5

参照

関連したドキュメント

例えば,立証責任分配問題については,配分的正義の概念説明,立証責任分配が原・被告 間での手続負担公正配分の問題であること,配分的正義に関する

例えば,立証責任分配問題については,配分的正義の概念説明,立証責任分配が原・被告 間での手続負担公正配分の問題であること,配分的正義に関する

〃o''7,-種のみ’であり、‘分類に大きな問題の無い,グループとして見なされてきた二と力判った。しかし,半

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

基本的金融サービスへのアクセスに問題が生じている状態を、英語では financial exclusion 、その解消を financial

おそらく︑中止未遂の法的性格の問題とかかわるであろう︒すなわち︑中止未遂の

2013

難病対策は、特定疾患の問題、小児慢性 特定疾患の問題、介護の問題、就労の問題