アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方:...
Transcript of アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方:...
![Page 1: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/1.jpg)
宮崎修一京都大学 学術情報メディアセンター
アルゴリズム入門(6)(動的計画法)
![Page 2: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/2.jpg)
2
動的計画法の考え方:
元の問題から、よりサイズの小さい「部分問題」を定義する。
部分問題を解いた結果を表にまとめておき、より大きなサイズの部分問題を解くときに、表の結果を利用する。
小さい部分問題から順番に解いて行って、最後の部分問題が元の問題そのものである。(よって、最後には元の問題が解けたことになる。)
![Page 3: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/3.jpg)
3
行列の掛け算
3 6 1
4 0 2
3 8 1 6
1 0 1 2
2 2 0 0
2×3行列 3×4行列
=17 26 9 30
16 36 4 24
2×4行列
問題:掛け算は全部で何回?
![Page 4: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/4.jpg)
4
。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
(p×q)行列 (q×r)行列
=。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
(p×r)行列
掛け算の回数は全体でp×q×r回
q
p q
r
r
p
![Page 5: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/5.jpg)
5
4つの行列の掛け算A × A × A × A1 2 3 4
(50×2) (2×80) (80×3) (3×20)
・掛け算結果は、順番に依らない。・掛け算回数は、順番に大きく依存する。
A × A → 50× 2×80= 8000回 結果は50×80行列1 2
A × A → 80× 3×20= 4800回 結果は80×20行列3 4
× → 50×80×20=80000回
計 92800回
A × A → 2×80× 3= 480回 結果は 2× 3行列2 3
A × → 50× 2× 3= 300回 結果は50× 3行列1
4× A → 50× 3×20= 3000回
計 3780回
問題:これより少ない回数で出来る?
![Page 6: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/6.jpg)
6
( )( )
n個の行列が与えられたとき
A × A × ・・・ × A1 2 n
どういう順番で掛けていくのが、掛け算回数が最も少ないか?
A1A2A3 A4
A1 A2 A3 A4A1 A2 A3 A4( ) ( )( ) A1 A2 A3 A4( )
A2 A3A4( ) A2A3 A4( ) A1 A2A3A1A2 A3
4800回 480回 8000回 480回
480+120回
3200+4800回
12000+8000回
8000回 4800回
300+480回
600回 780回
2000+600回 8000+
4800+80000回
780+3000回
2600回
![Page 7: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/7.jpg)
7
n個の場合、場合分けは≧4 n
木全体を計算していたのでは、多項式時間では収まらない。↓
動的計画法
![Page 8: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/8.jpg)
8
動的計画法の考え方(n=6の場合の例)
A1A2A3A4A5A6
1、2-6 1-2、3-6 1-3、4-6 1-4、5-6 1-5、6
2、3-6 2-3、4-6 2-4、5-6 2-5,6
3-6を計算する最小値
3-6を計算する最小値
4-6を計算する最小値
4-6を計算する最小値
木のサイズは大きいのだけど、同じものが何度も出てくる。
↓同じ部分は1度だけ計算して表に蓄えておいて、後で使う。
| |動的計画法の考え方
4-6を計算する最小値
4-6を計算する最小値
![Page 9: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/9.jpg)
9
m[i, j]: を計算するのに、掛け算回数を一番少なくした場合の掛け算回数。
A1p0
p1
A2p1
p2
A npn-1
pn
・・・
Ai Ai+1 Aj-1 Aj・・・
つまり、求めたいのは m[1, n]。
![Page 10: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/10.jpg)
10
第1ステップ:
m[i, i]=0 (全てのiに対して)つまり、 を求めるのに掛け算回数は0回。Ai
第2ステップ:
m[i, i+1] を求める(1≦i≦n-1)つまり、 を求める掛け算回数。Ai Ai+1
A ipi-1
pi
A i+1pi
pi+1 m[i, i+1]= p p pii-1 i+1
![Page 11: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/11.jpg)
11
第3ステップ:
m[i, i+2] を求める(1≦i≦n-2)つまり、 を求める掛け算回数。
pi-1
pi+1
pi+1
pi+2
Ai Ai+1Ai+2
Ai Ai+1 Ai+2( ) Ai Ai+1Ai+2( )
Ai Ai+1 Ai+2 pi-1
pi
pi
pi+2
Ai Ai+1Ai+2
この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+1i-1 i+2
ii-1 i+2
![Page 12: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/12.jpg)
第kステップ:
m[i, i+k-1] を求める(1≦i≦n-k+1)Ai Ai+1Ai+2 Ai+k-2 Ai+k-1・・・
( )Ai Ai+1Ai+2 Ai+k-2 Ai+k-1・・・
( )Ai Ai+1 Ai+2 Ai+k-2 Ai+k-1・・・( )
・・・
( )Ai Ai+1Ai+2 Ai+k-2 Ai+k-1・・・
( )Ai Ai+1Ai+2 Ai+k-2 Ai+k-1( )・・・Ai+k-3
12
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 }
ii-1 i+k-1i+1i-1 i+k-1
i+k-3i-1 i+k-1
i+k-2i-1 i+k-1
![Page 13: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/13.jpg)
13
同様に進めて、第nステップでm[1, n]が求まる。
計算時間はO(n )。3
m[i, j]はO(n )。1つを計算するのにO(n)。
2
![Page 14: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/14.jpg)
14
最大独立頂点集合問題(以前やった)入力:グラフ G=(V, E )
独立頂点集合:間に枝のない頂点集合
![Page 15: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/15.jpg)
15
最大独立頂点集合問題(以前やった)入力:グラフ G=(V, E )
問題:最大サイズの独立頂点集合を求めよ。
![Page 16: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/16.jpg)
16
重み付き最大独立頂点集合問題入力:グラフ G=(V, E ) (各頂点に重みが付いている)
1
2
3
3
4
1
6
8
問題:最大サイズの独立頂点集合を求めよ。(ただしここでは、「サイズ」とは頂点の重みの和。)
![Page 17: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/17.jpg)
17
重み無しの場合は、木では貪欲アルゴリズムで多項式時間で解けることを見た。重み付きの場合は、貪欲アルゴリズムはうまく働かない。
問題:貪欲アルゴリズムがうまく働かない木の例を挙げよ。
![Page 18: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/18.jpg)
18
動的計画法を使うと、重み付きでも(木に限定すれば)多項式時間で解ける。
T(v): vを根とする部分木
v
![Page 19: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/19.jpg)
19
A(v): 「vを選ぶ」という条件の下での、T(v)の最大独立頂点集合のサイズ。
B(v): 「vを選ばない」という条件の下での、T(v)の最大独立頂点集合のサイズ。
5
問題:今の場合のA(v)、B(v)、C(v)を求めよ
C(v): (何の条件もなく)、T(v)の最大独立頂点集合のサイズ。
A(v)=9B(v)=10C(v)=max{A(v), B(v)}=10
v
36
31
1
![Page 20: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/20.jpg)
20
A(v): 「vを選ぶ」という条件の下での、T(v)の最大独立頂点集合のサイズ。
B(v): 「vを選ばない」という条件の下での、T(v)の最大独立頂点集合のサイズ。
C(v): (何の条件もなく)、T(v)の最大独立頂点集合のサイズ。
根をrとすると、元の問題の最終的な答えはC(r) v
r
![Page 21: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/21.jpg)
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
![Page 22: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/22.jpg)
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は選んでも選ばなくても良い。)
![Page 23: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/23.jpg)
23
v
x y z
T(x) T(y) T(z)
T(x), T(y), T(z) 間にはお互いに枝がなく、またvとも枝がないので、それぞれ独立に計算できる。
![Page 24: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/24.jpg)
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)
![Page 25: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/25.jpg)
25
最短経路問題入力:重みつきグラフ G=(V, E)
Vの2頂点 sとt出力:sからtへの最短経路
4
3
10
7
8s
t例:
2
5
21
v1
v2
v3
v4
問題:sからtへの最短経路は?その距離は?
![Page 26: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/26.jpg)
26
単純な方法・全てのs-tパスを列挙。・それぞれの経路のコストを計算。・最も短い経路を解として出力。
s tv1 v3
s tv2 v4
s tv1 v4
12
1611
s tv1 v4 10v2
……
原理的には最適解が求まる。しかし。。。・全てのパスを簡単に列挙できる?・出来たとしても、そもそもパスが指数個あったら、多項式時間アルゴリズムにはならない。
![Page 27: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/27.jpg)
27
問題: sからtへのパスの数が(頂点数の)指数個ある例はあるか?
![Page 28: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/28.jpg)
28
Dijkstra(ダイクストラ)のアルゴリズム
ステップ1: L=Φ(空集合)とする。各頂点(v)に値(δ(v))をつける。δ(s)=0δ(v)=∞(s以外の頂点v)
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
∞
∞
∞
∞
∞
![Page 29: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/29.jpg)
29
Dijkstra(ダイクストラ)のアルゴリズム
ステップ2: Lに頂点sを加える。sから到達可能な頂点の値をd(s,v)に更新(更新された頂点は、sにリンクを張る)
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
∞ ∞
∞
∞2
∞10
![Page 30: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/30.jpg)
30
Dijkstra(ダイクストラ)のアルゴリズム
ステップ3: tがLに入るまで、以下を繰り返す。・Lに入っていない頂点の中で、値が最小のものをvとする。・vをLに加える。・Lに入っていない、vに隣接する全ての頂点uに対して、
δ(u)= min {δ(u), δ(v)+d(v,u) }とする。・値が更新されたものはリンクを更新する。
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
∞2
10
∞9
∞104
![Page 31: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/31.jpg)
31
Dijkstra(ダイクストラ)のアルゴリズム
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
∞2
104
98
9
ステップ3: tがLに入るまで、以下を繰り返す。・Lに入っていない頂点の中で、値が最小のものをvとする。・vをLに加える。・Lに入っていない、vに隣接する全ての頂点uに対して、
δ(u)= min {δ(u), δ(v)+d(v,u) }とする。・値が更新されたものはリンクを更新する。
![Page 32: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/32.jpg)
32
Dijkstra(ダイクストラ)のアルゴリズム
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
2
4
8
9
∞11
ステップ3: tがLに入るまで、以下を繰り返す。・Lに入っていない頂点の中で、値が最小のものをvとする。・vをLに加える。・Lに入っていない、vに隣接する全ての頂点uに対して、
δ(u)= min {δ(u), δ(v)+d(v,u) }とする。・値が更新されたものはリンクを更新する。
![Page 33: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/33.jpg)
33
Dijkstra(ダイクストラ)のアルゴリズム
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
2
4
8
9
1110
ステップ3: tがLに入るまで、以下を繰り返す。・Lに入っていない頂点の中で、値が最小のものをvとする。・vをLに加える。・Lに入っていない、vに隣接する全ての頂点uに対して、
δ(u)= min {δ(u), δ(v)+d(v,u) }とする。・値が更新されたものはリンクを更新する。
![Page 34: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/34.jpg)
34
10
Dijkstra(ダイクストラ)のアルゴリズム
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
2
4
8
9
ステップ3: tがLに入るまで、以下を繰り返す。・Lに入っていない頂点の中で、値が最小のものをvとする。・vをLに加える。・Lに入っていない、vに隣接する全ての頂点uに対して、
δ(u)= min {δ(u), δ(v)+d(v,u) }とする。・値が更新されたものはリンクを更新する。
![Page 35: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/35.jpg)
35
10
Dijkstra(ダイクストラ)のアルゴリズム
ステップ4:この時点でtについている値が、sからtまでの最短距離。tにその値を付けるに至った経路が最短経路。
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
2
4
8
9
![Page 36: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/36.jpg)
36
正しさの証明
アルゴリズムの任意の時点で、「Lに入っている頂点の値は、sからそこまでの最短距離」
を証明する。つまり、
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
2
4
9
10
∞
![Page 37: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/37.jpg)
37
帰納法で証明する
最初:Lに入っているのはsのみ。sの値は0。sからsまでの最短距離は0。
よって成り立つ。
4
3
10
7
8s
t
2
5
21
v1
v2
v3
v4
0
∞
∞
∞
∞
∞
![Page 38: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/38.jpg)
38
あるステップで正しいとする
s 0
1
2
2
4
5
6
このとき、新たに加えられた頂点についても正しいことを示す。
11
∞
→8
→9
![Page 39: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/39.jpg)
39
いまx≦y, x≦zが成り立っている。(v が選ばれたのだから)x=min{a+d, c+e}である。(xの値の決め方から)
d
s
e0
a
b
c
x
y
z
v
sからv への最短距離がxでないとして、矛盾を導く。xより短い s-v パスがあったとする。その長さをx’ < xとする。
*
*
**
v1v2
v3
v4
v5
![Page 40: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/40.jpg)
40
d
s
e0
a
b
c
x
y
z
v
x’=(sからv までの経路)+dx≦a+dx’<xなので、(sからv までの経路 )< aとなる。ということは、sから(Lの中にある)v への最短距離がaであること(つまり帰納法の仮定)に矛盾。
場合(1):最後に使われた枝が、Lの中の頂点からv に向かう。
v1
v5
v4
*
*
1
1
1
![Page 41: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/41.jpg)
41
d
s
e0
a
b
c
x
y
v
場合(2):最後に使われた枝が、Lの外の頂点からv に向かう。
f
v から逆にたどって、初めてLに入るところ。
w
sからuへの最短経路は、帰納法の仮定よりc。なので、紫の道も、その最短路を通っているはず。(さもなければ、sからv へ、紫よりも短い道がある。)
*
*
*
v1
u
*
![Page 42: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/42.jpg)
42
d
s
e0
a
b
c
x
y
v
場合(2):最後に使われた枝が、Lの外の頂点からv に向かう。
f
s→u→w路は、x’より短い。(紫がx’なのだから) つまりc+r < x’。wはuにつながっているので、uがLに入った時点でδ(w)はc+r以下であるはず。δ(w)≦c+r < x’< x つまり δ(w)<x。したがって、次のステップでv がLに入れられるのはおかしい。矛盾。
r
*
wu
*
*
![Page 43: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/43.jpg)
43
直観的には
s 0
1
2
2
4
5
8
これは確定4より短くなりようがない(他の頂点へ、赤の中から行くのは、4以上かかるから)
こいつは確定してはいけない8より短い道があるかも
1
1
![Page 44: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/44.jpg)
44
計算時間頂点はn個あり、それぞれが高々n回しか更新されない。
O(n )枝はm本あり、それぞれ1回しか走査されない。
O(m)よって全体でO(n +m)。
2
2
![Page 45: アルゴリズム入門(6shuichi/algintro/alg-6s.pdf2 動的計画法の考え方: 元の問題から、よりサイズの小さい「部分問題」を定義する。部分問題を解いた結果を表にまとめておき、](https://reader033.fdocuments.in/reader033/viewer/2022050120/5f50fa5809dc9c57b977dfea/html5/thumbnails/45.jpg)
45
問題:次のグラフの最短経路とその値を求めよ
A
B
C
E
F
4 2
4
9
2
1
1
5
2 7
5
s
D
1t
5