1. 程式人生 > >4.6 Heuristics for Backtracking Algorithms回溯演算法的啟發式

4.6 Heuristics for Backtracking Algorithms回溯演算法的啟發式

當使用回溯搜尋解決CSP時,必須對要分支或例項化的變數以及要給該變數的值做出一系列決策。這些決策稱為變數和值排序。已有研究表明,對於許多問題,變數的選擇和值的排序對於有效解決問題是至關重要的(如[5,50,55,63])。

變數或值排序可以是靜態的(排序在搜尋之前是固定的並確定),也可以是動態的(排序在搜尋過程中確定)。動態變數排序在文獻中得到了廣泛的關注。它們早在1965年就提出了[57],現在已經很好地理解了如何將動態排序合併到任意樹搜尋演算法[5]中。

在給定CSP和回溯搜尋演算法的情況下,如果在找到一個解決方案或表明不存在解決方案時,變數或值排序的搜尋結果在所有可能的排序中訪問的節點數最少,則稱變數或值排序是最優的。

(請注意,我也可以使用其他一些抽象度量,例如在每個節點上完成的工作量,而不是訪問的節點,但這不會改變基本結果。)毫不奇怪,尋找最優排序是一項計算上困難的任務。Liberatore[87]表明,簡單地判斷一個變數是否是最優變數排序中的第一個變數,至少與判斷CSP是否有解決方案一樣困難。尋找最優值排序顯然也同樣困難,因為如果存在解決方案,可以使用最優值排序來有效地找到解決方案。對於如何找到最優排序或如何構造多項式時間逼近演算法——這些演算法返回的排序保證接近最優(參見[70,85]),人們知之甚少。約束規劃領域目前主要集中在沒有形式化保證的啟發式上

啟發式既可以是獨立於應用程式的(只使用所有csp共同的通用特性),也可以是依賴於應用程式的。

在這個調查中,我主要關注獨立於應用程式的啟發式。這種啟發式方法已經非常成功,可以為新應用程式設計啟發式提供一個良好的起點。我給出的啟發式沒有指定在使用tie時選擇哪個變數或值,結果取決於實現。這些啟發式通常可以通過新增額外的打破關係的特性來顯著改進。然而,並沒有一種最佳的變數或值排序啟發式演算法,在這些獨立於應用程式的啟發式演算法不能很好地工作的情況下,仍然存在一些問題,必須設計一種新的啟發式演算法。

由於要設計一種新的啟發式,因此出現了幾種備選方案。當然,啟發式既可以使用獨立於應用程式的特性(請參閱[36]以獲得構建啟發式所需的許多特性的摘要),也可以使用依賴於應用程式的特性。smith和Cheng[122]舉例說明,在對作業車間排程、CSP模型和搜尋演算法有深入瞭解的情況下,如何設計一種有效的啟發式作業車間排程演算法。然而,這種專業知識的結合可能是稀缺的。人為製作啟發式的替代方法是自動適應或學習啟發式。

明頓[98]提出了一種系統,它能自動地從一個庫到一個應用程式用啟發式將泛型變數和值排序。Epstein et al.[36]提出了一個系統,該系統從應用程式以前的問題搜尋經驗中學習變數和值排序啟發式。啟發式是由一組豐富的基本特徵組合而成的。Bain, Thornton和Sattar[6]展示瞭如何使用進化演算法學習用於優化問題的變數排序啟發式。

最後一種選擇是,對於一個問題,如果只能發現相對較弱的啟發式,那麼已經證明,隨機化和重新啟動的技術可以提高問題解決的效能(見4.7節)。Cicirello和Smith[27]討論了在啟發式中新增隨機化的替代方法以及對搜尋效率的影響。Hulubei和O’sullivan[70]研究了變數的強度與值序啟發式和重新啟動需求之間的關係。

4.6.1 Variable Ordering Heuristics

假設回溯搜尋試圖擴充套件節點p。變數排序啟發式的任務是選擇下一個要分支的變數x。文獻中提出並評價了許多變序啟發式演算法。這些啟發式可以分為兩類:一類是主要基於變數的域大小的啟發式,另一類是基於CSP的結構的啟發式

Variable ordering heuristics based on domain size

當使用回溯搜尋和約束傳播交叉求解CSP時,使用約束和當前的分支約束集對未分配變數的域進行修剪。許多最重要的變數排序啟發式都基於未分配變數的當前域大小

