グラフアルゴリズムの可視化 数理科学コース 福永研究室 高橋 優子 2015/10/1 目次 1. 研究背景・目標 2. ダイクストラ法 3. クラスカル法 4. OpenGLを用いた実装 5. まとめ 2015/10/1 1.研究背景・目標 • グラフアルゴリズムの学習 – C言語にてダイクストラ法・クラスカル法を実装 – 処理結果をPGM形式にして出力 • OpenGLを用いて 三次元のグラフアルゴリズムを可視化 • 結果だけでなく過程も見えるようにする 2015/10/1 2.ダイクストラ法 2.1 ダイクストラ法とは – Edsger Wybe Dijkstra による(1959) – グラフ理論における最短経路問題を解く手法 • スタートノードからゴールノードまでの最短距離を求める – ダイクストラ法の利用先 • カーナビゲーションの経路探索 • 鉄道の経路案内 など – 今回はゴールノードを指定しない • 全ノードへの最短距離を求められる 2015/10/1 2.ダイクストラ法 2.2 アルゴリズム ① 全ノード間のコスト(距離)を+∞に初期化し さらに状態を「未使用」としておく. ② 全ノードの座標と, 辺の有無とをランダムに決定し 辺がある場合はその長さをコストとする. また, スタートノードSを指定する. 1 1 S 1 3 2015/10/1 4 2 3 【現時点でのコスト】 ノード1…1 ノード2…3 ノード3…+∞ 2.ダイクストラ法 2.2 アルゴリズム ③ Sからのコストが最小となる未使用ノードXを探す. 1.また, Xにつながる全てのノードYに対し, 「Yの現在のコスト」>(「X→Yの距離」+「Xのコスト」) を満たした場合, Yのコストを更新する. 2.アルゴリズムを終了する. 1 1 S 1 3 2015/10/1 4 2 3 【現時点でのコスト】 ノード1…1(確定) ノード2…2(コスト更新) ノード3…5(コスト更新) 2.ダイクストラ法 2.2 アルゴリズム ③ Sからのコストが最小となる未使用ノードXを探す. 1.また, Xにつながる全てのノードYに対し, 「Yの現在のコスト」>(「X→Yの距離」+「Xのコスト」) を満たした場合, Yのコストを更新する. 2.アルゴリズムを終了する. 1 1 S 1 3 2015/10/1 4 2 3 【現時点でのコスト】 ノード1…1(確定) ノード2…2(確定) ノード3…5 2.ダイクストラ法 2.2 アルゴリズム ③ Sからのコストが最小となる未使用ノードXを探す. 1.また, Xにつながる全てのノードYに対し, 「Yの現在のコスト」>(「X→Yの距離」+「Xのコスト」) を満たした場合, Yのコストを更新する. 2.アルゴリズムを終了する. 1 1 S 1 3 2015/10/1 4 2 3 【現時点でのコスト】 ノード1…1(確定) ノード2…2(確定) ノード3…5(確定) 2.ダイクストラ法 2.3 実装 ノードの構造体 2015/10/1 2.ダイクストラ法 2.3 実装 確定ノード決定・コスト更新 確定ノード決定 コスト更新 2015/10/1 3.クラスカル法 3.1 クラスカル法とは – Joseph Kruskal による(1956) – グラフ理論における最小全域木問題を解く手法 • 全てのノードを閉路が含まれないように結合し, 辺の重みの総和が最小となるような木を求める. – 貪欲アルゴリズムの一種 2015/10/1 3.クラスカル法 3.2 アルゴリズム ① グラフの各頂点がそれぞれの木に属するように 森(木の集合) F を生成する. ② グラフの全ての辺を含む集合 S を生成する. 4 a 11 7 2015/10/1 8 b e c 14 6 1 d 3.クラスカル法 3.2 アルゴリズム ③ S が空集合になるまで以下を繰り返す. 1. S から重みが最小の辺を削除する. 2. その辺が2つの木を連結するものならば それを森に加え, 2つの木を1つにまとめる. 3. そうでない場合は単に捨てる. 4 a 11 7 2015/10/1 8 b e c 14 6 1 d 3.クラスカル法 3.2 アルゴリズム ③ S が空集合になるまで以下を繰り返す. 1. S から重みが最小の辺を削除する. 2. その辺が2つの木を連結するものならば それを森に加え, 2つの木を1つにまとめる. 3. そうでない場合は単に捨てる. 4 a 11 7 2015/10/1 8 b e c 14 6 1 d 3.クラスカル法 3.2 アルゴリズム ③ S が空集合になるまで以下を繰り返す. 1. S から重みが最小の辺を削除する. 2. その辺が2つの木を連結するものならば それを森に加え, 2つの木を1つにまとめる. 3. そうでない場合は単に捨てる. 4 a 11 7 2015/10/1 8 b e c 14 6 1 d 3.クラスカル法 3.2 アルゴリズム ③ S が空集合になるまで以下を繰り返す. 1. S から重みが最小の辺を削除する. 2. その辺が2つの木を連結するものならば それを森に加え, 2つの木を1つにまとめる. 3. そうでない場合は単に捨てる. 4 a 11 7 2015/10/1 8 b e c 14 6 1 d 3.クラスカル法 3.3 実装 辺の構造体 2015/10/1 3.クラスカル法 3.3 実装 最小経路を発見・木を結合 重みの配列をソート 最短経路発見 2015/10/1 4.OpenGLを用いた実装 4.1 ノードの描画 例:ダイクストラのノード描画 不確定 ノードは 水色 確定ノード は青 2015/10/1 4.OpenGLを用いた実装 4.2 エッジの描画 例:クラスカルの辺 最短経路は黄色 使ってない経路は水色 2015/10/1 4.OpenGLを用いた実装 4.3 視点変更 図を回転表示するときの工夫 視点の位置によって 画面の上方向を変える 2015/10/1 4.OpenGLを用いた実装 4.4 ダイクストラ ランダムに ノードを10個生成 エッジを ランダムに生成 黄色は スタートノード 2015/10/1 4.OpenGLを用いた実装 4.4 ダイクストラ マウスを クリックするごとに 1ステップ進める 確定ノードは 青く塗る 使用するエッジは 黄色く塗る 2015/10/1 4.OpenGLを用いた実装 4.4 ダイクストラ 全てのノードへの 最短経路を 見つける 2015/10/1 4.OpenGLを用いた実装 4.4 ダイクストラ キーボード操作によって回転 2015/10/1 4.OpenGLを用いた実装 4.4 ダイクストラ キーボード操作によって拡大・縮小 2015/10/1 4.OpenGLを用いた実装 4.5 クラスカル ランダムにノードを 10個生成 全てのノードを つなぐエッジを生成 道を増やすため さらにランダムに エッジを生成 2015/10/1 4.OpenGLを用いた実装 4.5 クラスカル マウスを クリックするごとに 1ステップ進める 確定エッジを 黄色く塗る 2015/10/1 4.OpenGLを用いた実装 4.5 クラスカル マウスを クリックするごとに 1ステップ進める 確定エッジを 黄色く塗る 2015/10/1 5.まとめ • 苦労したこと – OpenGLの処理に合わせたプログラムの分割. – 図を回転させる際の視点の設定. • 工夫したこと – 図を見やすくするために, ランダムに定める ノードの間隔を調整した. 2015/10/1
© Copyright 2024 ExpyDoc