第6章 約束滿足問題CSP


第六章 約束滿足問題CSP

一、問題定義

問題定義

狀態空間,狀態被定義為在值域Di中的變量Xi;

當前狀態;

轉移模型;

目標測試,每個變量都有自己的賦值同時滿足約束條件;

評估函數。

三個成分

X變量集合

\[\{X_1,...,X_n\} \]

D值域集合

\[\{D_1,...,D_n\} \]

,每個變量都有自己的值域。

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;
}  

時間復雜度

\[O(cd^3) \]

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所有約束的每個可能賦值

  1. 求CSP剩余變量的值域,然后從中中刪除與S的賦值不相容的值
  2. 如果去掉S后的剩余CSP有解,把解和S的賦值一起返回

基於合並結點的方法


把約束圖分解成相關聯的子問題

對每個子問題單獨求解,再把結果合並起來

樹分解的三個條件

每個變量至少出現在一個子問題中

每個約束至少出現在一個子問題中

如果一個變量出現在兩個子問題中,那么它必須出現在連接在這兩個子問題的路徑上的所有子問題中(?)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM