SlideShare ist ein Scribd-Unternehmen logo
1 von 10
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
深さ・幅優先探索の仕組み・特徴・応用について
■ サマリー​​(7,404文字)
本稿では、グラフ探索の深さ優先探索、幅優先探索、2つのアルゴリズムを解説す
る。グラフ探索は、カーナビや鉄道路線の乗り換え等の経路探索に利用されてお
り、深さ・幅優先探索は、系統的探索手法に分類される。以下の木を例に、フ
ロー・チャート、ハンド・シュミレーション、Java構文を基にした疑似コードで
解説する。
■ 前提 グラフ
グラフとは、「点と線がつながった構造」[1]を指す。
グラフで用いる木(Tree)は、根(Root)、枝(Edge、辺とも呼ばれる)、節点
(Vertex/Node)、葉(Leaf)から成る。根はグラフの開始地点を指し、枝は、節点同士
を繋ぐ線を指す。葉は、木の末端にある節点で、通常、葉には枝がなく、終点にな
る。[2]
1
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
身近な例は、カーナビゲーションシステム(以降カーナビ)である。カーナビには、
現在地から目的地までの最短距離・時間を計算するアルゴリズムが予め複数種類、
組み込まれており、状況に応じて、適切なアルゴリズムを選択する。[3]
● グラフ探索問題と2つの評価軸
グラフ探索の代表的な問題は、上記の最短ルートの探索である。アルゴリズム
は、時間計算量、空間計算量の2つの軸で評価される。通常、最悪の場合
(Worst Case)、つまり最も計算量が多かった場合を、評価対象とする。
✔ 時間計算量 ​(Time Complexity)
時間計算量は、最短経路の探索に掛かる時間(厳密には処理・操作回数)を
指す。O(項)と表記し、時間が短い程、優れたアルゴリズムになる。O(1)
ならば、一定回数の処理が必要になり、O(n2)なら処理・操作回数の2乗に
比例し、ステップ数が増える。[4]
✔ 空間計算量 ​(Space Complexity)
空間計算量は、最短距離を求める際、コンピューターが必要なメモリ(記憶
領域)量を指す。時間計算量同様、O(項)と表記し、メモリ量が小さい程、
優れたアルゴリズムになる。O(1)ならば、処理・操作回数に関わらず、
一定のメモリが必要であり、O(n2)ならば、処理・操作回数の2乗に比例
し、必要なメモリが増える。[5]
● 結論
整理すると、以下の表になる。
順位 時間計算量 空間計算量
1 短い 小さい
2 短い 大きい
3 長い 小さい
4 長い 大きい
実際は、時間計算量と空間計算量は、トレードオフの関係にある。つまり、メモ
リが大きければ、時間計算量は短くなり、逆に、メモリが小さければ、時間計算
量は長くなる。
■ 系統的探索
深さ・幅優先探索は、系統的探索に分類され、​3つの特徴がある。[6]
1. 問題に関する知識を用いず、シラミ潰しに探索
2. 汎用的
3. 原理的には、解(目標)の発見が保証される
深さ・幅優先探索ともに木の根 - 今回の例ではAから、その子B、Cを探索する。
根から全ての節点を探索するので、木が有限であれば、原理的には、目標地点が発
見される。木が無限の場合、探索も無限に続く為、目標地点の発見は保証されな
2
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
い。
■ 深さ優先探索(Depth First Search)の特徴
深さ優先探索は、縦型探索とも呼ばれ、根から一番深い葉まで行き、戻ってくるア
ルゴリズムである。目標地点が深い場合、幅優先探索よりも効率的である。深さ優
先探索の特徴は、2点ある。[6]
1. 目標地点が近くにある場合、遠回りすることもある
2. 無限に深く伸びるグラフでは、目標地点に到達しないこともある
● 時間計算量
O(|E|)になる。目標地点が、現在地点から最も離れている場合、全経路を探索
する必要がある。|E|は、枝(辺)の数を指し、EはEdgeの頭文字を表す。最も
探索に時間が掛かるケース(Worst Case)では、全ての枝を探索する為、O(|E|)
となる。[7]
● 空間計算量
O(|V|)になる。目標地点が、現在地点から最も離れている場合、探索した節点
を全て記録する必要がある。|V|は、節点の数を指し、VはVertexを表す。最
も探索に時間が掛かるケース(Worst Case)では、全ての節点を記録する為、O
(|V|)となる。[7]
■ 深さ優先探索のアルゴリズム
深さ優先探索アルゴリズムは、1から6の順に実行される。[6]
1. 探索を開始する点をOpenListに入れる。
ClosedListは、空にする。
2. OpenListが空(解がないなら)探索は失敗して終了。
3. OpenListの先頭のn点を取り除き、ClosedListに入れる。
4. nが目標点であるなら探索は成功して終了
5. nの子のうち、OpenListやClosedListに含まれていない点は全てをOpenList 
の先頭に入れて2.へ、
6. そのような点が無ければ、そのまま2.へ。
3
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
■ 深さ優先探索のフローチャート
先のアルゴリズムが、以下のフローチャートである。
4
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
■ ハンド・シュミレーション
1巡目
1. OpenList = [A], ClosedList = []
3. n = A, OpenList = [], ClosedList = [A]
5. OpenList = [B, C], ClosedList = [A]
2巡目
3. n = B, OpenList = [C], ClosedList = [A, B]
5. OpenList = [D, E, C], ClosedList = [A, B]
3巡目
3. n = D, OpenList = [E, C], ClosedList = [A, B, D]
5. OpenList = [F, G, E, C], ClosedList = [A, B, D]
4巡目
3. n = F, OpenList = [G, E, C], ClosedList = [A, B, D, F]
5巡目
3. n = G, OpenList = [E, C], ClosedList = [A, B, D, F, G]
5. OpenList = [H, I, E, C], ClosedList = [A, B, D, F, G]
6巡目
3. n = H, OpenList = [I, E, C], ClosedList = [A, B, D, F, G, H]
7巡目
3. n = I, OpenList = [E, C], ClosedList = [A, B, D, F, G, H, I]
8巡目
3. n = E, OpenList = [C], ClosedList = [A, B, D, F, G, H, I, E]
9巡目
3. n = C, OpenList = [], ClosedList = [A, B, D, F, G, H, I, E, C]
■ 疑似コード
// Javaのシンタックスを基に、疑似コードを作成した。
// はコメントを現す
import java.util.Arrays;
// Containsメソッドを利用する為、java.util.Arraysクラスをインポート
ArrayList<String> OpenList = new ArrayList<>(); // 文字列リストOpenListを定義する
ArrayList<String> ClosedList = new ArrayList<>(); // 文字列リストClosedListを定義する
Char n = A; // 文字変数として探索点nを定義・初期化する
For all node/s iterate{ // 全ての探索点に対し、以下を繰り返す
OpenList.add(n); // OpenListに探索点nを代入する
If OpenList.contains(null){ // OpenListが空(null)を含む場合
Stop search; // 探索を中止する
5
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
}
Else // OpenListが空(null)を含まない場合
n = OpenList.get(0); // OpenListの先頭要素を、探索点nに代入する
ClosedList.add(n); // ClosedListに探索点nを追加する
OpenList.remove(0); // OpenListから先頭要素を取り除く
If n == Destination{ // nが目標点である場合
Stop search; // 探索を中止する
}
Else // nが目標点ではない場合
// 探索点nの子ノードにOpen、ClosedListに含まれていない点がある場合
If n's child node/s ! in OpenList || ClosedList{
                 // OpenListの先頭要素に全ての点を挿入する
OpenList.add(0, node/s);
}
Else // 含まれていない点がない場合
Return null; // 処理を行わず、先頭に戻る
}
■ 幅優先探索(Breadth First Search)の特徴
幅優先探索は、横型探索とも呼ばれ、木の根から、最寄りの子を順番に探索する。
目標地点が根から近い場合、深さ優先探索よりも効率的である。幅優先探索の特徴
は、2点ある。[6]
1. 根に近い浅い点から探索する為、目標地点が近い場合、遠回りせずに済む
2. 探索した点を、全て記録する必要が有り、空間計算量が大きい
● 時間計算量
O(|E|)になる。目標地点が、現在地点から最も離れている場合、全経路を探索
する必要がある。深さ優先探索同様、最も時間が掛かるケース(Worst Case)で
は、全ての枝を探索する。[8]
● 空間計算量
O(|V|)になる。目標地点が、現在地点から最も離れている場合、探索した節点
を全て記録する必要がある。深さ優先探索と同様、最もメモリ消費するケース
(Worst Case)では、全節点を記録する。[8]
■ 幅優先探索のアルゴリズム
深さ優先探索アルゴリズムとの違いは6.で、含まれていない点を、OpenListの
末尾に入れる箇所だけである。[6]
1. 探索を開始する点をOpenListに入れる。
2. ClosedListは、空にする。
3. OpenListが空(解がないなら)探索は失敗して終了。
4. OpenListの先頭のn点を取り除き、ClosedListに入れる。
5. nが目標点であるなら探索は成功して終了。
6. nの子のうち、OpenListやClosedListに含まれていない点は全てをOpenListの
6
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
末尾​に入れて2.へ、そのような点が無ければ、そのまま2.へ。
■ 幅優先探索のフローチャート
深さ優先探索と、大きく変わらない。
7
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
■ ハンド・シュミレーション
1巡目
1. OpenList = [A], ClosedList = []
3. n = A, OpenList = [], ClosedList = [A]
5. OpenList = [B, C], ClosedList = [A]
2巡目
3. n = B, OpenList = [C], ClosedList = [B, A]
5. OpenList = [C, D, E], ClosedList = [B, A]
3巡目
3. n = C, OpenList = [D, E], ClosedList = [C, B, A]
4巡目
3. n = D, OpenList = [E], ClosedList = [D, C, B, A]
5. OpenList = [E, F, G], ClosedList = [D, C, B, A]
5巡目
3. n = E, OpenList = [F, G], ClosedList = [E, D, C, B, A]
6巡目
3. n = F, OpenList = [G], ClosedList = [F, E, D, C, B, A]
7巡目
3. n = G, OpenList = [], ClosedList = [G, F, E, D, C, B, A]
5. OpenList = [H, I], ClosedList = [G, F, E, D, C, B, A]
8巡目
3. n = H, OpenList = [I], ClosedList = [H, G, F, E, D, C, B, A]
9巡目
3. n = I, OpenList = [], ClosedList = [I, H, G, F, E, D, C, B, A]
■ 疑似コード
// 深さ優先探索との相違点を青字・太字・下線でハイライトした
// はコメントを現す
import java.util.Arrays;
// Containsメソッドを利用する為、java.util.Arraysクラスをインポート
ArrayList<String> OpenList = new ArrayList<>(); // 文字列リストOpenListを定義する
ArrayList<String> ClosedList = new ArrayList<>(); // 文字列リストClosedListを定義する
Char n = A; // 文字変数として探索点nを定義、初期化する
For all node/s iterate{ // 全ての探索点に対し、以下を繰り返す
OpenList.add(n); // OpenListに探索点nを代入する
If OpenList.contains(null){ // OpenListが空(null)を含む場合
Stop search; // 探索を中止する
}
8
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
Else // OpenListが空(null)を含まない場合
n = OpenList.get(0); // OpenListの先頭要素を、探索点nに代入する
ClosedList.add(n); // ClosedListに探索点nを追加する
OpenList.remove(0); // OpenListから先頭要素を取り除く
If n == Destination{ // nが目標点である場合
Stop search; // 探索を中止する
}
Else // nが目標点ではない場合
// 探索点nの子ノードにOpen、ClosedListに含まれていない点がある場合
If n's child node/s ! in OpenList || ClosedList{
OpenList.add(​node/s​); // OpenListの末尾に全ての点を挿入する
}
Else // 含まれていない点がない場合
Return null; // 処理を行わず、先頭に戻る
}
■ 応用
最後に応用例を2つ紹介する。深さ・幅優先探索を含むグラフ探索は、道路や
交通機関の経路探索に実装されている。
● カーナビでの経路探索
カーナビの経路探索は、代表的な応用例である。カーナビメーカー、自動車
メーカーが中心に、関連技術の特許出願をしている。[9] ナビタイムジャパン
は、グラフ理論を基に、経路を、枝単位でコスト計算し、どの経路が最適かを
決めている。コストは、ポリシーを基に時間、金銭、煩雑さといった係数に、
ベクトル内積で、それぞれの実績を掛け合わせ、算出する。目標地点までの到
達時間を優先する場合は、時間に、距離を優先する場合は、距離に重み付けを
行い、特定の変数を重視した探索も出来る。[10]
● 地方線から主要線の経路探索
18年、谷口らは、普通列車を利用し、出発駅から乗り継ぎながら、1日の運行
時間内で移動できる最長距離を求める研究を行った。同論文の中で、出発駅が
地方線の場合、幅優先探索を利用することで、いち早く主要線の駅に辿りつけ
ると提案した。[11]
経路探索の実際は、深さ・幅優先探索を含む複数のアルゴリズムを用意し、目標地
点までの距離、金銭、煩雑さ等のコストに、天気、道路状況、イベント等の外部要
因も加味し、最適な経路を探索している。外部要員は変化し続ける為、カーナビ等
から得られる位置データを、モニタリング、分析しながら、探索精度の改良を図っ
ている。
9
 
