1. 程式人生 > >4.10 Comparing Backtracking Algorithms

4.10 Comparing Backtracking Algorithms

正如這項調查所表明的,回溯的許多改進已經被提出,而且有很多方法可以將這些技術結合到一個演算法中。在本節中,我對回溯演算法的效能進行了比較研究。本研究分為實證研究和理論研究兩大類。這兩種方法都有眾所周知的優點和缺點。經驗比較允許使用任何一對回溯演算法,但是關於哪種演算法更好的任何結論總是很弱,因為它必須由短語“on the instances we examined”來限定。理論比較允許對一些回溯演算法的相對效能進行分類陳述,但是任何結論在所有情況下都是正確的這一要求意味著,不能對每一對演算法都做陳述,而且可以做的陳述有時必須是弱的。

在比較回溯演算法時,採用了幾種效能指標。對於經驗比較,當然可以使用執行時間runtime

,儘管這需要確保比較的是底層演算法,而不是實現技巧或程式語言的選擇。獨立於實現的三個廣泛使用的效能度量是約束檢查的次數、回溯次數和訪問節點的數量

4.10.1 Empirical Comparisons經驗比較

回溯演算法的實證比較的早期工作由於缺乏現實的或困難的測試問題而受到阻礙(例如,[21,48,63,93,108,114])。實驗測試床通常只包含玩具問題——無處不在的n-queens問題在1965年首次使用,20多年後[57]仍被用作測試床[125]——以及簡單的隨機問題。而且,通常只對具有二進位制約束的csp進行實驗。對簡單的二進位制CSP的關注有時對該領域是有害的,並導致有希望的方法被過早地拋棄。

隨著相變過程中出現的硬隨機問題的發現以及對csp的替代隨機模型的研究(見[51]及其參考文獻),這種情況有所改善。現在可以進行實驗,對最困難的問題的演算法進行比較,系統地探索隨機問題的整個空間,看一種演算法在哪裡優於另一種演算法(例如,[17,45,126])。不幸的是,大多數隨機模型缺乏任何結構或真實性。由於認識到使用全域性約束和其他非二進位制約束對約束程式設計的重要應用程式進行建模通常是最好的,並且構造並隨後廣泛使用約束程式設計基準庫[53],從而進一步改善了這種情況。

在本節的其餘部分中,我將回顧兩種具有代表性的實驗流:一種是檢查回溯演算法應該執行何種級別的約束傳播的實驗,另一種是檢查改進回溯演算法的幾種技術之間的互動的實驗。許多其他的實驗——比如那些介紹了一種新技術的作者所做的實驗,然後證明了這種技術在選定的一組測試問題上效果更好——在本調查的其他地方也有報道。

Experiments on level of constraint propagation

實驗研究了回溯搜尋過程中應保持何種水平的區域性一致性。考慮表4.2中總結的代表性實驗集。Gaschnig[47]最初提出了圓弧一致性交叉回溯搜尋。對該方案進行測試的早期實驗得出結論,在搜尋過程中保持arc一致性的演算法與前向檢查演算法沒有競爭力[48,63,93]。

這一觀點維持了大約15年,直到受到薩賓和弗洛伊德的挑戰。Sabin和Freuder[116]利用硬隨機問題證明MAC可能比forward check好得多。近年來,隨著約束規劃在實踐中的應用越來越受到重視,人們逐漸認識到全域性約束和其他內涵表示的非二進位制約束對實際問題建模的重要性。有了這些約束,就可以開發特殊目的的約束傳播演算法,建模人員可以選擇要執行哪種級別的約束傳播。目前普遍認為,約束傳播水平的選擇取決於應用和不同的選擇,在同一CSP中可能存在不同的約束

Experiments on the interaction between improvements 關於改進之間相互作用的實驗

實驗研究了變序啟發式演算法的質量、回溯搜尋過程中保持的區域性一致性水平以及衝突定向回溯(CBJ)和動態回溯(DBT)等回溯技術的加入之間的相互作用。不幸的是,這三種改進回溯演算法的技術並不是完全正交的。考慮表4.3中總結的代表性實驗集。這些實驗表明,如果變數排序是固定的,約束傳播水平是正向檢驗的,衝突定向跳變是一種有效的技術。然而,在以往的實驗工作中也可以觀察到,隨著回溯搜尋中保持的區域性一致性水平的增加,以及變數排序啟發式的改進,CBJ的作用減弱[5,17,107,108]。例如,在Prosser[108]的實驗中可以觀察到,給定一個靜態變數排序,將保持的區域性一致性水平從零提高到正向檢查水平,會降低CBJ的效果。通過實驗,Bacchus和van Run[5]觀察到,將動態變數排序(相對於靜態變數排序的改進)新增到正向檢查演算法中會降低CBJ的效果。在他們的實驗中,這些效應是如此的小以至於幾乎可以忽略不計,他們提出了一個論點來說明為什麼這在一般情況下是成立的。Bessi 'ere和R´egin[17]從他們的實驗觀察,同時增加區域性一致性水平到進一步弧一致性和進一步提高動態變數排序啟發式減少CBJ太多的影響,在他們的實現,維護的開銷backjumping實際上減慢的資料結構演算法。他們推測,當保持圓弧一致性並使用良好的變數排序啟發式時,“CBJ變得無用”。上述所有實驗都是在小問題上進行的——斑馬問題和n蟻后問題——以及隨機csp上進行的,csp沒有任何結構。

與此相反,在隨後的隨機和真實結構的csp實驗中,人們發現反向跳轉是一種有用的技術。Jussien, Debruyne, Boizumault[75]的實證結果表明,在保持arc一致性的演算法中加入動態回溯可以顯著提高效能。Chen和van Beek[26]給出的經驗結果表明,雖然CBJ的影響可能會減弱,但是在保持圓弧一致性的回溯演算法中加入CBJ仍然可以提供數量級的加速。最後,CBJ現在是解決結構化SAT問題的最佳回溯演算法中的一種標準技術[83]。

4.10.2 Theoretical Comparisons理論比較

最壞情況分析和平均情況分析是理解和比較演算法的兩種標準理論方法。不幸的是,這兩種方法都沒有被證明在比較回溯演算法方面是成功的。回溯演算法的最壞情況界通常是指數的,很少能預測效能,回溯演算法的平均情況分析必然對問題的分佈做出了簡化和不切實際的假設(如[63,105,110])。

基於證明覆雜度的技術和基於演算法訪問節點屬性特徵構造部分順序的方法是兩種較成功的演算法比較方法

Proof complexity and backtracking algorithms

回溯演算法可以從反分解證明的證明覆雜度來比較。可以證明的結果是一般形式的:對於任意CSP例項,具有最優變數和值排序的演算法A在應用於該例項時,其訪問次數不會比具有最優變數和值排序的演算法B少,且訪問節點的次數可以呈指數增長。最優排序與演算法有關,因此A和B可能使用不同的排序。本文首先簡要介紹瞭解決反分解證明和證明覆雜性,然後對證明覆雜性技術在csp回溯演算法研究中的一些應用結果進行了說明。

決議推理規則以條款(A∨x)和(B∨¬x)的形式採用兩個前提,並將條款(A∨B)作為結論。 這兩個前提被認為是被解決,變數x被認為是被解決了。 解析兩個子句x和¬x給出了空子句。 給定一組輸入子句F,C語句的解析證明或推導是決議推理規則的一系列應用,使得C是最終結論,推理規則的每個應用中的每個前提都是來自F或F的條款。 先前應用推理規則得出的結論。 派生空子句的證明稱為反分解證明,因為它表明條件F的輸入集是不可滿足的

子句C的分解證明可以看作是有向迴圈圖(DAG)。DAG中的每個葉節點都用F中的一個子句進行標記,每個內部節點都用一個派生子句進行標記,這個派生子句是通過解析其兩個父節點的子句來證明的,並且有一個節點沒有後續節點,該節點的標記為c。對於我們的目的,一個就足夠了。樹解析證明是由推理的DAG構成樹的解析證明。證明的大小是證明DAG中節點(子句)的數量。