Golomb和Baumert[57]是第一個提出動態排序啟發式演算法的人,該演算法基於選擇在其域中剩餘值最少的變數。啟發式(以下簡稱dom)是選擇最小化的變數x,rem(x| p), 其中x在所有未賦值變數上取值。當然,無論在搜尋過程中執行何種級別的約束傳播,啟發式都是有意義的。如果演算法不執行約束傳播,只檢查例項化了所有變數的約束,則定義rem(x | p)只包含滿足所有相關約束的值。由於我們的回溯搜尋演算法執行的是約束傳播,在實際應用中會是這樣,因此可以非常有效地計算dom啟發式。dom啟發式是由Haralick和Elliott[63]推廣開來的,他們證明了dom與forward check演算法的有效結合。

為了理解這種簡單而有效的啟發式,人們付出了大量的努力。有趣的是,Golomb和Baumert[57]在首次提出dom時,從資訊理論的角度說明,平均而言,選擇域大小最小的變數效率更高,但沒有進一步的闡述。Haralick和Elliott[63]分析表明,dom假設CSP的概率模型過於簡單,並且假設我們使用正向檢查演算法搜尋所有的解決方案,從而使搜尋樹的深度最小化。Nudel[105]表明,dom是最優的(它最小化了搜尋樹中的節點數量),再次假設了正向檢查,但使用了稍微精細化的概率模型。Gentetal[52]提出了一種名為kappa的度量方法,其目的是捕捉“約束”,以及首先選擇約束最大的變數意味著什麼。它們表明dom(和dom+deg,見下文)可以看作是該度量的近似。

Hooker[66]在一篇有影響力的論文中主張通過建立經驗模型來支援或反駁啟發式背後的直覺,從而對啟發式進行科學檢驗,而不是競爭性檢驗。Hooker和Vinay[67]將該方法應用於SAT的變數順序啟發式jerolow - wang啟發式的研究。令人驚訝的是,他們發現標準的直覺——“(啟發式)在建立更容易滿足的子問題時表現得更好”——被駁斥了,而一種新發展的直覺——“(啟發式)在建立更簡單的子問題時表現得更好”——得到了證實。Smith和Grant[120]將該方法應用於dom的研究。Haralick和Elliott[63]提出了一種啟發式的直覺,稱為“失敗第一原則”:“要想成功,首先在最容易失敗的地方嘗試”。令人驚訝的是,史密斯和格蘭特發現,如果像哈里里克和艾略特那樣,將失敗優先原則與最小化搜尋樹的深度等同起來,那麼這個原則就會遭到駁斥。在後續的工作中,Beck等人發現,如果將故障優先原則等同於搜尋樹中節點數量最小化,就像Nadel所做的那樣,那麼該原則就得到了證實。Wallace[132]通過因子分析,發現了變數排序啟發式導致搜尋效率變化的兩個基本因素:即時失效和未來失效

除了理解dom所付出的努力之外,還有很多努力是為了改進dom。Br´elaz[20],在圖著色的背景下,提出了現在廣泛使用的泛化dom。設未賦值變數x的程度為包含x和至少另一個未賦值變數的約束的數量。啟發式(以下簡稱dom+deg)是選擇域中剩餘值最少的變數,並通過選擇最高次的變數來打破任何關係。注意,度數資訊是動態的,並在例項化變數時更新。靜態版本在實踐中也使用,其中度資訊只在搜尋之前計算。

Bessi 'ere和R´egin[17]提出了另一個泛化的dom。啟發式(以下簡稱dom/deg)是將一個變數的域大小除以該變數的度,選擇值最小的變數。該啟發式演算法在隨機問題上效果良好。Boussemart et al.[19]提出除以加權程度,後記為dom/wdeg。權重(最初設定為1)與每個約束相關聯。每當約束對死端負責時,相關的權重就會增加。加權程度是包含x和至少一個未賦值變數的約束的權值之和。dom/wdeg啟發式在許多問題上都能很好地工作。有趣的是,也有經驗表明,弧一致性傳播加上dom/deg或dom/wdeg啟發式可以減少或消除對某些問題的回溯需求[17,84]。

Gent等人建議選擇最小化的變數x,

 