深さ・幅優先探索の仕組み・特徴・応用について
2020年7月29日
嘉村 しょう 
■ 参考文献
[1] 保坂和弘(2011). グラフ探索アルゴリズムとその応用, 2011-5-4,
閲覧日 2020-7-23
http://hos.ac/slides/20110504_graph.pdf
[2] ウィキペディア, 「木(数学) - Wikipedia」, 閲覧日 2020-7-24
https://ja.wikipedia.org/wiki/木_(数学)
[3] 浅井政太郎(2016), Qiita, グラフ探索ことはじめ - 幅・深さ優先探索 -,
2016-11-24, 閲覧日 2020-7-23
https://qiita.com/guicho271828/items/adba26e0772d7063b4c8
[4] 時間計算量【time complexity】, IT用語辞典 e-Words, 2018-12-24,
閲覧日 2020-7-24
http://e-words.jp/w/時間計算量.html
[5] 空間計算量【space complexity】, IT用語辞典 e-Words, 2018-12-24,
閲覧日 2020-7-24
http://e-words.jp/w/空間計算量.html
[6] 大西仁(2018), 放送大学大学院, 知能システム論 第2回 探索に基づく問題解決(1),
pp21-45
[7] ウィキペディア, 「深さ先探索 - Wikipedia」, 閲覧日 2020-7-24
https://ja.wikipedia.org/wiki/深さ優先探索
[8] ウィキペディア, 「幅優先探索 - Wikipedia」, 閲覧日 2020-7-24
https://ja.wikipedia.org/wiki/幅優先探索
[9] 独立行政法人 工業所有権情報・研修館(2005), 平成16年度 特許流通支援チャー
ト カーナビ経路探索技術, 2005, pⅱ, 閲覧日 2020-7-24
https://www.inpit.go.jp/blob/katsuyo/pdf/chart/fdenki22.pdf
[10] 福士達央(2018), SlideShare, NAVITIMEの経路はこうして作られる ~4100万人
の移動を導く経路探索の流儀~, 2018-2-28, 閲覧日 2020-7-24
https://www.slideshare.net/NavitimeJapan/navitime-89761183
[11] 谷口雄大, 猪股俊光, 杉野栄二, 成田国輝, 今井信太郎, 新井義和, 岩手県立大学
ソフトウェア情報学部ソフトウェア情報学科(2018), 普通列車を対象にした制約付
き最長距離経路探索の考案, 情報処理学会第80回全国大会, 3K-06, pp, 323-324
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_action_common_download&item_id=
187689&item_no=1&attribute_id=1&file_no=1
以上
10
 

