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,直到队列为空。
    具体实例
    在这里插入图片描述

推导过程

  1. 构造约束图
    在这里插入图片描述

  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}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值