4.7 Randomization and Restart Strategies
回溯演算法在某些情況下是脆弱的,這一點已被廣泛觀察到。對一個變數或值排序啟發式的看似很小的更改,例如打破連線方案的排序的更改,可能會導致執行時間上的巨大差異。對於這種現象的一種解釋是,排序啟發式會出錯。根據錯誤的數量以及錯誤在搜尋過程中出現的時間(因此需要付出多大的代價才能糾正錯誤),不同的啟發式之間的效能差異很大。為了利用這種可變性,提出了一種稱為隨機化和重新啟動的技術。
回溯搜尋演算法中的隨機化和重啟技術至少可以追溯到Harvey博士的博士研究[64]。Harvey發現週期性地用不同的變數排序重新啟動回溯搜尋可以消除“早期錯誤”的問題。這個觀察結果促使Harvey提出了隨機回溯演算法,在每次回溯演算法執行時,變數或值的順序都是隨機的。當找到解決方案或演算法從死端回溯的距離超過某個固定的截止時間時,回溯演算法終止。在後一種情況下,將重新啟動回溯演算法,並以不同的順序重新開始搜尋。Harvey證明這種隨機和重新啟動技術在作業車間排程問題上比確定性回溯演算法提供了更好的效能。Gomeset al.[60,61,62]通過演示該技術的廣泛適用性,將其與拉斯維加斯演算法的密切相關工作聯絡起來,並幫助我們理解何時重啟以及重啟的原因,為推廣和推進該技術做了大量工作。
在本節的其餘部分中,我首先研究技術本身,然後研究何時重新啟動幫助的問題。有關隨機化和重啟策略的更多資訊,請參見戈麥斯[58]的調查。
4.7.1 Algorithmic Techniques
隨機化和重啟技術要求在確定性回溯演算法中加入隨機化的方法,以及重啟策略、時間表或決定何時重啟的方法。
Randomization
文獻中提出了在回溯演算法中加入隨機化的幾種可能方法。Harvey[64]提出對變數排序進行隨機化。Gomes等[61,62]提出通過隨機斷鏈或使用現有的啟發式對變數進行排序,然後從最佳變數的某個小因子範圍內的變數集合中隨機選擇可變數,從而對變數排序進行隨機化。這些研究表明,重新啟動策略具有可被廣泛接受的可變順序,從而導致對各種各樣的問題(包括排程問題的SAT和CSP版本、計劃問題和準群完成問題)的順序進行幅度較小的改進。Cicirello和Smith[27]討論了在啟發式中新增隨機化的替代方法以及對搜尋效率的影響。其他選擇是選擇一個概率與該變數的啟發式權重成比例的變數,或者從一組啟發式中隨機選擇。需要注意的一個缺陷是,在啟發式中新增隨機化的方法必須在搜尋樹的頂部附近提供足夠多的不同決策。Harvey[64]提出對值排序進行隨機化,使每個可能的排序具有相等的可能性。同樣,上面列出的用於隨機變數排序的所有選項也是值排序的選項。Zhang[138]認為,隨機化啟發式會削弱啟發式,這是一種不可取的效果。Prestwich[106]和Zhang[138]提出了回溯時搜尋空間的隨機向後跳轉。雖然很有效,但是這樣做的結果是回溯演算法不再完整。
Restart strategies
重啟策略S = (t1,t2,t3,…)是一個無限序列,其中每個ti要麼是正整數,要麼是無窮大。其思想是對t1步驟執行隨機回溯演算法。如果在這個截止時間內沒有找到任何解決方案,演算法將執行t2步驟,依此類推。固定截止策略是指所有ti都相等的策略。提出了多種重啟策略。
Luby、Sinclair和Zuckerman[88](以下簡稱Luby)在拉斯維加斯演算法的更一般設定中研究了重啟策略。拉斯維加斯演算法是一種隨機演算法,它在結束時總是給出正確的答案,但是演算法的執行時間會因執行時間的不同而不同,可以建模為一個隨機變數。令f(t)為應用於例項x的回溯演算法a在恰好執行t步後停止的概率。設F(t)為F的累積分佈函式;即A在經過t步或更少步後停止的概率。F(t)有時被稱為演算法A在例項x上的執行時分佈。尾部概率是A在超過t步之後停止的概率; 即1-F(t),有時也稱為生存函式。 Luby表明,在充分了解執行時分佈的情況下,對於某些固定的截止t *,最優策略由St * =(t *,t *,t *,...)給出。當然,在實踐中並不知道執行時分佈。對於不瞭解執行時分佈的情況,Luby表明Su =(1,1,2,1,1,2,4,1,1,2,1,1,2,4,8,1,...) 給出的通用策略是在最優策略St *的對數因子內的,並且這是通過任何通用策略可以達到恆定因素的最佳效能。 此外,Luby證明,無論原始演算法A的執行時分佈如何,如果我們使用重啟策略St *或Su應用A,則重啟策略的尾概率很小,因為它以指數方式衰減。
要在實踐中使用重啟策略,必須在計算中確定什麼算基本操作或步驟。文獻中使用了幾種方法。Harvey[64]使用了一種固定的截止策略,當演算法從死端回溯的距離超過某個固定的截止時,該策略將重新啟動回溯演算法。Richards[112]在每個死端重新啟動,但是通過首先記錄一個nogood來保持完整性,這樣就不會重新訪問死端。Gomes等[61]使用固定的截止策略,當回溯次數超過某個固定的截止次數時,該策略將重新啟動回溯演算法。Kautz等[78,115]使用回溯演算法訪問的節點數。對於固定的截止策略,還必須決定使用什麼截止。到目前為止,好的邊界似乎是特定於一個例項的。因此,必須進行某種試錯搜尋,以獲得一個好的截止值。然而,van Moorsel和Wolter[130]觀察到,對於一些執行時發行版,範圍廣泛的截止時間表現良好。他們進一步觀察到,通常將截止時間設定得過大比過小更安全。對於通用策略,不需要決定截止日期。然而,據報道,普遍策略在實踐中是緩慢的,因為序列增長太慢(例如,[61,78,115])。請注意,這與通用策略在最優對數因子內的事實並不矛盾,因為這是一個漸近結果,並且忽略了常數因子。但是,也可以注意到,對於一些規模因子s,可以對通用策略進行伸縮,在保持最優性保證的同時,還可能提高效能。
Walsh[134]提出了一種通用策略,其中重啟值呈幾何級數遞增,表明1 < r < 2範圍內的r值對所研究的問題有很好的效果。該策略的優點是,它比通用策略增長得更快,但避免了尋找固定截止策略所需的截止時間。雖然它在實踐中似乎工作得很好,但不幸的是,幾何策略並沒有正式保證其最壞情況下的效能。可以看出,幾何策略的期望執行時可以任意地比最優策略的期望執行時差。
Kautz等[78,115](以下簡稱Kautz)觀察到Luby在證明St *的最優性時做出了兩個假設,但它們在實踐中可能並不成立。假設(i)隨機演算法的連續執行在統計上獨立且分佈相同,(ii)唯一可行的觀察或特徵是執行的長度。作為第一個假設可能是錯誤的示例,請考慮當前例項來自兩個分佈之一但我們不知道是哪個分佈的情況。在以前的執行中未能找到解決方案可能會改變我們對當前例項的執行時分佈的看法。為了證明第二個假設可能是錯誤的,Kautz證明了基於豐富特徵集的貝葉斯模型能夠足夠準確地預測演算法在當前例項上的執行時間。Kautz刪除了這些假設並提出了上下文敏感或動態重啟策略。 在一組實驗中,Kautz表明動態策略可以比靜態最優策略St *做得更好。 該策略使用貝葉斯模型來預測演算法的當前執行是“長”還是“短”,並且如果預測是“長”則重新開始。
Van Moorsel和Wolter[130]考慮了一個在實踐中經常出現的情況,即只有在一定期限內找到解決方案才有用;也就是說,我們有一個期限c,我們可以執行重啟策略,直到演算法的c個步驟全部執行完畢。Van Moorsel和Wolter考慮重新啟動策略,以最大限度地提高截止日期的可能性。
4.7.2 When Do Restarts Help?
從兩個角度解決了隨機化和重啟技術何時以及為何有用的問題:重新啟動在哪種執行時使用有用,以及這些執行時有用的根本原因是什麼。
Runtime distributions for which restarts are useful
在可滿足的情況下,重啟是有幫助的,Gomes等[61,62]表明,帶有重尾的概率分佈可以很好地適應帶有隨機啟發式的回溯演算法的執行時分佈。重尾分佈heavy-tailed distribution 是指尾部概率或生存函式(見上文)多項式衰減的分佈;即回溯演算法執行時間較長的概率較大。對於無法滿足的情況,Gomes等[61]報告說,在他們關於隨機擬群補全問題的實驗中,沒有發現重尾行為,因此重啟對這些問題沒有幫助。有趣的是,Baptista和marquess - silva[8]通過實驗證明,由於技術之間的協同作用,一種包含nogood記錄的回溯演算法可以從隨機化中獲益,並在解決無法滿足的例項時重新啟動。
Hoos[68]指出,重啟不僅對重尾有效,而且其有效性僅取決於存在某個點,即累積執行時分佈的增長速度慢於指數分佈。正是在這個搜尋停滯不前的時刻,重啟搜尋將會有所幫助。
Van Moorsel和Wolter[129]為重新啟動提供了必要和充分的條件。他們的工作可以看作是Hoos洞察力的形式化,以及從一次重啟到多次重啟的擴充套件。設T為一個隨機變數,對一個例項的隨機回溯演算法的執行時建模,設E[T]為T的期望值。假設隨機演算法的連續執行在統計上是獨立的,並且具有相同的分佈,Van Moorsel和Wolter證明,使用固定的t步截止進行任意次數的重啟,都比僅在且僅當,
即當且僅當演算法執行t步時,演算法的期望執行時間小於完成時的期望剩餘時間。VanMoorsel和Wolter還表明,如果一次重啟改善了預期的執行時,那麼多次重啟的效能甚至會更好,而無限制重啟的效能最好。上述條件適用於哪種分佈?對於尾呈多項式衰減的重尾分佈,重新啟動最有效(不等式最大),但Van Moorsel和Wolter觀察到,對於尾呈指數衰減的一些分佈,這種條件也適用。對於其他指數衰減的分佈,重新啟動嚴格來說比執行演算法來完成要差。Zhan[137]表明,這不是一個孤立的案例,對於許多問題來說,重啟可能是有害的。對於純指數分佈,條件是相等的,重新啟動既沒有幫助也沒有害處。
Underlying causes for these runtime distributions
人們提出了各種各樣的理論來解釋為什麼重啟是有幫助的;例如,為什麼在重新啟動很有幫助的地方會出現執行時發行版。對於這種現象的一種解釋是,排序啟發式會出現錯誤,需要回溯演算法去探索沒有解的大子樹。然而,這些理論在順序啟發式的錯誤含義上存在差異。Harvey[64]對錯誤的定義如下。
當出現錯誤時,搜尋已經擴充套件到沒有解決方案的子問題。結果是節點必須被駁倒,而這樣做可能需要探索一個子樹,尤其是在樹的早期犯錯誤的時候。在這個定義中,值排序啟發式會出錯,變數排序啟發式不會出錯。但是,更改變數排序可能意味著沒有犯錯誤,因為值排序對於新選擇的變數是正確的,或者任何錯誤更正的成本都更低。Harvey構建了一個概率模型來預測重啟演算法何時會比確定性演算法表現得更好。通過簡化錯誤概率的假設,我們發現當錯誤概率很小時,重啟是有益的。顯然,這個定義,以及它所依賴的概率模型,只有在CSP有解決方案時才適用。因此,該理論並沒有解釋什麼時候重啟對無法解決的問題是有益的。
作為支援這一理論的證據,Hulubei和O’sullivan[70]考慮了反駁規模的分佈來糾正錯誤(紮根於錯誤的子樹的大小)。結果表明,在擬群補全問題的實驗中,當使用較差的值排序時,四個不同的高質量變數排序啟發式中的每一個都存在重尾行為。然而,當進行相同的實驗時,重尾行為消失了,但這次用高質量的值排序啟發式代替了隨機值排序。
Williams、Gomes和Selman[135](以下簡稱Williams)對錯誤的定義如下。
後門是一組存在賦值的變數,這些賦值使得簡化的問題(例如約束傳播之後的問題)可以在多項式時間內得到解決。後門捕獲了一種直覺,即良好的變數和值排序啟發式可以儘可能快地簡化問題。當出現錯誤時,搜尋已經擴充套件到一個子問題,這個子問題並沒有像選擇後門變數那樣有效地簡化。結果是子問題的搜尋成本更高,尤其是在樹的早期出現錯誤時。在這個定義中,變數排序啟發式會出錯,值排序啟發式不會出錯。Williams構建了一個概率模型來預測何時會發生重尾行為,但也存在一些啟動策略,它們的期望執行時間是多項式的。通過對出錯概率的簡化假設,我們發現,當出錯概率足夠小且最小後門的大小足夠小時,這兩種情況都會發生。該理論還可以通過強大後門的概念,解釋何時重啟對無法解決的問題有益。然而,該理論並沒有完全解釋這樣一個事實,即隨機值排序和重啟策略可以消除重尾行為。在這種情況下,變數順序保持不變,因此出錯的概率也保持不變。
最後,一些工作有助於我們理解為什麼在重新啟動很有幫助的情況下會出現執行時發行版,同時對錯誤的確切定義保持不可知。考慮反駁大小的概率分佈來修正錯誤。它在隨機問題和理論概率模型上都得到了實證證明,在這種情況下,隨著反駁的規模增長,重尾呈指數衰減[24,59]。換句話說,犯代價高昂的(指數大小的)錯誤的概率呈指數遞減。