Weitere ähnliche Inhalte

Was ist angesagt?

Newman アルゴリズムによるソーシャルグラフのクラスタリング
Newman アルゴリズムによるソーシャルグラフのクラスタリングNewman アルゴリズムによるソーシャルグラフのクラスタリング
Newman アルゴリズムによるソーシャルグラフのクラスタリングAtsushi KOMIYA
 
GCNによる取引関係グラフからの企業の特徴量抽出
GCNによる取引関係グラフからの企業の特徴量抽出GCNによる取引関係グラフからの企業の特徴量抽出
GCNによる取引関係グラフからの企業の特徴量抽出Masakazu Mori
 
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)株式会社MonotaRO Tech Team
 
単語の分散表現と構成性の計算モデルの発展
単語の分散表現と構成性の計算モデルの発展単語の分散表現と構成性の計算モデルの発展
単語の分散表現と構成性の計算モデルの発展Naoaki Okazaki
 
並列データベースシステムの概念と原理
並列データベースシステムの概念と原理並列データベースシステムの概念と原理
並列データベースシステムの概念と原理Makoto Yui
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化Proktmr
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」Ken'ichi Matsui
 
臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜
臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜
臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜Yasuyuki Okumura
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43Preferred Networks
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
ステレオカメラ作成の道
ステレオカメラ作成の道ステレオカメラ作成の道
ステレオカメラ作成の道ytanno
 