證明覆雜度是研究一種方法能夠產生[28]的最小證明的大小。已知,證明一組子句F是不可滿足的最小樹反分解證明可以指數級地大於最小的無限制的反分解證明,且不能小於(見[13]及其引用)。要了解為什麼樹證明可以更大,請注意,如果希望在證明的其他地方使用派生子句,就必須重新派生它。要了解樹證明為什麼不能更小,請注意,每個樹的分解證明也是一個無限制的分解證明。

為什麼反分解證明覆雜性對回溯演算法的研究有意義? 將完整的回溯演算法應用於不滿足的CSP所產生的搜尋樹可以被視為反分解證明。 作為對應的一個例子,考慮將BT應用於SAT問題而產生的回溯樹,該問題包括一組條款{a∨b∨c,a∨c,¬b,¬a∨c,b∨¬ C}。 每個葉節點都標有導致失敗的子句,內部節點通過從葉子到根應用解析推理規則進行標記,並且根將用空子句標記。 因此,證明覆雜性解決了最小可能的回溯樹的大小問題; 即,如果假定最優變數和值排序啟發式,則回溯樹的大小。

SAT回溯演算法與分解之間的聯絡已經被廣泛觀察到,基於dpl的演算法在不滿足的例項上對應於樹的解析度反駁證明。Baker[7]展示了當BT使用d路分支時,如何將這種對應推廣到一般csp的回溯演算法BT。Mitchell[100]利用de Kleer[32]的早期工作,展示了當BT使用雙向分支時,如何推廣這種對應關係。

Beame、Kautz和Sabharwal[13](在Beame之後)使用證明覆雜性技術研究nogood記錄的回溯演算法。假設DPLL是SAT的一種基本回溯演算法,假設DPLL+nr是DPLL,加入了一個不好的記錄方案(稱為FirstNewCut),假設DPLL+nr+restart是DPLL,加入了nogood記錄和無限的重啟。Beame結果表明,使用DPLL的最小refutation proofs比使用DPLL+nr的最小refutation proofs要長指數倍。換句話說,具有最優變數和值排序的DPLL不會比nogood記錄且具有最優變數和值排序的DPLL訪問更少的節點,而且訪問節點的次數可以呈指數增長。Beame還表明,如果在兩次重啟之間保留學到的nogoods,則DPLL+nr+重啟相當於不受限制的分解。DPLL+nr是等價於無限制分解,還是嚴格介於無限制分解與樹分解證明之間,是一個有待解決的問題。

Hwang和Mitchell[71]利用證明覆雜性技術研究了具有不同分支策略的回溯演算法。假設pt -2路是使用2路分支的一般csp的基本回溯演算法,而pt -d路是使用d路分支的回溯演算法。Hwang和Mitchell的研究表明,具有最優變數和值排序的BT-d-way比具有最優變數和值排序的BT-2-way訪問節點的次數更少,且訪問節點的次數可以呈指數增長。

儘管證明覆雜性框架是一種強大的技術,但它的侷限性是不能用來區分對基本的時間回溯演算法的一些標準改進。例如,考慮新增或不新增單元傳播和衝突定向回跳到DPLL的四種組合。當使用最優變數和值排序時,每個演算法訪問的節點數完全相同。類似的結果也適用於將衝突導向的回溯、動態回溯或前向檢查新增到BT[7,26,100]。

A partial order on backtracking algorithms回溯演算法的部分順序

回溯演算法可以通過構造每個回溯演算法訪問的搜尋樹節點的充要條件來進行比較。然後,可以根據兩個標準效能度量(訪問節點的數量和執行約束檢查的數量),使用這些描述在演算法上構造部分順序(或層次結構)。

可以證明的結果是一般形式的:給定任意CSP例項以及任意變數和值排序,具有變數和值排序的演算法A在應用於例項時不會比具有相同變數和值排序的演算法B訪問更多的節點(可能訪問更少)。也就是說,當效能度量是節點訪問時,演算法A優於演算法B。該方法的一個顯著特點是,即使兩種演算法使用的CSP模型都是演算法B認為最好的模型,即使兩種演算法使用的變數和值排序都是演算法B認為最好的排序,結果仍然保持(A仍然優於B)。

