1. 程式人生 > >【作業】演算法第5章作業

【作業】演算法第5章作業

1、對回溯演算法的理解

回溯演算法實際上一個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。許多複雜的,規模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。

用回溯演算法解決問題的一般步驟: a、 針對所給問題,定義問題的解空間,它至少包含問題的一個(最優)解。 b 、確定易於搜尋的解空間結構,使得能用回溯法方便地搜尋整個解空間 。 c 、以深度優先的方式搜尋解空間,並且在搜尋過程中用剪枝函式避免無效搜尋。 在回溯法執行時,應當:儲存當前步驟,如果是一個解就輸出;維護狀態,使搜尋路徑(含子路徑)儘量不重複。必要時,應該對不可能為解的部分進行剪枝。

2、請說明“子集和”問題的解空間結構和約束函式

解空間結構:可以建立一個二叉樹,其中level i 代表權重wi。 每一個節點引出兩個branch, 一個branch標記為0, 一個標記為1. 標記為0的意思是這個branch引出的孩子節點對應的weight不再答案選中, 標記為1表示引出的child選中。要找到所有可能的答案, 就得遍歷這棵樹, 然後只要和為M, 就打印出從根節點到這條路徑所有的節點即可。

約束函式:假設我們在level k 的時候, 我們積累到的和為S, 由於我們的所有的權重都是事先排好序, 從小到大的, 所以如果 S + wk > M, 那麼我們就知道, 再沿著這條branch下去, 不可能得到解的。 只要還有能夠找到解的possible, 我們就沿著這個branch繼續找。另外如果全部子集相加也得不到所求結果那就不用繼續往下了。

3、請說明在本章學習過程中遇到的問題及結對程式設計的情況

我們在做第二題時較順利,做第一題時約束函式不夠好,剪枝有點小問題,跟結對隊友討論之後改正了。回溯法主要是要找到一個好的解空間,然後絕佳地剪枝,就很perfect!感謝結對隊友,也感恩老師!