20130716 はじパタ3章前半 ベイズの識別規則
20130716 はじパタ3章前半 ベイズの識別規則20130716 はじパタ3章前半 ベイズの識別規則
20130716 はじパタ3章前半 ベイズの識別規則koba cky
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 Ken'ichi Matsui
 
MCMCによるベイズ因子分析法について
MCMCによるベイズ因子分析法についてMCMCによるベイズ因子分析法について
MCMCによるベイズ因子分析法について考司 小杉
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれからcyberagent
 
わかりやすいパターン認識_2章
わかりやすいパターン認識_2章わかりやすいパターン認識_2章
わかりやすいパターン認識_2章weda654
 
Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)yukihiro domae
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナドYoshihiro Mizoguchi
 

Was ist angesagt? (20)

Newman アルゴリズムによるソーシャルグラフのクラスタリング
Newman アルゴリズムによるソーシャルグラフのクラスタリングNewman アルゴリズムによるソーシャルグラフのクラスタリング
Newman アルゴリズムによるソーシャルグラフのクラスタリング
 
GCNによる取引関係グラフからの企業の特徴量抽出
GCNによる取引関係グラフからの企業の特徴量抽出GCNによる取引関係グラフからの企業の特徴量抽出
GCNによる取引関係グラフからの企業の特徴量抽出
 
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
モノタロウの1900万商品を検索する Elasticsearch構築運用事例(2022-10-26 第50回Elasticsearch 勉強会発表資料)
 
