7章 最短路問題 杉原厚吉.(2001).「データ構造とアルゴリズム」. 東京:共立出版. 2011/07/12-07/19 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊 本章の目的 • グラフにおいて、「目的の一つの頂点を見つ けたところで終了する」探索を学ぶ • 7章では「最短路の探索」を例に取り上げる 7.1 最短路の探索 • グラフ(graph) G: 頂点(vertex)の集合Vと 辺(edge)の集合の対 頂点の集合V={v1, v2, …, vn}:有限集合 辺の集合E: Vの2つの要素からなる集合(つまり、 大きさ2のVの部分集合)の集合。 ・ さらに、どの辺 e ∈E も、非負実数 l(e) という 長さが与えられているとする e = {u, v} のとき、 l(e) を l(u, v) とも表す 「辺の長さ」のあるグラフの例 v2 2 v1 5 v3 4 v12 8 1 8 v4 2 2 1 1 v0 v11 5 1 v6 1 v13 7 3 6 v5 6 3 1 2 3 v10 2 v9 5 注:青字の数は辺の長さを表す (図6.8から) 1 v8 v7 最短路(shortest path)探索問題 一般にコスト(距離、 費用、時間など) • グラフ G=(V, E) において、 Vの中で指定された始点 vs と終点 vt に 対し、辺をたどってvs から vt へ至る経 路のうち、その経路に属す辺の長さの 最小値を求める、という問題 要するに、 「vs と vtを結ぶ、最も近道を求める」 という問題 v0からv6への最短路は? v2 2 v1 5 v3 4 v12 8 1 8 v4 2 2 1 1 v0 v11 5 1 v6 1 v13 7 3 6 v5 6 3 1 2 3 v10 2 v9 5 注:青字の数は辺の長さを表す (図6.8から) 1 v8 v7 Shortest-Path (教科書、p.71) • 入力: グラフG=(V, E), 隣接頂点関数T,長さ関数 l, 始点vs,終点 vt • 出力: vsから vt までの経路の最小値 手続き 1. d(vs) ← 0 V-{ vs } に属すすべての頂点 vに対してd(v) ← ∞ A ← { vs } Aの中の頂点のうち d が最小の v を取り出す v = vt ならば d(vt) を出力して終了 T(v) に属す各頂点 w に対して d(w)= ∞ ならAに追加 し、d(w)を計算。それ以外ならd(w)を更新 元のd(w)とd(v)+ l (v,w)の 7. 4へ進む d(w)=d(v)+ l (v,w) 2. 3. 4. 5. 6. 最小値を新たなd(w)に Graph-SearchとShortest-Path 類似点 次に探索すべき頂点の集合記録用のA ・ 始点vsから初めて、新たに見つかった頂点をAに格納し、 ・ Aから頂点を取り出してその周りの頂点を調べる 違い ・ 見つかった頂点をBに入れる代わりに、始点 vsから見 つけた頂点vまでの経路の長さd(v)を記憶 ・ Aから取り出す頂点vはd(v)最小のもの ・ 終了条件: vtへ到達したら終了(すべての頂点 を見るとは限らない) Shortest-Path • 頂点を格納するデータ構造として… 「経路の長さ最小」の頂点を取り出されること が重要---評価値優先探索 比較:幅優先探索、深さ優先探索 それにはヒープが適している ただし以下の修正が必要 こうすれば、根はいつ も最小の値 (1)親の頂点の値 < 子の頂点の値 (2) 「値」だけではなく頂点も記憶 ヒープ(3章から) • ヒープ(heap)とは、特殊な二進木 定義3.2 高さkの二進木Tがヒープであるための 必要十分条件は次の(i), (ii)を満たすこと (i) 深さ0 ~ k-1 の可能な頂点はすべて使われ、 深さkの頂点は左から順に使われている (ii) 頂点uが頂点vの親なら uの値( f(u) ) ≦ ≧ vの値( f(v) ) 最短路探索 親 子 (iii) 「値」だけではなく頂点も記憶 のための修正 最短路用のヒープを作る例 入力データ: 8 5 3 1 7 10 20 { 8 5 7 3 10 9 6 1 20 } 9 6 ヒープ条件(ii)を破っ ているので、『修正』 が必要 Shortest-Path (再掲) • 入力: グラフG=(V, E), 隣接頂点関数T,長さ関数 l, 始点vs,終点 vt • 出力: vsから vt までの経路の最小値 手続き dは始点からの最短距離を記憶するための配列 1. d(vs) ← 0 V-{ vs } に属すすべての頂点 vに対してd(v) ← ∞ Aは探索すべき頂点を記憶するためのヒープ A ← { vs } Aの中の頂点のうち d が最小の v を取り出す v = vt ならば d(vt) を出力して終了 ヒープの作り直しが必要 T(v) に属す各頂点 w に対して d(w)= ∞ ならAに追加 し、d(w)を計算。 d(w)=d(v)+ l (v,w) それ以外ならd(w)を更新 元のd(w)とd(v)+ l (v,w)の 7. 4へ進む 2. 3. 4. 5. 6. 最小値を新たなd(w)に v0からv12への最短路の長さは?答: V= {vv00, v1, v2, v9, v10, v11, v12} vv22 A d 1 0 2 ∞ 3 1+ ∞3 4 2+ 5 ∞ 5 ∞ 6 1+2 ∞ 4 2 v0 v1 v2 v9 ≦ 2+ v10 v11 2+ 7 ∞ ≦3+ v12 v11 11 11 v0 v12 v11 5 11 5 3 6 7 33 vv10 10 2 v9 1. 4. d(v Aの中の頂点のうち d が最小の v を取り出す s) ← 0 2. に属すすべての頂点 vに対してd(v) ← ∞ 5. V-{ v = vvts }ならば d(vt) を出力して終了 3. A ←に属す各頂点 { vs } 6. T(v) w に対し d(w)= ∞ ならd(w) =d(v)+ l (v,w)を計 算しwをAに追加。それ以外ならd(w)を更新 Shortest-Pathアルゴリズムの正しさ 性質7.1(教科書p.72): アルゴリズムShortest-Pathのステップ4で Aから取 り出された頂点v に対して、その時点での値 d(v) は、vsから vまでの最短路の長さをあらわす 証明: 数学的帰納法による Shortest-Pathアルゴリズムの計算量 ・ グラフG=(V, する。 4. Aの中の頂点のうち v を取り出す 1. d(vds)が最小の ←0 5. v = vt ならば d(v ) を出力して終了 tV-{ 2. vs } に属すすべての 6. T(v) に属す各頂点 w に対し d(w)= ∞mならd(w) E)の頂点数を 頂点 n、辺の数を と∞ vに対してd(v) ← =d(v)+ l (v,w)を計算しwをAに追加。それ以外 3. A ← { vs } ならd(w)を更新 1. アルゴリズムのステップ1, 3, 5は定数時間で実 行可能(1と3は初期値を与える、5は終了条件) 2. ステップ2の実行は O(n) --- Vの頂点すべてに 対してdの初期値を与える 3. ステップ4は最大でn回の繰り返し。各回でヒー プAから最小値を取り出す→ O(n log n) 4. ステップ6は、辺の数m個回、ヒープを作り直す から O(m log n) v0からv6への最短路は? v2 2 v1 5 v3 4 v12 8 1 8 v4 2 2 1 1 v0 v11 5 1 v6 1 v13 7 3 6 v5 6 3 1 2 3 v10 2 v9 5 注:青字の数は辺の長さを表す (図6.8から) 1 v8 v7 課題(教科書 p. 77) 1. 演習問題 7.1 図6.8のグラフで、 vs =v0, vt = v6とおいたときのアル ゴリズムShortest-Pathの振る舞いを示せ。 2. 演習問題7.2 アルゴリズムShortest-Pathを変更して、頂点vsから 他のすべての頂点までの最短路の長さを求めるア ルゴリズムを作れ。またshortestPath.rbを改変してこ れを実現せよ。 必要ならば shortestPath.rbの簡単な解説 heap4Graph.rb におけるヒープの解説 graphNode, Arcクラスの解説 shortestPathの解説
© Copyright 2024 ExpyDoc