其中C的取值範圍包括了所有涉及x和至少一個未賦值變數的約束條件,而tC是不滿足約束條件C的賦值的分數。所有這些啟發式的一個限制是,隨著搜尋的進行,需要對每個約束C更新tC估計值。這顯然代價高昂,但對於內涵表示的約束和非二進位制約束也有問題。同樣,乘積項隱含地假設約束失敗的概率是獨立的,這個假設在實踐中可能不成立。 

Brown和Purdom[21]建議選擇最小化的變數x,

其中y在所有未賦值變數範圍內。啟發式背後的原理是選擇變數x,它是最小的2級子樹的根。Brown和Purdom表明,當隨機SAT問題變大時,啟發式演算法比dom演算法更有效。然而,啟發式演算法在硬SAT問題或一般csp中尚未得到全面的評價。

Geelen[49]建議選擇最小化的變數x,

其中y在所有未賦值變數範圍內。乘積項可以看作是給定x值a的解的個數的上界,啟發式背後的原則是選擇最“受約束”的變數。Geelen證明了當約束傳播的級別是正向檢驗時,該啟發式演算法能很好地解決n-queens問題。Refalo[111]提出了一種類似的啟發式演算法,並證明它比基於dom的多揹包和魔術方塊問題啟發式演算法要好得多。雖然啟發式的計算成本很高,但雷法洛的工作表明,在排序中選擇第一個或幾個變數時,它特別有用。有趣的是,Wallace[132]報告說,在隨機和準群體問題上,啟發式演算法表現不佳。

Freeman[38],在SAT的背景下,建議選擇最小化的變數x,

其中y在所有未賦值變數範圍內。由於這是一種昂貴的啟發式,Freeman建議在選擇搜尋中的前幾個變數時主要使用它。啟發式演算法的原理是在選擇變數的情況下,最大限度地增加傳播量和例項化變數的數量,從而簡化維護問題。Freeman指出,當約束傳播的級別是單位傳播(相當於前向檢查)時,啟發式演算法可以很好地解決硬SAT問題,儘管計算成本很高。Malik等[91]表明,截斷版本(僅使用dom(x)中的第一個元素)在指令排程問題上非常有效。

Structure-guided variable ordering heuristics
CSP可以用圖形表示。這種圖形化表示構成了結構導向的變數排序啟發式的基礎。真正的問題往往包含很多的結構,在這些問題上,結構導向的啟發式的優點包括,結構引數可以用來約束回溯演算法的最壞情況,結構good和nogood可以被記錄下來,並用於修剪搜尋空間的大部分。不幸的是,這些啟發式目前的一個侷限性是,它們在存在全域性約束的情況下會崩潰,這在實踐中是很常見的。另一個缺點是,一些結構引導的啟發式要麼是靜態的,要麼幾乎是靜態的

Freuder [40]可能是第一個提出結構引導變數排序啟發式的人。 考慮約束圖,其中CSP中的每個變數都有一個頂點,如果存在約束C,則兩個頂點x和y之間存在邊,使得x∈vars(C)和y∈vars(C)。

Definition 4.9 (width). 讓約束圖中的頂點排序。排序的寬度是排序中從任意頂點v到v之前的頂點的最大邊數。約束圖的寬度是該圖所有排序的最小寬度。

考慮與圖中頂點的排序相對應的靜態變數排序。Freuder[40]表明,如果強k一致性級別大於排序的寬度,那麼靜態變數排序是無回溯的。顯然,這樣的變數排序在優化排序的O(d)因子內,其中d是域的大小。Freuder[40]還表明,如果強一致性級別大於約束圖的寬度,則存在無回溯靜態變數排序。Freuder[41]將這些結果推廣到靜態變數排序中,該排序保證了搜尋中訪問的節點數可以預先有界。

Dechter和Pearl[35]提出了一個變數排序,它首先例項化了在約束圖中切割迴圈的變數。一旦所有的迴圈被切斷,約束圖是一個樹,可以使用圓弧一致性[40]快速求解。Sabin和Freuder[117]在保持arc一致性的演算法中對該方案進行了改進和測試。他們表明,在隨機二進位制問題上,可變排序的迴圈削減可以優於dom+deg。

