京都大学 情報学研究科 知能情報学専攻 2022年8月実施 情報学基礎 F2-2
Author
Isidore , 祭音Myyura
Description
G = ( V , E ) G = (V, E) G = ( V , E ) を有向グラフとする。
ここで、V V V は G G G の頂点集合、E E E は G G G の辺集合である。
頂点 u u u から頂点 v v v への有向辺は順序対 ( u , v ) ∈ E (u, v) \in E ( u , v ) ∈ E で表され、距離 l ( u , v ) > 0 l(u,v)>0 l ( u , v ) > 0 を持つ。
頂点は 1 1 1 から N N N で番号付けられており、V = { 1 , 2 , … , N } V = \{1, 2, \ldots, N\} V = { 1 , 2 , … , N } である。
有向グラフの例を図1に示す。
各辺に付された数値はその辺の距離を表す。
頂点 v 1 v_1 v 1 から頂点 v m v_m v m へと有向辺を辿って到達できるとき、この経路 p p p を ( v 1 , v 2 , … , v m ) (v_1, v_2, \ldots, v_m) ( v 1 , v 2 , … , v m ) で表す。
v 1 , v m v_1, v_m v 1 , v m を除く p p p の頂点を中間頂点と呼ぶ。
経路 p p p の距離は l ( p ) = ∑ i = 1 m − 1 l ( v i , v i + 1 ) l(p)=\sum_{i=1}^{m-1} l(v_i,v_{i+1}) l ( p ) = ∑ i = 1 m − 1 l ( v i , v i + 1 ) で与えられる。
頂点 u u u から頂点 v v v への最短経路は、頂点 u u u から頂点 v v v への全ての経路のうち距離が最小のものである。
(1) 図1のグラフにおける頂点4から頂点3への最短経路とその距離を求めよ。
(2) 経路 p = ( v 1 , … , v i , … , v j , … , v m ) p=(v_1, \ldots, v_i, \ldots, v_j, \ldots, v_m) p = ( v 1 , … , v i , … , v j , … , v m ) は、v i = v j ( 1 ≤ i < j ≤ m ) v_i = v_j \ (1 \leq i < j \leq m) v i = v j ( 1 ≤ i < j ≤ m ) のとき、閉路を含むという。
任意の最短経路が閉路を含まないことを証明せよ。
G G G の全ての頂点対に対して最短経路の距離を求める問題を考える。
具体的には、頂点番号を利用した動的計画法に基づくアルゴリズムを作る。
全ての中間頂点が { 1 , 2 , … , k } \{1, 2, \ldots, k\} { 1 , 2 , … , k } に含まるという制約下での頂点 i i i から頂点 j j j への最短経路の距離を δ ( i , j , k ) \delta(i,j,k) δ ( i , j , k ) とする (0 ≤ k ≤ N 0 \leq k \leq N 0 ≤ k ≤ N )。
条件を満たす経路が存在しないとき、δ ( i , j , k ) = ∞ \delta(i,j,k)=\infty δ ( i , j , k ) = ∞ とする。
また δ ( i , i , k ) = 0 \delta(i,i,k)=0 δ ( i , i , k ) = 0 とする。
k = 0 k=0 k = 0 のときは、中間頂点は存在しないとする。
δ ( i , j , k ) \delta(i,j,k) δ ( i , j , k ) を使うと、元の問題は全ての i , j i,j i , j について δ ( i , j , N ) \delta(i,j,N) δ ( i , j , N ) を求めることとみなせる。
(3) 1 ≤ k ≤ N 1 \leq k \leq N 1 ≤ k ≤ N のとき δ ( i , j , k ) = min ( δ ( i , j , k − 1 ) , δ ( i , k , k − 1 ) + δ ( k , j , k − 1 ) ) \delta(i,j,k) = \min (\delta(i,j,k-1), \delta(i,k,k-1)+\delta(k,j,k-1)) δ ( i , j , k ) = min ( δ ( i , j , k − 1 ) , δ ( i , k , k − 1 ) + δ ( k , j , k − 1 )) が成り立つことを示せ。
(4) d ( k ) d^{(k)} d ( k ) はサイズ N × N N \times N N × N の2次元配列であり、その要素の値は d ( k ) [ i ] [ j ] = δ ( i , j , k ) d^{(k)}[i][j] = \delta(i,j,k) d ( k ) [ i ] [ j ] = δ ( i , j , k ) であるとする。
ただし、配列は1で始まるインデックス方式とする。
図1のグラフに対して、d ( 0 ) , … , d ( 4 ) d^{(0)}, \ldots, d^{(4)} d ( 0 ) , … , d ( 4 ) をこの順番で求めることで、全ての頂点対に対して最短経路の距離を求めよ。
(5) (4) はこのアルゴリズムが N + 1 N+1 N + 1 個の2次元配列を必要とすることを示唆するが、実際には1個の2次元配列を用意すれば済むことを示せ。
(6) (5) の結果を用いると次のアルゴリズムを導ける。下の空欄 (a) および (b) を埋めよ。
Kai
(1)
The shortest path is ( v 4 , v 2 , v 1 , v 3 ) (v_4, v_2, v_1, v_3) ( v 4 , v 2 , v 1 , v 3 ) .
The distance is 5 5 5 .
(2)
Assume that there is a cycle start and end at v i v_i v i in a shortest path p = ( v 1 , . . . , v i , . . . , v i , . . . v m ) p=(v_1, ..., v_i, ..., v_i, ...v_m) p = ( v 1 , ... , v i , ... , v i , ... v m ) from v 1 v_1 v 1 to v m v_m v m . Then,
l ( p ) = l ( v 1 , … , v i ) + l ( v i , … , v i ) + l ( v i , … , v m ) l(p) = l(v_1, \ldots, v_i) + l(v_i, \ldots, v_i) + l(v_i, \ldots, v_m) l ( p ) = l ( v 1 , … , v i ) + l ( v i , … , v i ) + l ( v i , … , v m )
Since l ( u , v ) > 0 l(u,v) > 0 l ( u , v ) > 0 for any edge ( u , v ) ∈ E (u,v) \in E ( u , v ) ∈ E , we have l ( v i , … , v i ) > 0 l(v_i, \ldots, v_i) > 0 l ( v i , … , v i ) > 0 .
Thus, the path p ′ = ( v 1 . . . v i . . . v m ) p' = (v_1...v_i...v_m) p ′ = ( v 1 ... v i ... v m ) of weight
l ( p ′ ) = l ( v 1 , … , v i ) + l ( v i , … , v m ) l(p') = l(v_1, \ldots, v_i) + l(v_i, \ldots, v_m) l ( p ′ ) = l ( v 1 , … , v i ) + l ( v i , … , v m )
is shorter than p p p , which leads to a contradiction with the assumption that p p p is a shortest path.
Therefore, no shortest path contains a cycle.
(3)
Let p i j k p_{ijk} p ijk be a shortest path from vertex i i i to vertex j j j such that all intermediate are contained in { 1 , … , k } \{1, \ldots, k\} { 1 , … , k } .
By (2) we know that a shortest path does not contain the same vertex twice, hence there are two possibilities to construct p i j k p_{ijk} p ijk .
vertex k k k is not a vertex on the path, then we have l ( p i j k ) = δ ( i , j , k − 1 ) l(p_{ijk}) = \delta (i, j, k-1) l ( p ijk ) = δ ( i , j , k − 1 ) .
vertex k k k is a vertex on the path, then the path consists of a subpath from i i i to k k k and a subpath from k k k to j j j . Each subpath can only contain intermediate vertices in { 1 , … , k − 1 } \{1, \ldots , k-1\} { 1 , … , k − 1 } , and also shortest paths from i i i to k k k and k k k to j j j respectively (otherwise a shorter path from i i i to j j j can be constructed), namely they have lengths δ ( i , k , k − 1 ) \delta(i, k, k-1) δ ( i , k , k − 1 ) and δ ( k , j , k − 1 ) \delta(k, j, k-1) δ ( k , j , k − 1 ) , respectively. Hence l ( p i j k ) = δ ( i , k , k − 1 ) + δ ( k , j , k − 1 ) l(p_{ijk}) = \delta(i, k, k-1) + \delta(k, j, k-1) l ( p ijk ) = δ ( i , k , k − 1 ) + δ ( k , j , k − 1 ) .
Combining the two cases we have
δ ( i , j , k ) = min ( δ ( i , j , k − 1 ) , δ ( i , k , k − 1 ) + δ ( k , j , k − 1 ) ) \delta(i,j,k) = \min (\delta(i,j,k-1), \delta(i, k, k-1) + \delta(k, j, k-1)) δ ( i , j , k ) = min ( δ ( i , j , k − 1 ) , δ ( i , k , k − 1 ) + δ ( k , j , k − 1 ))
(4)
d ( 0 ) = [ 0 1 2 ∞ 2 0 ∞ ∞ ∞ ∞ 0 2 4 1 ∞ 0 ] d^{(0)}=
\begin{bmatrix}
0 & 1 & 2 & \infty \\
2 & 0 & \infty & \infty \\
\infty & \infty & 0 & 2 \\
4 & 1 & \infty & 0 \\
\end{bmatrix} d ( 0 ) = 0 2 ∞ 4 1 0 ∞ 1 2 ∞ 0 ∞ ∞ ∞ 2 0
d ( 1 ) = [ 0 1 2 ∞ 2 0 4 ∞ ∞ ∞ 0 2 4 1 6 0 ] d^{(1)}=
\begin{bmatrix}
0 & 1 & 2 & \infty \\
2 & 0 & 4 & \infty \\
\infty & \infty & 0 & 2 \\
4 & 1 & 6 & 0 \\
\end{bmatrix} d ( 1 ) = 0 2 ∞ 4 1 0 ∞ 1 2 4 0 6 ∞ ∞ 2 0
d ( 2 ) = [ 0 1 2 ∞ 2 0 4 ∞ ∞ ∞ 0 2 3 1 5 0 ] d^{(2)}=
\begin{bmatrix}
0 & 1 & 2 & \infty \\
2 & 0 & 4 & \infty \\
\infty & \infty & 0 & 2 \\
3 & 1 & 5 & 0 \\
\end{bmatrix} d ( 2 ) = 0 2 ∞ 3 1 0 ∞ 1 2 4 0 5 ∞ ∞ 2 0
d ( 3 ) = [ 0 1 2 4 2 0 4 6 ∞ ∞ 0 2 3 1 5 0 ] d^{(3)}=
\begin{bmatrix}
0 & 1 & 2 & 4 \\
2 & 0 & 4 & 6 \\
\infty & \infty & 0 & 2 \\
3 & 1 & 5 & 0 \\
\end{bmatrix} d ( 3 ) = 0 2 ∞ 3 1 0 ∞ 1 2 4 0 5 4 6 2 0
d ( 4 ) = [ 0 1 2 4 2 0 4 6 5 3 0 2 3 1 5 0 ] d^{(4)}=
\begin{bmatrix}
0 & 1 & 2 & 4 \\
2 & 0 & 4 & 6 \\
5 & 3 & 0 & 2 \\
3 & 1 & 5 & 0 \\
\end{bmatrix} d ( 4 ) = 0 2 5 3 1 0 3 1 2 4 0 5 4 6 2 0
(5)
By the formula proposed in (3), we have
δ ( i , k , k ) = min ( δ ( i , k , k − 1 ) , δ ( i , k , k − 1 ) + δ ( k , k , k − 1 ) ) = δ ( i , k , k − 1 ) \begin{align}
\delta(i, k, k) &= \min (\delta(i,k,k-1), \delta(i, k, k-1)+\delta(k, k, k-1))\\
&=\delta(i, k , k-1)
\end{align} δ ( i , k , k ) = min ( δ ( i , k , k − 1 ) , δ ( i , k , k − 1 ) + δ ( k , k , k − 1 )) = δ ( i , k , k − 1 )
which means the elements in the k k k -th row or the k k k -th column stays the same when deriving d ( k ) d^{(k)} d ( k ) from d ( k − 1 ) d^{(k-1)} d ( k − 1 ) .
Hence we can derive each new value in-place. Thus, only one array is required.
(6)
(a) d [ i ] [ j ] > d [ i ] [ k ] + d [ k ] [ j ] d[i][j] > d[i][k] + d[k][j] d [ i ] [ j ] > d [ i ] [ k ] + d [ k ] [ j ]
(b) d [ i ] [ j ] ← d [ i ] [ k ] + d [ k ] [ j ] d[i][j] \leftarrow d[i][k] + d[k][j] d [ i ] [ j ] ← d [ i ] [ k ] + d [ k ] [ j ]