人工知能 (Artificial Intelligence) 知識を用いない探索法 深さ優先探索 (depth-first search) Lecture 2 田中美栄子 グラフ探索 グラフ探索 基本的には前向き推論 初期節点(start node)から目標節点(goal node)へ S 初期節点 G 探 索 目標節点 グラフ探索 目標節点 探査を終了する節点 open リスト 今後調べる節点を記載しておくリスト ※探索が終わった節点はopenから削除 グラフ探索 初期節点が目標節点かどうか? Start = Goal ? YES 探査終了(end) NO 探査開始(start) 探索の基本アルゴリズム (木の場合) Search algorithm{ 1. StartNodeをopenlistに入れる 2. LOOP:if(open==empty)break; (探索失敗) 3. n=first(open); 4. if(goal(n))print(n)break; (探索終了) 5. remove(n,open); 6. 次に調べる節点をopenに入れる 7. Back to Step-2} 探索の基本アルゴリズム フローチャート 知識を用いない探索 力まかせ探索 深さ優先探索 幅優先探索 最適探索 複数解のうち、最適 解 力まかせ探索 Brute-force search 『ブルートフォース攻撃』の使われ方と同 ブルートフォース攻撃 パスワードを解く際など 0000 , 0001 , 000 2 ・・・ 当たるまで入力 力まかせ探索 利点 実装が容易 解が存在する場合、必ず解くことが 可能 力まかせ探索 問題点 解候補数が組合せ爆発を起こす場合、 コストが急激に増大 知識を用いない探索 力まかせ探索 深さ優先探索 幅優先探索 最適探索 複数解のうち、最適 解 深さ・幅探索のイメージ 箱の中からプレゼントを見つけたい・・・・という 場合. S AB •次にCの箱を調べる •深さ優先探索 CD •次にBの箱を調べる •幅優先探索 深さ優先探索 Depth-first search 深さ優先探索 アルゴリズム Depth-first search algorithm{ 1. 初期節点をopenリストに入れる 2. LOOP:if(open==empty)break; (探索失敗) 3. n=first(open); 4. if(goal(n))print(n)break; (探索終了) 5. remove(n,open); add(n,closed); 6. 次に調べる節点をopenに入れる(nを展開し、全 ての子節点𝑛𝑖 をopenリストの先頭に入れ、 𝑛𝑖 からnへポインタを付ける) 7. 2のLOOPへ戻る} 深さ優先探索 探索例 S : 初期節点 G : 目標節点 深さ優先探索 探索例 openリスト 1. S 初期節点Sを openリストに入れる 深さ優先探索 探索例 openリスト 1. S 2. a Sの子節点aの探索 (Sは探索済みなので openリストから除く 深さ優先探索 探索例 openリスト 1. S 2. a 3. b , c aをb,cに展開 bの探索 深さ優先探索 探索例 openリスト 1. S 2. a 3. b , c 4. d , e , c bをd,eに展開 dの探索 深さ優先探索 探索例 openリスト 1. S 2. a 3. b , c 4. d , e , c 5. e , c dの子節点が無いので そのままeの探索 深さ優先探索 探索例 openリスト 1. S 2. a 3. b , c 4. d , e , c 5. e , c 6. G , f , c EをG,fに展開、目標節点G の 深さ優先探索 探索例 openリスト 1. S 2. a 3. b , c 4. d , e , c 5. e , c 6. G , f , c 探索順番 S→a→b→d→e→G
© Copyright 2024 ExpyDoc