貪心算法
先來比較一下貪心算法和動態規劃
貪心算法是指在對問題求解時,總是做出在當前看來是最好的選擇,不考慮整體,只考慮局部最優,所以它不一定能得到最優解;
動態規劃則是每個步驟都要進行一次選擇,但選擇通常要依賴子問題的解,所以它是考慮整體的,由于通常要依賴子問題的解,所以一般選自自底向上自帶備忘的機制,所以一定是最優解;
最優子結構的概念
如果一個問題的解包含其子問題的最優解,則稱該問題具有最優子結構,也就是求解大問題的解,是通過求解小問題取解決
如果理解了最優子結構,則會發現貪心算法和動態規劃都利用了最優子結構的性質
實現該算法的過程
從問題的某一初始解出發
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問題,將在下一章結合分支界限介紹,這章只介紹概念