回溯法——求解0-1揹包問題


         曾經研究過一個簡單的N皇后問題對回溯法也有了個模糊的認識,大體理解就是:先一直作某件事,當完畢某個條件時或者是觸犯某個條件時。再返回到近期的一個相似還原點的地方算法


       在用回溯法求解0-1揹包問題的時候。主要遇到三個相對難解決的問題:1。什麼是界限函數;2,何時用它;3,回溯到哪兒。函數





   什麼是界限函數?



        例如如下圖:post

            當咱們身在一棵搜索空間樹中,站在一個K點猶豫不定的時候。咱們可以用它估算假設咱們繼續向下走,咱們走完本段路會得到的總價值。spa

假設咱們現在有一個最大解,當我用界限函數算出一個價值後和我當前的最大解比較。假設能得到更大利益。咱們選擇繼續向下走,假設不能。果斷放棄。.net


         從下圖中的僞代碼可以看出,咱們計算後半段最大價值的時候。使用的仍是一個貪心算法。儘管切割的狀況是不被贊成的,但是咱們可以用這個結果來進行估算。blog




       

        


回溯法獲得的搜索空間樹:
排序



     

            

       




    何時使用界限函數?


                

       數學一點兒的說法是:當X[i]=0時。get

 

   通俗一點說:當進入右結點的時候。數學



   怎樣回溯的問題?


        向上回溯到第一個不是0的結點(並且這個結點不是頂點)。class


               


   求解思路

                


               如上圖搜索樹。在創建搜索樹以前,我將所有的物品依照V/W(價值重量比)從大到小排序。而後從第一個開始。依次向背包(揹包大小110)中放入,放到第6個的時候,這時候發現6太大了,不能裝入了,這時候用界限函數推斷下,假設繼續下去。會得到的最大價值,得出這個價值後,和上幾回查找獲得的最大價值對照但是因爲咱們在這以前尚未得到過別的解,因此界限函數再和最大價值的初值-1比較的時候,老是會選擇繼續。這樣咱們就獲得了一個解139.而後咱們回溯到第一個X[i]不等於0的地方,此處爲X[5],而後將X[5]置爲0。這時候X[5]置0了,咱們就先用界限函數推斷下X[6]到X[8]的狀況,得出了個164.44,這個比咱們上次獲得的第一個解也是最大的解139大。說明向後繼續,肯會出現一個比139還大的解,因此咱們選擇向後繼續。。

。。。


               。。

。。。。。


            但咱們回溯到X[1]的時候。咱們將X[1]置0。這時候用界限函數估算下物品2到物品8可能得到的最大價值,發現是155.11,比咱們實際獲得的最大解159還小,而後果斷放棄,再向上回溯,發現這已經到了盡頭了,而後中止。

                 


                  結合曾經的N皇后問題,N皇后問題是我一行一行的放皇后。假設當下一行放到最後一個位置的時候仍是會產生攻擊。這時候咱們就調整上一行皇后的位置,而後再回到本行從第一個開始放。對照0-1揹包,這個是完畢一次求解過程,而後就回溯繼續求解。

            


            因此,回溯法是先一直作,作不下去了,而後才向回走。





     小結:

                    0-1揹包問題的用回溯法解決最開始提出的三個問題挺關鍵的,試想,假設一個問題足夠大的話。用界限函數能夠砍掉很是多不合條件的子節點。極大的提升了效率。

相關文章
相關標籤/搜索