Kondrak和van Beek[79]介紹了一般的方法,給出了描述回溯演算法的技術和定義。利用該方法,對BT、BJ、CBJ、FC、FC-CBJ等幾種回溯演算法給出了充要條件。作為必要條件的一個例子,可以看出,如果FC訪問一個節點,那麼該節點的父節點就是1- consistency(見定義4.3)。作為一個充分條件的例子,可以證明,如果一個節點的父節點是1一致的,那麼BJ訪問該節點。然後利用必要條件和充分條件對這兩種回溯演算法進行排序。例如,為了證明FC在訪問節點數上優於BJ,我們證明了FC訪問的每個節點也被BJ訪問。FC的必要條件用於推斷節點的父節點是1一致的。由於節點的父節點是1一致的,那麼BJ的充分條件可以用來得出BJ訪問節點的結論。

Chen和van Beek[26]對回溯演算法的部分排序進行了擴充套件,包括回溯演算法和它們的CBJ混合演算法,這些演算法在前向檢查之外保持了局部一致性的水平,包括保持弧一致性的演算法。為了分析區域性一致性水平對跳遠的影響,Chen和van Beek採用了跳遠水平的概念。通俗地說,backjump的級別是指從backjump目的地到最遠的死端之間的距離,用backjump來表示。通過將反向跳轉演算法執行的反向跳轉劃分為不同的層次,將CBJ弱化為一系列執行有限級別的反向跳轉演算法。假設BJk是一種backjump演算法,當backjump level j小於等於k時進行backjump,而當j > k時按時間順序進行backtracks, BJn等價於CBJ, CBJ執行無限制的backjump, BJ1等價於Gaschnig的[48]BJ, Gaschnig只進行第一級backjump。回想一下,保持強k-consistency algorithm (MCk)在回溯樹的每個節點上強制執行強k-consistency,其中MC1等價於FC,在二進位制CSPs上MC2等價於MAC。MCk可以與backjump結合,即MCk- cbj。Chen和van Beek的研究表明,保持強k一致性的演算法不會比允許在大多數k級別上進行反向跳轉的反向跳轉演算法訪問更多的節點。因此,隨著回溯搜尋中維護的區域性一致性水平的提高,回溯的改進就越少

圖4.3顯示了BJk,MCk和MCk-CBJ的回溯樹大小的部分順序或層次結構。 如果在圖中存在從演算法A到演算法B的路徑,則A從不訪問比B更多的節點。例如,對於所有變數排序,MCk從不訪問比BJj更多的節點,因為所有j≤k。

Bacchus和Grove [3]觀察到,關於受約束節點的部分排序可以擴充套件到關於約束檢查的部分排序,或者在每個節點處執行的工作量的其他度量。 例如,在二進位制CSP上,MAC演算法可以在樹的每個節點執行O(n2d2)工作,其中n是變數的數量,d是域的大小,而FC演算法可以執行O(nd)工作。 因此,可以得出結論,在二進位制CSP上,在最壞的情況下(當兩個演算法訪問相同的節點時),MAC最多可以是O(nd)倍。 關於節點和約束檢查的部分排序與文獻中報告的一些經驗結果一致並且解釋(例如,參見表4.2和4.3中報告的實驗)。

除了明確顯示的關係之外,重要的是要注意層次結構中隱含的關係。 如果層次結構中沒有從演算法A到演算法B的路徑,則A和B是無法比較的。 為了顯示一對演算法A和B是無法比擬的,需要找到一個CSP和一個變數排序,一個A優於B,一個B優於A。已經給出了涵蓋所有不可比性結果的例子[4,26,79]。 一些更令人驚訝的結果包括:CBJ和FC-CBJ是無法比擬的[79],CBJ和MCk對於任何固定的k <n是無法比擬的,因為每個都可以指數地優於其他[4],以及MAC-CBJ和FC -CBJ以及更普遍的MCk-CBJ和MCk + 1-CBJ對於任何固定的k <n都是無法比擬的,因為每個都可以指數地優於其他的[26]。