単語の分散表現と構成性の計算モデルの発展
単語の分散表現と構成性の計算モデルの発展単語の分散表現と構成性の計算モデルの発展
単語の分散表現と構成性の計算モデルの発展
 
並列データベースシステムの概念と原理
並列データベースシステムの概念と原理並列データベースシステムの概念と原理
並列データベースシステムの概念と原理
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜
臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜
臨床疫学研究における傾向スコア分析の使い⽅ 〜観察研究における治療効果研究〜
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
ステレオカメラ作成の道
ステレオカメラ作成の道ステレオカメラ作成の道
ステレオカメラ作成の道
 
20130716 はじパタ3章前半 ベイズの識別規則
20130716 はじパタ3章前半 ベイズの識別規則20130716 はじパタ3章前半 ベイズの識別規則
20130716 はじパタ3章前半 ベイズの識別規則
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
 
MCMCによるベイズ因子分析法について
MCMCによるベイズ因子分析法についてMCMCによるベイズ因子分析法について
MCMCによるベイズ因子分析法について
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから
 
わかりやすいパターン認識_2章
わかりやすいパターン認識_2章わかりやすいパターン認識_2章
わかりやすいパターン認識_2章
 
Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)Graph convolution (スペクトルアプローチ)
Graph convolution (スペクトルアプローチ)
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド
 

Mehr von Sho Kamura

ソリティア カップル アルゴリズム解説
ソリティア カップル アルゴリズム解説ソリティア カップル アルゴリズム解説
ソリティア カップル アルゴリズム解説Sho Kamura
 
アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援Sho Kamura
 
畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用Sho Kamura
 
北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響Sho Kamura
 
DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  Sho Kamura
 
重大製品事故の実態分析
重大製品事故の実態分析重大製品事故の実態分析
重大製品事故の実態分析Sho Kamura
 
犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析Sho Kamura
 

Mehr von Sho Kamura (7)

ソリティア カップル アルゴリズム解説
ソリティア カップル アルゴリズム解説ソリティア カップル アルゴリズム解説
ソリティア カップル アルゴリズム解説
 
アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援アパレル販売店に於ける売上低下問題の解決支援
アパレル販売店に於ける売上低下問題の解決支援
 
畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用畳み込みニューラルネットワークの仕組み・特徴・応用
畳み込みニューラルネットワークの仕組み・特徴・応用
 
北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響北米 大統領選挙に於けるデジタル・メディアの影響
北米 大統領選挙に於けるデジタル・メディアの影響
 
DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  DVDレンタル店の売上拡大の為の分析  
DVDレンタル店の売上拡大の為の分析  
 
重大製品事故の実態分析
重大製品事故の実態分析重大製品事故の実態分析
重大製品事故の実態分析
 
犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析犯罪統計と経済指標の関係分析
犯罪統計と経済指標の関係分析
 

