簡體   English   中英

AC-1,AC-2和AC-3算法(弧度一致性)

[英]AC-1, AC-2 and AC-3 algorithms (arc-consistency)

任何人都可以向我解釋AC-1,AC-2和AC-3算法? 我必須了解它們並用代碼實現它們。 但首先,我想要了解它們真的很好,但它們太難以被我理解了。 有什么幫助嗎? 順便說一句,我不太熟悉回溯,我試着閱讀並觀看有關它的視頻,但仍然是一樣的! 謝謝,

我將給你一個關於回溯和AC-3的快速解釋。 但如果您想了解更多細節,請閱讀本書:

人工智能:現代方法:Stuart Russel和Peter Norvig 2003 Prentice Hall

本書作為關於約束滿足問題(CSP)的章節,解釋了所有關於AC-3和回溯的內容。


您需要了解的第一件事是什么是CSP。 CSP包含:

  • 要查找值的一組變量{A,B,C};
  • 每個變量Da,Db,Dc的域,每個變量包含變量可以采用的值;
  • 一組限制,如A> B + 2和C <B ......

現在,當您擁有CSP時,您希望將值歸因於所有變量並始終尊重重新定義。 當所有變量都具有值並同時遵守所有限制時,CSP就會被解決。

回溯是一種算法,可以讓您找到解決此問題的方法。 所以你從空狀態{}開始,這意味着沒有變量有值。 然后從變量集中選取一個變量(用於選擇所選變量的順序可能會影響算法的性能,您可以使用一些啟發式算法,如MRV - 剩余最小值......)。 現在讓我們說我們首先選擇A,現在我們從域Da中獲取一個值(您選擇此值的順序也可以使用啟發式)。 想象一下Da = {1,2,3}。 我們選擇1.現在我們檢查A = 1是否沒有違反任何限制,否則它不是一個好的歸因。 如果沒有那么讓我們設置A = 1,現在我們處於狀態{A = 1}。 現在讓我們繼續這樣做。 想象一下你選擇B和值1.這將違反限制A> B + 2.現在你有兩個選擇,如果你有另一個值來測試B,你可以試試。 如果沒有,這意味着A = 1它是錯的,你需要回到狀態{}並嘗試A = 2,依此類推。

這是回溯的偽代碼:

function backtracking (csp) return a solution or fails
    return recursive_backtracking({}, csp) // {} is the initial state

function recursive_backtracking (state, csp) return a solution or fails
    if state is complete then return state // all variable have a value
    var <- selectNotAtributedVariable(csp)
    for each value in orderValues(csp, var) // values of the domain of var
        if var = value is consistent given the restrictions
            add {var = value} to state
            result = recursive_backtracking(state, csp)
            if result != fail then return result
            remove {var = value} from state
    return fail

請注意,selectNotAtributedVariable和orderValues是啟發式的(它們可能只返回集合的第一個元素)。


現在什么是AC-3以及為什么以及何時使用它? 第一個AC-3用作預處理步驟。 你這樣使用它:

function solveCSP(csp)
    ac3(csp)
    return backtracking(csp)

這回答了什么時候。 基本上,AC-3會在回溯期間檢測歸因中的沖突,並刪除它們。 怎么樣? 通過削減CSP中變量​​的域。 因此,當兩個變量共享限制時,我們說兩者之間存在弧。 你說A和B之間的弧是一致的,如果:

  • A-> B是一致的:foreach值a,A可以取值B,B可以遵守限制。
  • 和B-> A是一致的:B可以取值的前值b,A可以考慮限制值。

想象一下,你有以下限制A> B和B> C.你將擁有以下一組弧:{A-> B,B-> A,B-> C,C-> B}現在是什么AC-3它是否從上面的集合中選擇一個弧,A-> B,對於A的每個值,可以嘗試檢查B是否可以采取一個值來遵守​​限制。 如果是這樣,A的域保持不變,如果不從A的域中刪除值a。每次從域中刪除值時,您將不得不重新檢查A的鄰居(在這種情況下)。 我的意思是你需要重新檢查弧B-> A(不是因為它們在上面的集合中)。

所以,這是偽代碼:

function AC3(csp) returns csp possibly with the domains reduced
    queue, a queue with all the arcs of the CSP
    while queue not empty
         (X,Y) <- getFirst(queue)
         if RemoveConsistentValues(X,Y, csp) then
              foreach Z in neighbor(X) - {Y}
                   add to queue (Z,X)
    return csp

function RemoveConsistentValues(X, Y, csp) returns true if a value was removed
    valueRemoved <- false
    foreach x in domain(X, csp)
        if there's no value of domain(Y, csp) that satisfies the restriction between X and Y then
            remove x from domain(X, csp)
            valueRemoved <- true
    return valueRemoved

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM