第六章 約束滿足問題CSP
一、問題定義
問題定義
狀態空間,狀態被定義為在值域Di中的變量Xi;
當前狀態;
轉移模型;
目標測試,每個變量都有自己的賦值同時滿足約束條件;
評估函數。
三個成分
X是變量集合
D是值域集合
,每個變量都有自己的值域。
C是描述變量取值的約束集合
特點
CSP的解是相容的、完整的賦值。
相容:不違反任何約束條件的賦值稱為相容的或合法的賦值。
完整賦值:每個變量都已賦值。
約束圖
結點為變量,邊表示兩者間有約束關系。
形式化
離散變量
有限值域:n個變量,值域集合大小為d,e.g. 布爾變量
無限值域:整數,字符串等
連續變量
e.g.如哈勃望遠鏡的實驗日程安排,每次觀察的開始,結束時間
線性約束,二次規划求解
一元約束:只涉及一個變量,SA!=green
二元約束:涉及兩個變量,SA!=WA
高階約束:涉及3個或者3個以上變量
全局約束:變量個數任意的約束稱為全局約束
舉例


變量:WA, NT, Q, NSW, V, SA, T
值域:{red,green,blue}
約束條件:相鄰的區域必須是不同的顏色
解之一:WA = red, NT = green,Q = red, NSW =green, V = red, SA = blue, T = green
二、推理——約束傳播
思想
使用約束來減小一個變量的合法取值范圍,從而影響到跟此變量有約束關系的另一變量的取值,如此進行。
相容
結點相容
單個變量值域中的所有取值滿足一元約束
Eg., SA!=green 轉化為SA的值域為{red,blue}
弧相容
某變量值域中的所有取值滿足該變量的所有二元約束
e.g. Y=X^2, X,Y都是數字
弧相容<(X,Y),{(0,0),(1,1),(2,4),(3,9)}>
通用弧相容
Xi相對於某n元約束是相容的
e.g. 所有變量值域{0,1,2,3},約束X<Y<Z,則如果X值域縮小為{0,1}稱X是通用弧相容的。
弧相容算法
首先,工作集中包含CSP中所有的弧。AC-3從工作集中彈出弧(Xi,Xj),首先使Xi相對於Xj弧相容。如果Di沒有變化則繼續處理下一條弧,否則每個指向Xi的弧(Xk,Xi)都必須重新插入工作集中准備檢驗。之所以這么做是因為Di的改變可能引起Dk的改變。如果Di成為空集,則無相容解。否則繼續檢查,直到工作集中沒有弧。
function ac_3 (X, D, C){
while (!worklist_empty()){
(Xi,Xj)=remove_first(worklist)
if revise(csp,Xi,Xj){
if (sizeof(Di)==o){
return false;
}
for each Xk in Xi.NEIGHBORD-{Xj} do{
add(Xk,Xi)to worklist;
}
}
}
return true;
}
function revise(csp,xi,xj){
revised=false;
for each x in Di{
if(no value y in Dj allows(x,y) to satisfy the constraint between Xi and Xj){
delete x from Di;
revised=true;
}
}
return revised;
}
時間復雜度
c個二元約束,變量值域最大為d個元素
路徑相容
兩個變量集合{Xi,Xj}對於第三個變量Xm是相容的,指{Xi,Xj}的每一個相容賦值{Xi=a,Xj=b}, Xm都有合適的取值同時使得{Xi,Xm},{Xm,Xj}是相容的。
e.g. 檢查{WA,SA}對於NT在值域{red,blue}的條件下是否是相容的。
k相容
K相容:如果對於任何k-1個變量的賦值,第K個變量總能被賦予一個和前面k-1個變量相容的值。
如果一個圖是k相容的,k-1相容的,…,直到1相容的,那么此CSP是強k相容的。
三、回溯搜索
通用搜索模式
狀態是由賦值的變量決定的
通用的搜索模式
初始狀態:設為空{}
步驟:給一個沒有賦值的變量賦值,該賦值不與當前已賦值的變量相沖突
目標測試:如果所有賦值完成且滿足終止狀態,則搜索結束,否則搜索失敗
CSP適用於通用的搜索模式,並采用深度搜索方法
回溯搜索
思想
對於CSP采用深度優先的單個變量賦值,當檢測到不相容時,返回上一次賦值。
特點
變量的賦值順序是可以交換的,在每一個結點只需要考慮一個變量的賦值,在算法之前需要固定變量的賦值順序,葉子結點數減少到d^n。
提高算法效率的策略
選擇變量賦值的順序
選擇值域中賦值的順序
更早地檢測不可避免的失敗
最受約束變量
優先選擇最少剩余值的變量進行賦值
約束最多變量
優先選擇最能約束其他變量的變量進行賦值
最少約束值方法
選擇使得剩余變量賦值空間更大的值
前向檢驗
思想
追蹤未賦值變量的剩余合法賦值;當任何一個剩余變量沒有合法賦值時搜索終止。
特點
前向檢測從賦值變量向未賦值變量傳播信息,但不能對失敗提供早期檢測。
改進MAC(維護弧相容)
當xi賦值后,從與xi鄰接的弧中所有未賦值變量xj開始進行約束傳播,一旦某變量的值域為空則回溯
例

智能回溯

Solution:建立沖突集,回溯到沖突集中時間最近的賦值,SA的沖突集為{Q,NSW,V},所以回溯到V
四、問題結構
獨立的子問題
不相連的結構
e.g. Tasmania 與其他地區不相連
獨立性子問題通過尋找連通子圖來確定

拓撲排序
適用
求解樹結構的CSP
思想
任意選擇一個變量為樹的根,選擇變量順序使每個變量在樹中出現在父結點之后。
特點
n個結點n-1條弧,O(n)步將此圖改造成直接弧相容,每一步比較兩個變量的d個可能取值,所以總時間為O(nd^2)。
約束圖到樹
基於刪除結點的方法


從CSP的變量中選擇子集S(SA),使得約束圖在刪除S后成為一棵樹,S稱為環割集
對於滿足S所有約束的每個可能賦值
- 求CSP剩余變量的值域,然后從中中刪除與S的賦值不相容的值
- 如果去掉S后的剩余CSP有解,把解和S的賦值一起返回
基於合並結點的方法


把約束圖分解成相關聯的子問題
對每個子問題單獨求解,再把結果合並起來
樹分解的三個條件
每個變量至少出現在一個子問題中
每個約束至少出現在一個子問題中
如果一個變量出現在兩個子問題中,那么它必須出現在連接在這兩個子問題的路徑上的所有子問題中(?)
