知能型システム論 前回の復習 【1】知能システムのモデル化 知能=知識+推論 プログラム=データ構造+アルゴリズム 【 】状態空間の探索による問題解決 【2】状態空間の探索による問題解決 状態空間=節点:問題の状態+枝:オペレータ (I)系統的な探索 1.縦型探索 2.横型探索 (II)最適解の探索 1.g(n)を使ったoptimal search 2.h(n)を使ったbest first search 3.f(n)=g(n)+h(n)を使ったA*アルゴリズム 【3】ゲームの木の探索 1.Min-Max探索 探索 2.αβ探索 【4】AND-ORグラフの探索 問題の分割による解法 戦略(ストラテジー) 戦略(ストラテジ ) メタレベルのアルゴリズム メタレ ルのアルゴリズム 分割統治法 具体的なアルゴリズム クイックソート 文脈自由型文法 (Context Free Grammar) S AND-ORグラフ 文法規則 R1 S → R2 SUB → R3 SUB → R4 PRED → R5 NP → R6 PRON→ R7 V → R8 DET → R9 N → R10 N → |…OR R1 (SUB PRED) SUB PRED PRON( 代名詞 ) NP(名詞句) V NP DET N He saw a dog cat N → dog | cat AND PRED R4 (VNP) SUB R2 PRON R6 He NP R5 (DET N) V DET R7 saw N R8 a R9 dog AND/ORグラフで表現される問題を解くということは、 AND/ORグラフの中に含まれる解グラフを探す ということである。 S R1 AND が目標として 与えられた時の解グラフ 与えられた時の解グラ R4 SUB (V NP) NP R2 NP R5 (DET N) DET R8 R6 He a 同節点 PRED R3 PRON AND節点 (SUB PRED) “He saw a dog” OR 前ページのスライドの 文法によって定義される AND/ORグラフ N R9 dog R5 (DET N) V R10 cat R7 saw DET R8 a N R9 dog R10 cat AND-ORグラフの例(連立方程式) f1 ( x1 , x2 ,,...,, xn ) = 0 f 2 ( x1 , x2 ,..., xn ) = 0 L f m ( x1 , x2 ,..., xn ) = 0 f1 ( x1 , x2 ,,...,, xn ) = 0 f 2 ( x1 , x2 ,,...,, xn ) = 0 f m ( x1 , x2 ,,...,, xn ) = 0 ・・・ || f 21 ( x1 , x2 ,..., xn ) f 22 ( x1 , x2 ,..., xn ) L f 2 k 2 ( x1 , x2 ,..., xn ) = 0 f 21 ( x1 , x2 ,..., xn ) = 0 f 2 k 2 ( x1 , x2 ,..., xn ) = 0 || 2 x1 + 1 = 0 ・・・ f 22 ( x1 , x2 ,..., xn ) = 0 形式言語理論 • 正規文法(有限状態オートマトン) 正規文法(有限状態オ ト ト ) 【右線形文法】 A → xB (A, Bは非終端記号、xは終端記号) A → x (xは終端記号) ( a n b n ( n ≥ 1)は正規文法では生成で きない) • 文脈自由文法 【Chomsky標準形】 A → BC ( (A, B, Cは非終端記号) A → x (xは終端記号) (a nb n c n (n > 0)は文脈自由文法では生成できない) • 文脈依存文法 αAβ → αγβ (Aは非終端記号、 は非終端記号 α , β は非終端、終端記号の は非終端 終端記号の 0個以上の並び、 個以上の並び γは非終端、終端記号の 1個以上の並び) 【レポ ト課題 】 【レポート課題8】 数式の構造を表す文法(問題の分割法を表す規則) R1: <算術式>::= <項> | <算術式> <加減演算子> <項> R2: <変数>::=A | B |・・・| Z R3: <項>::<因子> | <項> <乗除演算子> <因子> R4: <加減演算子> ::= + | - R5: <因子>::= <変数> | (<算術式>) R6: 6: <乗除演算子> 乗除演算子 :: ::= * | / をとする。 ・上記の文法によって表される状態空間をAND-ORグラフとして 描きなさい。 描きなさ ・算術式 (A + B/C)*(D-E) を表す解木(木の葉接点を左から右 へ走査したとき この算術式が得られるような解木)を へ走査したとき、この算術式が得られるような解木)を depth-first-and-or探索によって求めなさい。 記 文法 は、 は減算演算子 し 定義され る。 ・上記の文法では、‘-’は減算演算子として定義されている。 ‘~’を負の数を表す記号として導入し、文法を拡張しなさい。 AND/ORグラフの性質と解グラフの性質を整理すると…. AND/ORグラフの性質と解グラフの性質を整理すると 1. 終端節点は解決されている節点である 2. ある節点の子節点がAND節点の場合は、そのすべ てのAND節点が解決されていれば、その節点も解決 されている。 3 3. ある節点の子節点がOR節点の場合は、そのOR節点 ある節点の子節点がOR節点の場合は そのOR節点 のいずれか一つでも解決されていれば、その節点も 解決 解決されている。 4. 解グラフは、問題のAND/ORグラフの一部であり、出 発節点を含み、どの節点もOR節点 の枝を2本以上 発節点を含み、どの節点もOR節点への枝を2本以上 持たず、すべての節点が解決されているAND/ORグラ フである。 問題AがBとCに分解しても解かれてもよく、またDを解くこと によっても解かれることを示している。 (a) (b) A A (c) A E 成形 B C D M D B B C D C ANDとORが混在する場合は、補助節点を設けることによって、子節点に AND節点とOR節点が混在しないAND/ORグラフに変換できる。 ⇒ (b)の場合:ただし、コストを問題とする場合には、節点AからMへ向 かう枝のコストはAをBとCに分解するコストとしなければならない。 (c)の場合:AND/ORグラフの節点は、ある親節点のAND節点であり、 時に別の親節点のOR節点となることがある。 AND/ORグラフの探索 AND/ORグラフの解グラフは、それ自身グラフである。 AND/ORグラフの解グラフは それ自身グラフである 探索によって解グラフを求める過程は、解グラフを しだいに成長させてゆくことに相当する。 未解決グラフ(partial solution graph) 探索の途中では、解グラフの候補の一部しか求められていない。 真に解グラフの 部となるかどうか解らないため う呼ぶ とにする。 真に解グラフの一部となるかどうか解らないためこう呼ぶことにする。 (a)未解決グラフの評価と展開 1 1. 未解決グラフの節点が解決されているか、解決不可能か、それともいず 未解決グラフの節点が解決されているか 解決不可能か それともいず れとも断定できないかを決める。必要があれば節点のコストを求める。 (i) (ii) unsolved S solved unsolved A solved B A solved C unsolved Sがunsolvedとなれば解グラフとなりえない solved S B C solved Sがsolvedとなれば解グラフとなる (b)未解決グラフの評価と展開 1. 節点のコストを求める。 未解決グラフの端点のコストを用いてすべての節点のコストをつぎのように 求めていく。 AND節点の親節点のコスト; すべての子節点のコストから下記の 式によ て計算する。 式によって計算する。 f ( n ) = max{ f ( n1 ), f ( n2 ),…., f ( nm )} ;全子供の最も難しいものをとる f ( n ) = f ( n1) + f ( n2 ) +….+ f ( nm ) ;全子供の総和 OR節点の親節点のコスト; OR節点のコストと枝のコストの和。 n f (n1 ) n1 n2 f (n) …. nm f (nm ) (c)未解決グラフの評価と展開 2 未解決グラフを展開して成長させる。 2. p p n n n (ii) (i) n1 (i) p n2 AND節点の時 nにすべての子節点を加えて新 しい未解決グラフを生成する。 n1 n2 (ii) OR節点の時 nにそれぞれの子節点を1個 だけ加えた未解決グラフを 子節点の数だけ 成する。 子節点の数だけ生成する。 AND/ORグラフの縦型探索 procedure depth-first-and-or 出発節点だけからなる未解決グラフを open に入れる。 LOOP: if open = 空 then exit ( fail ) ; も もしすべての節点を調べ終わったならば終了し、 節 終 ば終 探索結果は失敗である p : first f ( open ) ; open の最初の要素(未解決グラフ)を取り出す if solved( p ) then exit ( success ); もし p が解グラフであれば探索は成功し、 が解グラフであれば探索は成功し p が解である remove ( p, open ) ; openから p を取り除く pを展開し、新しく生成されたすべての未解決グラフを評価し、出発節が pを展開し 新しく生成されたすべての未解決グラフを評価し 出発節が UNSOLVEDでない未解決グラフをopenの先頭に入れる。 goto LOOP Openリスト内の未解 決グラフ 繰り返 し回数 部分グラフ SA、SBという部分グラフ UNSOLVED SA SB→OPENに入れる 未解決の部分グラフを OPENからとりだす S Failが来るため終了 S 1 2 S A 3 S A C C D t1 t2 D S E G t3 B B t4 H B E t3 B H S Fail AND/ORグラフの探索、 t1~t4が終端節点 S B E 6 F S S 4 5 Fail B B A S t4 S B H AND/ORグラフの縦型探索の効率的アルゴリズム 先 先に示したprocedure p depth-first-and-orでは、 p f 、 未解決グラフ p を展開する場合に、 p の端点 n の子節点がAND節点である場合に、 すべての子節点を p につけ加えている。 未解決グラフ p を展開する場合に、 p の端点 n の子節点を1つpに付け加えて 探索・評価を行い 探索 評価を行い、pがunsolvedになったら1つ上の親接点に戻り、他の子接点を pがunsolvedになったら1つ上の親接点に戻り 他の子接点を pに付加してその先の探索・評価を行う。こうすればopenに多くの未解決解グラフを 記憶しておく必要がなくなる。 procedure depth-first-and-or-1 出発節点だけからなる未解決グラフ p を作る。n:=S p を評価する LOOP: if unsolved ( p ) then exit ( fail ) ; もしすべての節点を調べ終わったならば終了し、探索結果は失敗である if solved ( p ) then exit ( success ); もし n にsolved/unsolvedのマークがつけられていれば に クが けられ れば goto EVALUATE nextn: t = nextchild t hild ( n ) Nextchild(n) = ni+11 , 0≦ i < m { NIL, i = m p に nextn をつけ加え、p を評価する n: = nextn goto LOOP EVALUATE: p を評価する もし n がUNSOLVEDならば、 n を p から切り離す。 n : = n の親節点 goto LOOP S B A C Fail F D t1 t2 E G t3 t4 H Fail AND/ORグラフの探索、 t1~t4が終端節点 S→A → C→ F→ C→A →S → B→E → t3 → E→ t4 探索の途中でORの節点がUNSOLVED →直前の親節点までもどって別の枝を探索;(後戻り) 直前の親節点ま もど 別の枝を探索 (後戻り) 節点を展開してすべての子節点を生成し、それをOPENにリストに蓄える必要がないので 効率的な処理が実現できる (c)AND/ORグラフの最適解の探索 AND/ORグラフのOR節点に向かっている枝にコストが定義されてる 場合、全コストを最小とする解グラフを求める問題を考えてみる。 hˆ ( n ) ;節点n のコストの推定値とする もしこのヒューリスティックな関数 hˆ(n) が与えられていなければ → hˆ(n) ≡ 0 と同じことである。 未解決グラフのコストの推定 かっこの中の数値 ; h ĥ かっこ無しの数値 ;コストの評価値 S 6 1 すべての枝のコスト 定 とすれば hĥ(n) ≡ 0 、すべての枝のコスト一定、とすれば AND/ORグラフの横型探索となる。 ff̂ (p ( ) ;未解決グラフ 未解決グ p のコスト推定値とする ト推定値とする pの端点のコストの推定値を用いてpを 評価して得られるコスト推定値 B A 5 C (3) AND節点のコスト f ( n ) = f ( n1 ) + f ( n2 ) + …. + f ( nm ) ;OR節点に入る枝のコストはすべて1とする。 1 D (2) hˆ(C ) = 3 hˆ( D) = 2 hˆ( A) = hˆ(C ) + hˆ( D) hˆ( S ) = hˆ( A) + 1 したがって、 fˆ ( p ) = 6 Aアルゴリズムと同様に、 fˆ ( p) が最小の未解決グラフを展開してゆく。 procedure optimal-and-or 出発節点 S だけからなる未解決グラフ p をopenに入れる。 fˆ ( p ) := hˆ( S ) LOOP: if open = 空 then exit( fail ) ; もしすべての節点を知らべ終わったならば 終了し、探索結果は失敗である p : first(open) ; openの最初の要素(未解決グラフ)を取り出す 最初 要素 未解決グ を取り出す if solved( p ) then exit( success ); もし p が解グラフであれば探索は成功し、 が解グラフであれば探索は成功し p が解である remove( p, open ) ; openからpを取り除く ˆ pを展開し 新しく生成されたすべての未解決グラフ pi を評価し、 pを展開し、新しく生成されたすべての未解決グラフ を評価し f ( pi ) を求め、 pi がUNSOLVEDでなければ open に入れる。OPEN内の未解決グラフを fˆ の小さい順位並べる goto LOOP 必ずしも最適解を得るとは限らないが、もしすべての節点に対して、 必ずしも最適解を得るとは限らな が もしすべ 節点に対し hˆ ≤ h が成 立すれば、必ず最適解を得られることが証明される。 枝のコストをすべて0とすれば、将来の探索コストの最小化をはかることになる。 AND/ORグラフの最適解の探索 S 繰り返 し回数 (4) Openリスト内の未解決グラフ 1 S(4) p1 2 B (3) A (3) p2 S4 A (3) B(3) 3 C ((3)) F (2) H (1) p3 p4 4 I p5 (1) 5 t1 (0) S6 D ((2) ) G (1) 子節点の生成回数を最小にするためには、展 開しようとする未解決グラフの p の節点 n の子 節点がAND節点である場合には、一度にすべ ての子節点を生成しないで、一個だけ生成して 評価すればよい。 A5 (3)C S4 B3 (2)D p6 S 4 B3 D2 G(1) t2 (0) p3 S4 6 D(2) p4 I(1) p7 S 5 D3 I(1) B4 F(2) p4 I(1) S5 D3 p8 H(1) B4 G2 p7 I(1) p4 (d)AND/OR木探索のゲームへの応用 S MAX MAX:AND接点 MIN :OR接点 B A MIN C D E F 5 *枝コストはすべて0である。 2 1 ( 評価値) ; 6 (←評価値) コストと逆で 大きいほどよい 最適な手を決定・・・・ 最適な を決定 子節点がAND節点であれば、子節点の評価値の最小値をその節点の値とする。 子節点がOR節点であれば、子節点の評価値の最大値をその節点の値とする。 青の解木での節点nの値をf(n)とすれば、 f( A ) = 2, f( S ) = 2 もう一つの黒の解木で、その値は1である →したがってf( A ) = 2が最適解 ゲームの木の探索にもAND/ORグラフの 最適解の探索法を利用できる 終点以外は hˆ = ( fˆ ) が与えられていない。 最適解(最大評価値)を得るためには fˆ (n) ≥ f (n) が成立しなければならない。 【参考】コストを最小とする場合、 hˆ(n) ≤ h(n) であったことに注意しよう。 したがって、端点の値が得られていなければ…. したが て、端点の値が得られて なければ 未解決木の値の推定値は無限大である。 未解決木の非終端節点を展開する場合… 子節点がAND節点であれば、ひとつずつ展開していくものとする。 節点が 節点 あれば ず くも す n1 ; 節点 n の最初の子節点(AND節点)とし、 f(n1))の値が求まった時点でnはMINなので、 f( f (n) ≤ f (n1 )となることから、 fˆ (n) = f (n1 )とnの推定値が更新される 推 値 新 。 このように、探索の途中で fˆ を計算して更新してゆくのである。【後に詳述】 探索の原理は optimal-and-orと同様に、常に最大の推定値を持つ未解決木を 探索の原理は… ti l d と同様に 常に最大の推定値を持つ未解決木を openから取り出して展開していく。 ゲームのAND/OR木の最適解を得る場合には… 解を解木の形で求める代わりに、解木の値を与える終端節点だけを求めてもよい。 (終節点がわかれば それを逆にたどって出発節点に達することができるため) (終節点がわかれば、それを逆にたどって出発節点に達することができるため) (n,s,v) 接点nの状態の表現 s; SOLVEDかLIVEかをあらわす (n) を表すものとする v; s がSOLVEDならf( n ) 、 LIVEなら fˆ (n SOLVED; LIVE; 探索している節点 n の値が決まれば n につける SOLVEDでない節点につける procedure game-tree-search game tree search 1 putopen( S, LIVE,∞ ) ; 初期設定 2 LOOP: if open = 空 then LOOP th exit( it( fail f il ) ; もしすべての節点を知らべ終わったならば終了し、探索結果は失敗である 3 n : first( open ) ; openの最初の要素(未解決グラフ)を取り出す 4 if ( n=S∧ solved( n ) then exit( success ); 5 remove(n open) ; openから n を取り除く remove(n,open) 6 AND/OR木における n の位置と n の状態に応じて、表4.3に示す処理を行う。 open 内の節点を fˆ の大きい順に並 の大きい順に並べる。 る。 fˆ が同じ場合は、SOLVEDの節 点を優先する goto LOOP game - tree - search parent( n ) type( n ) terminal ( n ) pputopen( p ( n,, s,, v ) 番号 ; n の親節点 ; n がAND節点(MAX)かOR節点(MIN)かを求める ; n が終端節点であるかどうかを求める ;節点 n を をopenに入れる p に入れる nの条件 子接点 処理手続き 1 s=LIVE nのすべての子節点 のす ての子節点 ni に対して、 type( n )=AND putopen(ni , LIVE, fˆ (n) ) not terminal( n ) 2 nextn:= nextchild( n ) s=LIVE if nextn = NIL then putopen(n, SOLVED, f( n )) type( n )=OR ( )) nott terminal( t i l( n ) else l putopen(nextn, t ( t LIVE, LIVE fˆ (n putopen(n, SOLVED, min( fˆ (n), f (n)) ) s=LIVE 3 親接点 terminal( n ) fˆ (n)) 4 s=SOLVED type( yp ( n )=AND ) putopen(parent( n ), LIVE, 5 s=SOLVED type( n )=OR m=parent( n ). open内にあるmの子孫節点をすべて取り除く putopen(m, SOLVED, fˆ (n)) ゲームのAND/OR木の最適解の探索 0 4 6 5 X X X 3 2 1 X 7 X X X X 10 9 8 X X X X X 11 X 12 X X 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 4 3 3 2 6 5 4 2 3 4 3 6 3 5 5 4 6 ↑ (評価値) LIVE SOLVED :探索を行った枝 探索を行った枝 AND = MAX :最適解 X :アルファ・ベータ法で表される終端節点 :アルファ・ベ タ法で表される終端節点 OR = MIN 8 ゲームのAND/OR木の最適解を得る順序 順番 適用した処 理の番号 1 open リスト (出発節点は0, SOLVEはS, (出発節点は0 SOLVEはS LIVEはLで表 す) ∞) (1 L ∞ ), (2 L ∞ ), (3 L ∞ ) (4 L ∞ ), (2 L ∞ ), (3 L ∞ ) (13 L ∞ ), (14 L ∞ ), (2 L ∞), (3 L ∞ ) (14 L ∞ ), (2 L ∞ ), (3 L ∞ ), (13 S 4 ) (2 L ∞ ), ) (3 L ∞ ), ) (13 S 4 )), (14 S 3 ) (0 L 2 1 3 2 4 1 5 3 6 3 ゲームのAND/OR木の最適解の探索 •AND-OR木の最適解の探索法はアルファ・ベータ法より効率がよいが… いくつもの解の候補をopenリストに入れておく必要がある。 いくつもの解の候補をopenリストに入れておく必要がある •アルファ・ベータ法は、αとβの値だけを知っていればよいため(深さ優先探索)… 計算に必要な記憶容量が少なくて済む。 計算に必要な記憶容量が少なくて済む ORの順番を入れ替えて探索しても変わらないので、 そのコストを見ながらやると効率がよくなる (optimal search) 【レポート課題9】 プリント図4.10のゲームの木に対して 1.αβ法 2.AND-OR最適探索法 でそれぞれ探索を行い、最適解を求めなさい。
© Copyright 2024 Paperzz