跳到主要内容

名古屋大学 情報学研究科 複雑系科学専攻 2017年8月実施 情3

Author

祭音Myyura

Description

スタート節点を n0n_0、ゴール節点を n6n_6 とする無向重み付きグラフで、最小コスト経路を探索する。

辺とコストは次の通りである。

基本手続き g_search は次の通りである。

  1. コスト情報付き節点の集合 C,DC,D を空集合とする。
  2. n0[0]n_0[0]CC に加える。
  3. 以下を繰り返す。
  4. CC 内で評価値最小の節点 pp がゴールなら終了する。
  5. ppCC から除き、DD に加える。
  6. pp に隣接し DD にない各節点 qq について、qq の旧ラベルを CC から除き、内部節点として DD の節点だけを通る n0n_0 から qq への最小コスト経路を求め、新しいラベルを CC に加える。

[1] 節点 nin_i までの経路コストを g(ni)g(n_i) とし、未確定集合 CC と確定集合 DD を用いる基本アルゴリズムの実行過程を示し、決定された経路を答える。

[2] 次の見積もり値を用い、節点の評価値を

f(ni)=g(ni)+h(ni)f(n_i)=g(n_i)+h(n_i)

に変更した拡張アルゴリズムの実行過程を示す。

節点n0n_0n1n_1n2n_2n3n_3n4n_4n5n_5n6n_6
h(ni)h(n_i)7652210

また、最適経路を保証するために hh に必要な条件を述べる。

[3] [1] と [2] で手続きの4行目の実行回数が異なる理由を、hh の効果を踏まえて説明する。

Kai

以下では、n_i[c] を「節点 nin_i の評価値が cc」という意味で用いる。
隣接節点は添字の小さい順に処理し、集合内の並び順は区別しない。表中の は内容に変化がないことを表す。

[1]

評価値が g(n)g(n) のみなので、この手続きは Dijkstra 法である。

行番号CC の内容DD の内容節点 pp節点 qq
1\varnothing\varnothing
2{n0[0]}\{n_0[0]\}
4n0n_0
5\varnothing{n0[0]}\{n_0[0]\}
6{n1[5]}\{n_1[5]\}n1n_1
6{n1[5],n2[1]}\{n_1[5], n_2[1]\}n2n_2
4n2n_2
5{n1[5]}\{n_1[5]\}{n0[0],n2[1]}\{n_0[0], n_2[1]\}
6{n1[2]}\{n_1[2]\}n1n_1
6{n1[2],n4[4]}\{n_1[2], n_4[4]\}n4n_4
4n1n_1
5{n4[4]}\{n_4[4]\}{n0[0],n1[2],n2[1]}\{n_0[0], n_1[2], n_2[1]\}
6{n3[7],n4[4]}\{n_3[7], n_4[4]\}n3n_3
6n4n_4
4n4n_4
5{n3[7]}\{n_3[7]\}{n0[0],n1[2],n2[1],n4[4]}\{n_0[0], n_1[2], n_2[1], n_4[4]\}
6{n3[5]}\{n_3[5]\}n3n_3
6{n3[5],n5[9]}\{n_3[5], n_5[9]\}n5n_5
4n3n_3
5{n5[9]}\{n_5[9]\}{n0[0],n1[2],n2[1],n3[5],n4[4]}\{n_0[0], n_1[2], n_2[1], n_3[5], n_4[4]\}
6{n5[8]}\{n_5[8]\}n5n_5
6{n5[8],n6[7]}\{n_5[8], n_6[7]\}n6n_6
4n6n_6

4行目で選ばれる節点は

n0, n2, n1, n4, n3, n6n_0,\ n_2,\ n_1,\ n_4,\ n_3,\ n_6

の順である。

n6[7]n_6[7]n3n_3 から更新され、さらに更新元を逆にたどると

n6n3n4n2n0n_6 \leftarrow n_3 \leftarrow n_4 \leftarrow n_2 \leftarrow n_0

となる。したがって、最適経路と総コストは

n0n2n4n3n6,1+3+1+2=7\boxed{n_0 \to n_2 \to n_4 \to n_3 \to n_6},\qquad 1+3+1+2=\boxed{7}