Zabih [136]建議選擇width較小的靜態變數排序。 讓約束圖中的n個頂點按1,...,n排序。排序的頻寬是排序中由一條邊連線的任意兩個頂點之間的最大距離。約束圖的頻寬是該圖所有順序上的最小頻寬。直觀地說,一個小的頻寬排序將確保導致失敗的變數將被關閉,從而減少對回跳的需要。然而,目前很少有實證證據表明這是一種有效的啟發式方法。

在圖的演算法設計中,一個著名的技術是使用圖分隔符進行分治

定義4.10(分隔符)。圖的分隔符是頂點或邊的子集,當這些頂點或邊被移除時,這些邊將圖分離成不相交的子圖。

一個圖可以遞迴地分解,通過連續地找到結果不相交子圖的分隔符。弗瑞德和奎恩·[42]提出了一個基於這種曲線分解的變數排序演算法。其思想是,分隔符(在[42]中稱為割集)提供一組變數,一旦例項化,這些變數將分解CSP。Freuder和Quinn還提出了一種特殊目的的回溯演算法,在求解獨立問題時,可以正確地使用變數排序的加法行為,而不是乘法行為。Huang和Darwiche[69]表明不需要特殊目的回溯演算法;我們可以只使用CBJ。因為分隔符是在搜尋之前找到的,所以在執行回溯搜尋期間,預先建立的變數組不會更改。然而,Huang和Darwiche注意到,在這些分組中,變數排序可以是動態的,並且可以使用任何現有的變數排序啟發式。Li和van Beek[86]對這種分而治之的方法提出了一些改進。到目前為止,分而治之的方法已經被證明對SAT難題是有效的[69,86],但是對於一般CSP問題的方法還沒有系統的評價。

Moskewicz等[103]在SAT的Chaff求解器中提出,作為最後兩種結構導向的啟發式方法,變數的選擇應該偏向於近期記錄的nogoods中出現的變數。J´egou和Terrioux[73]使用tree-decomposition約束圖指導變數的排序。

4.6.2 Value Ordering Heuristics

假設回溯搜尋試圖擴充套件節點p,而變數排序啟發式選擇了變數x作為下一個分支。值排序啟發式的任務是為x選擇下一個值a。許多值排序啟發式的設計原則是選擇下一個最有可能成功或成為解決方案一部分的值現有的值排序啟發法,往往基於估計解的數量或估計解的概率,對於x的每個值a的選擇。 顯然,如果我們確切地知道這些屬性中的任何一個,那麼也可以知道完美的值排序 - 只需選擇一個導致解決方案的值並避免不會導致解決方案的值。

Dechter和Pearl[35]提出了一種基於近似每個子問題的解個數的靜態值排序啟發式。通過對問題形成樹鬆弛,得到解的個數的近似,在樹鬆弛中,約束條件被刪除,直到CSP的約束圖可以表示為樹為止。計算樹結構CSP的所有解是多項式的,因此可以精確計算。然後,通過減少對解決方案計數的估計,對這些值進行排序。後續工作[76,94,131]集中於推廣動態值排序的方法,並利用貝葉斯網路的最新思想改進解決方案數量的近似(樹鬆弛可以提供對真實解決方案計數的糟糕估計)。這部分工作的一個限制是,當它比較解決方案的數量時,它沒有考慮被分支到的子樹的大小,也沒有考慮搜尋子樹的困難和成本

Ginsbergetal [55],在使用填字遊戲作為試驗檯的實驗中,提出了以下動態值排序啟發式演算法。 要例項化x,請選擇值a∈dom(x),以最大化剩餘域大小的乘積,

其中y的範圍包括所有未分配的變數。Ginsberg等人證明了當約束傳播的級別是正向檢驗時,啟發式演算法在縱橫字謎遊戲中工作良好。Geelen[49]為這種啟發式的有效性提供了進一步的經驗證據。Geelen注意到,乘積給出了節點p可能完成的數量,這些完成可以通過兩種方式檢視。首先,假設每一次完成都有可能是一個解,選擇使乘積最大化的值也會使我們分支到包含一個解的子問題的概率最大化。其次,補全可以看作是子問題解的個數的上界。Frost和Dechter[46]建議選擇使其餘域大小之和最大化的值。然而,Geelen[49]注意到,乘積的微分要比求和好得多。在文獻中,產品啟發式有時被稱為“承諾啟發式”,而總和啟發式有時被稱為“最小衝突啟發式”,其靈感來源於明頓等人提出的同名區域性搜尋啟發式[99]。