貪心算法+回溯算法

貪心算法

先來比較一下貪心算法和動態規劃

貪心算法是指在對問題求解時,總是做出在當前看來是最好的選擇,不考慮整體,只考慮局部最優,所以它不一定能得到最優解;


動態規劃則是每個步驟都要進行一次選擇,但選擇通常要依賴子問題的解,所以它是考慮整體的,由于通常要依賴子問題的解,所以一般選自自底向上自帶備忘的機制,所以一定是最優解;


最優子結構的概念


如果一個問題的解包含其子問題的最優解,則稱該問題具有最優子結構,也就是求解大問題的解,是通過求解小問題取解決
如果理解了最優子結構,則會發現貪心算法和動態規劃都利用了最優子結構的性質

實現該算法的過程

從問題的某一初始解出發

while 能朝給定總目標前進一步 do

求出可行解的一個解元素

由所有解元素組合成問題的一個可行解

典型的可用貪心來解的問題有

最小生成樹、分數背包問題(類似0-1背包問題,只不過可以取物體的一部分)

用分數背包問題舉個例子

W=30(所選物體不能超過30)

物品:A B C

重量:20 5? 20

價值:40 20 20
這個時候的貪心選擇肯定是選擇單位價值量最高的


所以先選擇B,再選擇A?
再從C中選擇5??
這時價值肯定最大


但貪心算法一開始就說了,并不保證最優解,所以有時會配合隨機算法(算法導論第三版第五章有講)使用?
一般來說貪心算法的代碼比動態規劃簡單的多


回溯算法

回溯法概念

通常采取深度遍歷的形式,按照某種規則的能夠避免某些不必要搜索的窮舉式搜索

解空間(所有解的集合)

可以組織成一棵解集合的樹

解集合樹中的節點分為幾種

擴展節點

在當前的擴展結點處,搜索向縱深方向移至一個新結點。這個結點就成為一個新的活結點,并成為當前擴展結點。

死節點

如果在當前的擴展結點處不能再向縱深方向移動,則當前的擴展結點就成為死結點,此時應往回移動(回溯)至最近的一個活結點處,并使這個活結點成為當前的擴展結點,用這種方式遞歸地在解空間中搜索,直至找到所要求的解或解空間中已無活結點為止

典型問題

貨擔郎問題(TSP問題)

設某售貨員要到若干城市去推銷商品,已知各城市之間的路程(或路費)。他要選定一條從駐地出發,經過每個城市一遍,最后回到駐地的路線,使總的路程最小。

這是解集合樹(具體怎么解決這個問題,再分子界限算法中解決,這里只是介紹回溯法本身)

利用回溯法解決該類問題步驟

1、針對所給問題,定義問題的解空間;

2、確定易于搜索的解空間結構;

3、以深度優先方式搜索解空間,并在搜索過程中用剪枝函數避免無效搜索。

常用剪枝函數(這里明白概念就行,具體在分支界限算法講)

用約束函數在擴展結點處剪去不滿足約束的子樹;

用限界函數剪去得不到最優解的子樹。

具體例子,0-1背包問題和TSP問題,將在下一章結合分支界限介紹,這章只介紹概念

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容