AC-3算法详解

AC-3算法

AC-3算法维护一个弧相容队列(实际上,只要是集合就可以)

伪代码

function AC-3(csp) return false if an inconsistency is found and true otherwise
    inputs:csp,a binary CSP with components(X,D,C)
    local variables:queue,a queue 0f arcs, initially all the arcs in csp
    while queue is not empty do
        (Xi,Xj) <- REMOVE-FIRST(queue)
        if REVISE(csp,Xi,Xj) then
        for each Xk in Xi NEIGHBORS {Xj} do
            add (Xk,Xi) to queue
    return true
function REVISE(csp,Xi,Xj) return true if we revise the domain of Xi
            revised <- false
            for each x in Di do
                if no value in Dj allows(x,y) to satisfy the constraint between Xi and Xj then
                    delete x from Di
                    revised <- true
            return revised

算法思想

AC-3算法维护一个弧相容队列。

  1. 队列中包含CSP中的所有弧。
  2. AC-3从队列中弹出弧 ( X i , X j ) (X_i,X_j) (Xi,Xj),首先使 X i X_i Xi相对 X j X_j Xj弧相容。
    1. 如果 D i D_i Di没有变化,算法则处理下一条弧
    2. 如果 D i D_i Di发生变化,则每个指向 X i X_i Xi的弧 ( X k , X i ) (X_k,X_i) (Xk,Xi)都必须重新插入队列中准备校验。
  3. 重复步骤2,直到队列为空。
    具体实例
    AC-3算法详解_第1张图片

推导过程

  1. 构造约束图
    AC-3算法详解_第2张图片

  2. 队列中包含CSP中的所有弧

    (A,B)(B,A)(B,C)(C,B)
    
  3. 从队列中弹出(A,B)

    D a = { 1 , 2 , 3 , 4 } ( c h a n g i n g ) D_a=\{1,2,3,4\}(changing) Da={1,2,3,4}(changing)

    (B,A)(B,C)(C,B)
    
  4. 从队列中弹出(B,A)

    D b = { 0 , 1 , 2 , 3 } ( c h a n g i n g ) D_b=\{0,1,2,3\}(changing) Db={0,1,2,3}(changing)

    (B,C)(C,B)(A,B)
    
  5. 从队列中弹出(B,C)

    D b = { 0 , 1 , 2 } ( c h a n g i n g ) D_b=\{0,1,2\}(changing) Db={0,1,2}(changing)

    D_b变化所以插入(A,B):
    (C,B)(A,B)
    
  6. 从队列中弹出(C,B)

    D c = { 0 , 1 } ( c h a n g i n g ) D_c=\{0,1\}(changing) Dc={0,1}(changing)

    (A,B)(B,C)
    
  7. 从队列中弹出(A,B)

    D a = { 1 , 2 , 3 } ( c h a n g i n g ) D_a=\{1,2,3\}(changing) Da={1,2,3}(changing)

    (B,A)(B,C)
    
  8. 从队列中弹出(B,A)

    D b = { 0 , 1 , 2 } D_b=\{0,1,2\} Db={0,1,2}

    从队列中弹出(B,C)

    D b = { 0 , 2 } ( c h a n g i n g ) D_b=\{0,2\}(changing) Db={0,2}(changing)

    (A,B)(C,B)
    
  9. 从队列中弹出(A,B)

    D a = { 1 , 3 } ( c h a n g i n g ) D_a=\{1,3\}(changing) Da={1,3}(changing)

    (C,B)(B,A)
    

    从队列中弹出(C,B)

    D c = { 0 , 1 } D_c=\{0,1\} Dc={0,1}

    从队列中弹出(B,A)

    D b = { 0 , 2 } D_b=\{0,2\} Db={0,2}

  10. 得到最终结果

    D a = { 1 , 3 } D_a=\{1,3\} Da={1,3}

    D b = { 0 , 2 } D_b=\{0,2\} Db={0,2}

    D c = { 0 , 1 } D_c=\{0,1\} Dc={0,1}

你可能感兴趣的:(人工智能,算法)