木探索によるCSPの解法 (Tree search algorithms for solving CSPs)
-
Upload
dexter-horne -
Category
Documents
-
view
47 -
download
0
description
Transcript of 木探索によるCSPの解法 (Tree search algorithms for solving CSPs)
木探索によるCSPの解法(Tree search algorithms for
solving CSPs)
認知システム論 制約充足( 2 )制約をみたす組合せを探すエージェント
バックトラック法
フォワードチェック
動的変数順序
制約充足問題 (CSP) とは(復習)
変数 (variable) の集合 各変数の領域 (domain)変数間の制約 (constraint) の集合
CSP
すべての制約を満たすような変数への値の割当て
解
x1 x2 … xn
D1 D2 … Dn
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)深さ優先探索各レベルで1つの変数の値を選択する解となる可能性のない経路を早めに検出して後戻り (backtrack) する
フォワードチェック (forward checking)動的な変数順序付け (dynamic variable ordering)
などと組み合わせると
効果的
Backtracking
1x
2x
3x
1
2
3 4
5
6 7
バックトラック法 (2) 概要
前進
これまでの部分解との間に制約違反がないように部分解を拡張
後退
a1
x1
a2
x2
a3
x3
a4
x4部分解
a1
x1
a2
x2
a3
x3
a’4
x4x1 x2 x3 x4 x5
a1 a2 a3 a4 a5
OK!
拡張できないときは,後戻りをして直前の選択をやりなおす
前 進 後 退
a1
x1
a2
x2
a3
x3
a4
x4 x5
バックトラック法 (3) 4クイーンでの動作
Q
Q
Q
Q
Q
Q
1 2 3 4
Q
解
1 2 3 4
1 2 3 4
1 2 3 4
x1x2x3x4
バックトラック法 (4) アルゴリズム
/* メイン */ すべての変数 x[ i ] の値を⊥(未設定)にする. BACKTRACK( 1 );boolean BACKTRACK(int depth) { if( すべての i について x[ i ] ≠⊥) return true; int j ← x[j]=⊥ であるような変数番号 j から任意の1つ;
...
x1 x2 x3 x4 x5
a1 a2 a7a4 ⊥
x6
⊥
x7
⊥
x8
⊥
j = 5
バックトラック法 (5) アルゴリズム(続き)
boolean BACKTRACK(int depth) { if( すべての i について x[ i ] ≠⊥) return true; int j ← x[j]=⊥ であるような変数番号 j から任意の1つ;
for each 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;}
LOOK BACK
X1 , X2, … , Xn の順序で値を割り当てていく.
x1 x2 x3 x4 x5
a1 a2 a3 a4 ⊥
x6
⊥
x7
⊥
x8
⊥
j = depth = 5
制約充足アルゴリズム(Constraint Solvers)
バックトラック法
+ フォワードチェック
+ 動的変数順序
フォワードチェック (1)
a1
x1
a2
x2
a3
x3
a4
x4部分解
前進部分解を拡張
すでにOKとなっている
これ以降の変数の領域から
a5 と矛盾するすべての値を削除
a1
x1
a2
x2
a3
x3
a4
x4
a5
x5 x6 x7 xn
いずれかの領域が空になったら
後戻り
先読みにより前方をチェックするForward
Checking
フォワードチェック (2) うまくいく例
1 2 3
4 5
6 7
8
AFTALEEELHEELHIKEHOSESKEELKNOTLASERLEELINESAILSSHEETSTEERTIE
x1x2
x8 に入る
単語がない!
H O S E
E
E
T
H
S
フォワードチェック (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
Orderingboolean BACKTRACK-FC(int depth) { if ( 全変数に値の割当てがある ) return true; int j ← x[j]=⊥ であるような変数番号 j から任意の1つ; .........どの変数を選んだらよいか?
最小領域ヒューリスティック 領域に含まれる値の個数が最小である変数を選ぶ
最大制約ヒューリスティック まだ値の割当てられていない変数との間の制約の個数が最大である変数を選ぶ
1
2
タイブレイク(引き分けのとき)
6x
動的変数順序 (2)
4x5x
3x
2x
グラフ彩色の例(3色)
R G B 領域=3 制約=2
R G B
R G B
R G B
R G B
領域=3 制約=4
領域=3 制約=3
領域=3 制約=3
領域=3 制約=4
領域=2 制約=1
R G B領域=3 制約=2
領域=2 制約=2
領域=2 制約=2
領域=2 制約=3
領域=3 制約=2
1x
実験による性能比較Problem BT BT+DV
OBT+FC BT
+FC+DVO
USA >1,000,000
>1,000,000
2,000 60
n-Queens
>40,000,000
13,500,000
40,000,000
817,000
Zebra 3,859,000
1,000 35,000 500
Random 1
415,000 3,000 26,000 2,000
Random 2
942,000 27,000 77,000 15,000
BT=backtracking FC=forward checking DVO=dynamic variable ordering数値は制約のチェック回数