搜索的剪枝


半年前在POJ上遇到過一次剪枝的題目,那時覺得剪枝好神秘。。。今天在網上查了半天資料,終於還是摸索到了一點知識,但是相關資料並不,在我看來,剪枝是技巧,而不是方法,也就是說,可能一點實用的小技巧,讓程序可以少判斷一點,這就是剪枝,剪枝無處不在,

搜索的進程可以看作是從樹根出發,遍歷一棵倒置的樹—-搜索樹的過程。而所謂的剪枝,顧名思義,就是通過某種判斷,避免一些不必要的遍歷過程,形象的說,就是減去了搜索樹中的某些“枝條”,故稱剪枝。
(杭電課件上是這么說的:即剪去解答樹上已被證明不可能存在可行解或最優解的子樹.)

既然采用了搜索,剪枝就顯得十分的必要,即使就簡簡單單的設一個檻值,或多加一兩條判斷,就可對搜索的效率產生驚人的影響。例如N后問題,假如放完皇后再判斷,則僅僅只算到7,就開始有停頓,到了8就已經超過了20秒,而如果邊放邊判斷,就算到了10,也沒有停頓的感覺。所以,用搜索一般都就要剪枝。

剪枝至少有兩方面,一是從方法上剪枝,如采用分枝定界,啟發式搜索等,適用范圍比較廣;二是使用一些小技巧,這類方法適用性雖不如第一類,有時甚至只能適用一道題,但也十分有效,並且幾乎每道題都存在一些這樣那樣的剪枝技巧,只是每題有所不同而已。

剪枝的原則:
1.正確性:必須保證不丟失正確的結果。
2.准確性:能夠盡可能多的減去不能通向正解的枝條
3.高效性:在很多時候,為了加強優化的效果,我們會增加一些判斷,這樣對程序效率也帶來了副作用,所以要考慮剪枝的高效性,否則得不償失。

最后說一下:剪枝在搜索中用的是非常的廣泛的。

參照杭電課件第47頁一句話:
ACMer們:
為了ACM事業,努力地剪枝吧!!


題目我不多說,HDOJ 1010就是一個很好的剪枝題目。

另外,杭電的課件–搜索篇里面也講了搜索與剪枝。

 

 

 

 轉載自:http://www.cppleyuan.com/viewthread.php?tid=2710


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM