190 likes | 383 Vues
認知システム論 制約充足( 2 ) 制約をみたす組合せを探すエージェント. 木探索によるCSPの解法 (Tree search algorithms for solving CSPs). バックトラック法 フォワードチェック 動的変数順序. 制約充足問題 ( CSP) とは(復習). x 1 x 2 … x n. CSP. D 1 D 2 … D n. 変数 (variable) の集合 各変数の 領域 (domain) 変数間の 制約 (constraint) の集合. C ij ={(a,b),(c,d),…}
E N D
認知システム論 制約充足(2) 制約をみたす組合せを探すエージェント 木探索によるCSPの解法(Tree search algorithms for solving CSPs) • バックトラック法 • フォワードチェック • 動的変数順序
制約充足問題(CSP)とは(復習) x1 x2… xn CSP D1 D2… Dn • 変数(variable)の集合 • 各変数の領域(domain) • 変数間の制約(constraint)の集合 Cij ={(a,b),(c,d),…} 変数 xi-xj間で許される値の組の集合.与えられた組(u,v)が許されるか否かを判定する関数 allowed(i,j,u,v)でも良い. 解 • すべての制約を満たすような変数への値の割当て x1=a1 x2=a2… xn=an
制約充足問題の例(復習) n クイーン問題 (n queens problem) クロスワードパズル(crossword puzzles) グラフ彩色問題 (graph coloring) 線画解釈 (interpretation of line drawings) レイアウト (layout) スケジューリング(scheduling)
制約充足アルゴリズム(Constraint Solving) • バックトラック法 • + フォワードチェック • + 動的変数順序
バックトラック法(1) Backtracking • 深さ優先探索 • 各レベルで1つの変数の値を選択する • 解となる可能性のない経路を早めに検出して後戻り(backtrack)する • フォワードチェック(forward checking) • 動的な変数順序付け(dynamic variable ordering) などと組み合わせると効果的
部分解 x1 x2 x3 x4 x1 x2 x3 x4 x5 a1 a2 a3 a4 a1 a2 a3 a4 x1 x2 x3 x4 x5 x1 x2 x3 x4 a1 a2 a3 a4 a5 a1 a2 a3 a’4 OK! バックトラック法(2) 概要 前 進 後 退 前進 後退 これまでの部分解との間に制約違反がないように部分解を拡張 拡張できないときは,後戻りをして直前の選択をやりなおす
バックトラック法(3) 4クイーンでの動作 x1 Q Q 1 2 3 4 x2 Q Q 1 2 3 4 x3 Q Q 1 2 3 4 x4 解 Q 1 2 3 4
バックトラック法(4)アルゴリズム /* メイン */すべての変数 x[ i ] の値を⊥(未設定)にする.BACKTRACK( 1 ); boolean BACKTRACK(int depth) {if(すべての i についてx[ i ] ≠⊥) return true; int j ← x[j]=⊥であるような変数番号jから任意の1つ; ... j = 5 x8 x7 x6 x1 x2 x3 x4 x5 a1 a2 ⊥ ⊥ a7 ⊥ a4 ⊥
バックトラック法(5)アルゴリズム(続き) boolean BACKTRACK(int depth) {if(すべての i についてx[ i ] ≠⊥) return true; int j ← x[j]=⊥であるような変数番号jから任意の1つ; for each int b in list D[j] {if(x[j]=b と現在のxの設定間に制約違反がない) {x[j]←b; if(BACKTRACK(depth+1)) return true;x[j]←⊥; } }return false;} LOOK BACK
boolean BACKTRACK(int depth) {if(depth > n) return true; int j ← depth;for each b in list D[j] {OK ←true; for i ← 1 to j-1 {if(!allowed(i,j,x[i],b)) { OK ←false; break; } } if(OK){ x[j]←b; if(BACKTRACK(depth+1)) return true;x[j]←⊥; } }return false;} j = depth = 5 x8 x7 x6 x1 x2 x3 x4 x5 ⊥ ⊥ ⊥ a1 a2 a3 a4 ⊥ LOOK BACK X1,X2, …, Xnの順序で値を割り当てていく.
制約充足アルゴリズム(Constraint Solvers) • バックトラック法 • + フォワードチェック • + 動的変数順序
部分解 x1 x2 x3 x4 a1 a2 a3 a4 x1 x2 x3 x4 x5 x6 x7 xn a1 a2 a3 a4 a5 すでにOKとなっている フォワードチェック(1) 先読みにより前方をチェックする Forward Checking いずれかの領域が空になったら後戻り 部分解を拡張 前進 これ以降の変数の領域からa5と矛盾するすべての値を削除
フォワードチェック(2) うまくいく例 x1 AFTALEEELHEELHIKEHOSESKEELKNOTLASERLEELINESAILSSHEETSTEERTIE H O S E S x2 H E x8に入る単語がない! E T
フォワードチェック(3)アルゴリズム boolean BACKTRACK-FC(int depth) {if(すべてのi についてx[i]≠⊥) return true; int j ← x[j]=⊥であるような変数番号jから任意の1つ; for each b in list D[j] {x[i]=⊥であるすべての変数x[i]の領域 D[i]からx[j] = bと矛盾する値を削除する; if(空の領域が生じなかった) {x[j]←b; if(BACKTRACK-FC(depth+1)) return true;x[j]←⊥; }変数の領域を,値の削除前の状態に戻す; }return false;} LOOK FORWARD
制約充足アルゴリズム(Constraint Solvers) • バックトラック法 • + フォワードチェック • + 動的変数順序
動的変数順序(1) Dynamic Variable Ordering boolean BACKTRACK-FC(int depth) {if(全変数に値の割当てがある) return true;int j ← x[j]=⊥であるような変数番号jから任意の1つ;......... どの変数を選んだらよいか? 1 最小領域ヒューリスティック領域に含まれる値の個数が最小である変数を選ぶ タイブレイク(引き分けのとき) 2 最大制約ヒューリスティックまだ値の割当てられていない変数との間の制約の個数が最大である変数を選ぶ
動的変数順序(2) グラフ彩色の例(3色) 領域=3 制約=2 R G B 領域=2 制約=1 領域=3 制約=3 R G B 領域=2 制約=2 領域=3 制約=4 R G B 領域=3 制約=4 R G B 領域=2 制約=3 領域=3 制約=3 R G B 領域=3 制約=2 領域=2 制約=2 R G B 領域=3 制約=2
実験による性能比較 BT=backtracking FC=forward checking DVO=dynamic variable ordering数値は制約のチェック回数