深さ・幅優先探索の仕組み・特徴・応用

  • 1. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  深さ・幅優先探索の仕組み・特徴・応用について ■ サマリー​​(7,404文字) 本稿では、グラフ探索の深さ優先探索、幅優先探索、2つのアルゴリズムを解説す る。グラフ探索は、カーナビや鉄道路線の乗り換え等の経路探索に利用されてお り、深さ・幅優先探索は、系統的探索手法に分類される。以下の木を例に、フ ロー・チャート、ハンド・シュミレーション、Java構文を基にした疑似コードで 解説する。 ■ 前提 グラフ グラフとは、「点と線がつながった構造」[1]を指す。 グラフで用いる木(Tree)は、根(Root)、枝(Edge、辺とも呼ばれる)、節点 (Vertex/Node)、葉(Leaf)から成る。根はグラフの開始地点を指し、枝は、節点同士 を繋ぐ線を指す。葉は、木の末端にある節点で、通常、葉には枝がなく、終点にな る。[2] 1  
  • 2. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  身近な例は、カーナビゲーションシステム(以降カーナビ)である。カーナビには、 現在地から目的地までの最短距離・時間を計算するアルゴリズムが予め複数種類、 組み込まれており、状況に応じて、適切なアルゴリズムを選択する。[3] ● グラフ探索問題と2つの評価軸 グラフ探索の代表的な問題は、上記の最短ルートの探索である。アルゴリズム は、時間計算量、空間計算量の2つの軸で評価される。通常、最悪の場合 (Worst Case)、つまり最も計算量が多かった場合を、評価対象とする。 ✔ 時間計算量 ​(Time Complexity) 時間計算量は、最短経路の探索に掛かる時間(厳密には処理・操作回数)を 指す。O(項)と表記し、時間が短い程、優れたアルゴリズムになる。O(1) ならば、一定回数の処理が必要になり、O(n2)なら処理・操作回数の2乗に 比例し、ステップ数が増える。[4] ✔ 空間計算量 ​(Space Complexity) 空間計算量は、最短距離を求める際、コンピューターが必要なメモリ(記憶 領域)量を指す。時間計算量同様、O(項)と表記し、メモリ量が小さい程、 優れたアルゴリズムになる。O(1)ならば、処理・操作回数に関わらず、 一定のメモリが必要であり、O(n2)ならば、処理・操作回数の2乗に比例 し、必要なメモリが増える。[5] ● 結論 整理すると、以下の表になる。 順位 時間計算量 空間計算量 1 短い 小さい 2 短い 大きい 3 長い 小さい 4 長い 大きい 実際は、時間計算量と空間計算量は、トレードオフの関係にある。つまり、メモ リが大きければ、時間計算量は短くなり、逆に、メモリが小さければ、時間計算 量は長くなる。 ■ 系統的探索 深さ・幅優先探索は、系統的探索に分類され、​3つの特徴がある。[6] 1. 問題に関する知識を用いず、シラミ潰しに探索 2. 汎用的 3. 原理的には、解(目標)の発見が保証される 深さ・幅優先探索ともに木の根 - 今回の例ではAから、その子B、Cを探索する。 根から全ての節点を探索するので、木が有限であれば、原理的には、目標地点が発 見される。木が無限の場合、探索も無限に続く為、目標地点の発見は保証されな 2  
  • 3. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  い。 ■ 深さ優先探索(Depth First Search)の特徴 深さ優先探索は、縦型探索とも呼ばれ、根から一番深い葉まで行き、戻ってくるア ルゴリズムである。目標地点が深い場合、幅優先探索よりも効率的である。深さ優 先探索の特徴は、2点ある。[6] 1. 目標地点が近くにある場合、遠回りすることもある 2. 無限に深く伸びるグラフでは、目標地点に到達しないこともある ● 時間計算量 O(|E|)になる。目標地点が、現在地点から最も離れている場合、全経路を探索 する必要がある。|E|は、枝(辺)の数を指し、EはEdgeの頭文字を表す。最も 探索に時間が掛かるケース(Worst Case)では、全ての枝を探索する為、O(|E|) となる。[7] ● 空間計算量 O(|V|)になる。目標地点が、現在地点から最も離れている場合、探索した節点 を全て記録する必要がある。|V|は、節点の数を指し、VはVertexを表す。最 も探索に時間が掛かるケース(Worst Case)では、全ての節点を記録する為、O (|V|)となる。[7] ■ 深さ優先探索のアルゴリズム 深さ優先探索アルゴリズムは、1から6の順に実行される。[6] 1. 探索を開始する点をOpenListに入れる。 ClosedListは、空にする。 2. OpenListが空(解がないなら)探索は失敗して終了。 3. OpenListの先頭のn点を取り除き、ClosedListに入れる。 4. nが目標点であるなら探索は成功して終了 5. nの子のうち、OpenListやClosedListに含まれていない点は全てをOpenList  の先頭に入れて2.へ、 6. そのような点が無ければ、そのまま2.へ。 3  
  • 5. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  ■ ハンド・シュミレーション 1巡目 1. OpenList = [A], ClosedList = [] 3. n = A, OpenList = [], ClosedList = [A] 5. OpenList = [B, C], ClosedList = [A] 2巡目 3. n = B, OpenList = [C], ClosedList = [A, B] 5. OpenList = [D, E, C], ClosedList = [A, B] 3巡目 3. n = D, OpenList = [E, C], ClosedList = [A, B, D] 5. OpenList = [F, G, E, C], ClosedList = [A, B, D] 4巡目 3. n = F, OpenList = [G, E, C], ClosedList = [A, B, D, F] 5巡目 3. n = G, OpenList = [E, C], ClosedList = [A, B, D, F, G] 5. OpenList = [H, I, E, C], ClosedList = [A, B, D, F, G] 6巡目 3. n = H, OpenList = [I, E, C], ClosedList = [A, B, D, F, G, H] 7巡目 3. n = I, OpenList = [E, C], ClosedList = [A, B, D, F, G, H, I] 8巡目 3. n = E, OpenList = [C], ClosedList = [A, B, D, F, G, H, I, E] 9巡目 3. n = C, OpenList = [], ClosedList = [A, B, D, F, G, H, I, E, C] ■ 疑似コード // Javaのシンタックスを基に、疑似コードを作成した。 // はコメントを現す import java.util.Arrays; // Containsメソッドを利用する為、java.util.Arraysクラスをインポート ArrayList<String> OpenList = new ArrayList<>(); // 文字列リストOpenListを定義する ArrayList<String> ClosedList = new ArrayList<>(); // 文字列リストClosedListを定義する Char n = A; // 文字変数として探索点nを定義・初期化する For all node/s iterate{ // 全ての探索点に対し、以下を繰り返す OpenList.add(n); // OpenListに探索点nを代入する If OpenList.contains(null){ // OpenListが空(null)を含む場合 Stop search; // 探索を中止する 5  
  • 6. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  } Else // OpenListが空(null)を含まない場合 n = OpenList.get(0); // OpenListの先頭要素を、探索点nに代入する ClosedList.add(n); // ClosedListに探索点nを追加する OpenList.remove(0); // OpenListから先頭要素を取り除く If n == Destination{ // nが目標点である場合 Stop search; // 探索を中止する } Else // nが目標点ではない場合 // 探索点nの子ノードにOpen、ClosedListに含まれていない点がある場合 If n's child node/s ! in OpenList || ClosedList{                  // OpenListの先頭要素に全ての点を挿入する OpenList.add(0, node/s); } Else // 含まれていない点がない場合 Return null; // 処理を行わず、先頭に戻る } ■ 幅優先探索(Breadth First Search)の特徴 幅優先探索は、横型探索とも呼ばれ、木の根から、最寄りの子を順番に探索する。 目標地点が根から近い場合、深さ優先探索よりも効率的である。幅優先探索の特徴 は、2点ある。[6] 1. 根に近い浅い点から探索する為、目標地点が近い場合、遠回りせずに済む 2. 探索した点を、全て記録する必要が有り、空間計算量が大きい ● 時間計算量 O(|E|)になる。目標地点が、現在地点から最も離れている場合、全経路を探索 する必要がある。深さ優先探索同様、最も時間が掛かるケース(Worst Case)で は、全ての枝を探索する。[8] ● 空間計算量 O(|V|)になる。目標地点が、現在地点から最も離れている場合、探索した節点 を全て記録する必要がある。深さ優先探索と同様、最もメモリ消費するケース (Worst Case)では、全節点を記録する。[8] ■ 幅優先探索のアルゴリズム 深さ優先探索アルゴリズムとの違いは6.で、含まれていない点を、OpenListの 末尾に入れる箇所だけである。[6] 1. 探索を開始する点をOpenListに入れる。 2. ClosedListは、空にする。 3. OpenListが空(解がないなら)探索は失敗して終了。 4. OpenListの先頭のn点を取り除き、ClosedListに入れる。 5. nが目標点であるなら探索は成功して終了。 6. nの子のうち、OpenListやClosedListに含まれていない点は全てをOpenListの 6  
  • 8. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  ■ ハンド・シュミレーション 1巡目 1. OpenList = [A], ClosedList = [] 3. n = A, OpenList = [], ClosedList = [A] 5. OpenList = [B, C], ClosedList = [A] 2巡目 3. n = B, OpenList = [C], ClosedList = [B, A] 5. OpenList = [C, D, E], ClosedList = [B, A] 3巡目 3. n = C, OpenList = [D, E], ClosedList = [C, B, A] 4巡目 3. n = D, OpenList = [E], ClosedList = [D, C, B, A] 5. OpenList = [E, F, G], ClosedList = [D, C, B, A] 5巡目 3. n = E, OpenList = [F, G], ClosedList = [E, D, C, B, A] 6巡目 3. n = F, OpenList = [G], ClosedList = [F, E, D, C, B, A] 7巡目 3. n = G, OpenList = [], ClosedList = [G, F, E, D, C, B, A] 5. OpenList = [H, I], ClosedList = [G, F, E, D, C, B, A] 8巡目 3. n = H, OpenList = [I], ClosedList = [H, G, F, E, D, C, B, A] 9巡目 3. n = I, OpenList = [], ClosedList = [I, H, G, F, E, D, C, B, A] ■ 疑似コード // 深さ優先探索との相違点を青字・太字・下線でハイライトした // はコメントを現す import java.util.Arrays; // Containsメソッドを利用する為、java.util.Arraysクラスをインポート ArrayList<String> OpenList = new ArrayList<>(); // 文字列リストOpenListを定義する ArrayList<String> ClosedList = new ArrayList<>(); // 文字列リストClosedListを定義する Char n = A; // 文字変数として探索点nを定義、初期化する For all node/s iterate{ // 全ての探索点に対し、以下を繰り返す OpenList.add(n); // OpenListに探索点nを代入する If OpenList.contains(null){ // OpenListが空(null)を含む場合 Stop search; // 探索を中止する } 8  
  • 9. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  Else // OpenListが空(null)を含まない場合 n = OpenList.get(0); // OpenListの先頭要素を、探索点nに代入する ClosedList.add(n); // ClosedListに探索点nを追加する OpenList.remove(0); // OpenListから先頭要素を取り除く If n == Destination{ // nが目標点である場合 Stop search; // 探索を中止する } Else // nが目標点ではない場合 // 探索点nの子ノードにOpen、ClosedListに含まれていない点がある場合 If n's child node/s ! in OpenList || ClosedList{ OpenList.add(​node/s​); // OpenListの末尾に全ての点を挿入する } Else // 含まれていない点がない場合 Return null; // 処理を行わず、先頭に戻る } ■ 応用 最後に応用例を2つ紹介する。深さ・幅優先探索を含むグラフ探索は、道路や 交通機関の経路探索に実装されている。 ● カーナビでの経路探索 カーナビの経路探索は、代表的な応用例である。カーナビメーカー、自動車 メーカーが中心に、関連技術の特許出願をしている。[9] ナビタイムジャパン は、グラフ理論を基に、経路を、枝単位でコスト計算し、どの経路が最適かを 決めている。コストは、ポリシーを基に時間、金銭、煩雑さといった係数に、 ベクトル内積で、それぞれの実績を掛け合わせ、算出する。目標地点までの到 達時間を優先する場合は、時間に、距離を優先する場合は、距離に重み付けを 行い、特定の変数を重視した探索も出来る。[10] ● 地方線から主要線の経路探索 18年、谷口らは、普通列車を利用し、出発駅から乗り継ぎながら、1日の運行 時間内で移動できる最長距離を求める研究を行った。同論文の中で、出発駅が 地方線の場合、幅優先探索を利用することで、いち早く主要線の駅に辿りつけ ると提案した。[11] 経路探索の実際は、深さ・幅優先探索を含む複数のアルゴリズムを用意し、目標地 点までの距離、金銭、煩雑さ等のコストに、天気、道路状況、イベント等の外部要 因も加味し、最適な経路を探索している。外部要員は変化し続ける為、カーナビ等 から得られる位置データを、モニタリング、分析しながら、探索精度の改良を図っ ている。 9  
  • 10. 深さ・幅優先探索の仕組み・特徴・応用について 2020年7月29日 嘉村 しょう  ■ 参考文献 [1] 保坂和弘(2011). グラフ探索アルゴリズムとその応用, 2011-5-4, 閲覧日 2020-7-23 http://hos.ac/slides/20110504_graph.pdf [2] ウィキペディア, 「木(数学) - Wikipedia」, 閲覧日 2020-7-24 https://ja.wikipedia.org/wiki/木_(数学) [3] 浅井政太郎(2016), Qiita, グラフ探索ことはじめ - 幅・深さ優先探索 -, 2016-11-24, 閲覧日 2020-7-23 https://qiita.com/guicho271828/items/adba26e0772d7063b4c8 [4] 時間計算量【time complexity】, IT用語辞典 e-Words, 2018-12-24, 閲覧日 2020-7-24 http://e-words.jp/w/時間計算量.html [5] 空間計算量【space complexity】, IT用語辞典 e-Words, 2018-12-24, 閲覧日 2020-7-24 http://e-words.jp/w/空間計算量.html [6] 大西仁(2018), 放送大学大学院, 知能システム論 第2回 探索に基づく問題解決(1), pp21-45 [7] ウィキペディア, 「深さ先探索 - Wikipedia」, 閲覧日 2020-7-24 https://ja.wikipedia.org/wiki/深さ優先探索 [8] ウィキペディア, 「幅優先探索 - Wikipedia」, 閲覧日 2020-7-24 https://ja.wikipedia.org/wiki/幅優先探索 [9] 独立行政法人 工業所有権情報・研修館(2005), 平成16年度 特許流通支援チャー ト カーナビ経路探索技術, 2005, pⅱ, 閲覧日 2020-7-24 https://www.inpit.go.jp/blob/katsuyo/pdf/chart/fdenki22.pdf [10] 福士達央(2018), SlideShare, NAVITIMEの経路はこうして作られる ~4100万人 の移動を導く経路探索の流儀~, 2018-2-28, 閲覧日 2020-7-24 https://www.slideshare.net/NavitimeJapan/navitime-89761183 [11] 谷口雄大, 猪股俊光, 杉野栄二, 成田国輝, 今井信太郎, 新井義和, 岩手県立大学 ソフトウェア情報学部ソフトウェア情報学科(2018), 普通列車を対象にした制約付 き最長距離経路探索の考案, 情報処理学会第80回全国大会, 3K-06, pp, 323-324 https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_action_common_download&item_id= 187689&item_no=1&attribute_id=1&file_no=1 以上 10