Transcript PPT

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