制約充足問題 - 知能ソフトウェア研究室

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