である。

[2]

表中のラベルは f(n)=g(n)+h(n)f(n)=g(n)+h(n) である。

行番号CC の内容DD の内容節点 pp節点 qq
1\varnothing\varnothing
2{n0[7]}\{n_0[7]\}
4n0n_0
5\varnothing{n0[7]}\{n_0[7]\}
6{n1[11]}\{n_1[11]\}n1n_1
6{n1[11],n2[6]}\{n_1[11], n_2[6]\}n2n_2
4n2n_2
5{n1[11]}\{n_1[11]\}{n0[7],n2[6]}\{n_0[7], n_2[6]\}
6{n1[8]}\{n_1[8]\}n1n_1
6{n1[8],n4[6]}\{n_1[8], n_4[6]\}n4n_4
4n4n_4
5{n1[8]}\{n_1[8]\}{n0[7],n2[6],n4[6]}\{n_0[7], n_2[6], n_4[6]\}
6n1n_1
6{n1[8],n3[7]}\{n_1[8], n_3[7]\}n3n_3
6{n1[8],n3[7],n5[10]}\{n_1[8], n_3[7], n_5[10]\}n5n_5
4n3n_3
5{n1[8],n5[10]}\{n_1[8], n_5[10]\}{n0[7],n2[6],n3[7],n4[6]}\{n_0[7], n_2[6], n_3[7], n_4[6]\}
6n1n_1
6{n1[8],n5[9]}\{n_1[8], n_5[9]\}n5n_5
6{n1[8],n5[9],n6[7]}\{n_1[8], n_5[9], n_6[7]\}n6n_6
4n6n_6

4行目で選ばれる節点は

n0, n2, n4, n3, n6n_0,\ n_2,\ n_4,\ n_3,\ n_6

の順であり、得られる最適経路は [1] と同じ

n0n2n4n3n6,g(n6)=7\boxed{n_0 \to n_2 \to n_4 \to n_3 \to n_6},\qquad \boxed{g(n_6)=7}

である。

hh に求められる条件

設問で通常想定される条件は、h(n)h(n) がゴールまでの真の最短コスト h(n)h^*(n) を過大評価しないことである。

0h(n)h(n),h(n6)=00\le h(n)\le h^*(n),\qquad h(n_6)=0

これは 許容性(admissibility) と呼ばれる。本問の真の残余コストは

(h(n0),,h(n6))=(7,7,6,2,3,1,0)(h^*(n_0),\ldots,h^*(n_6))=(7,7,6,2,3,1,0)

であり、与えられた h=(7,6,5,2,2,1,0)h=(7,6,5,2,2,1,0) はすべてこれ以下なので許容的である。

厳密な補足:この手続きのように、一度 DD に入れた節点を再オープンしない graph-search で一般に最適性を保証する十分条件は、各辺 (u,v)(u,v)(コスト c(u,v)c(u,v))について

h(u)c(u,v)+h(v)h(u)\le c(u,v)+h(v)

を満たす 整合性(consistency) である。与えられた hhn0n2n_0\to n_27>1+57>1+5 となり整合的ではないが、この具体的なグラフでは上記の最適経路が得られる。

[3]

4行目の実行回数は次の通りである。

アルゴリズム4行目で選ばれる pp回数
基本アルゴリズムn0,n2,n1,n4,n3,n6n_0,n_2,n_1,n_4,n_3,n_66
拡張アルゴリズムn0,n2,n4,n3,n6n_0,n_2,n_4,n_3,n_65

n2n_2 を展開した直後、基本アルゴリズムでは

g(n1)=2<g(n4)=4g(n_1)=2<g(n_4)=4

なので n1n_1 を先に展開する。一方、拡張アルゴリズムでは

f(n1)=2+6=8,f(n4)=4+2=6f(n_1)=2+6=8,\qquad f(n_4)=4+2=6

となるため、ゴールに近いと見積もられる n4n_4 が先に選ばれる。結果として n1n_1 を展開せずに n6n_6 へ到達し、4行目の実行が1回減る。