貪心算法

貪心算法:

貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解
貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關

貪心的思路:

貪心選擇是指所求問題的整體最優解可以通過一系列局部最優的選擇,即貪心選擇來達到。這是貪心算法可行的第一個基本要素,也是貪心算法與動態規劃算法的主要區別。貪心選擇是採用從頂向下、以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問題簡化爲一個規模更小的子問題。對於一個具體問題,要確定它是否具有貪心選擇的性質,我們必須證明每一步所作的貪心選擇最終能得到問題的最優解。通常可以首先證明問題的一個整體最優解,是從貪心選擇開始的,而且作了貪心選擇後,原問題簡化爲一個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步貪心選擇,最終可得到問題的一個整體最優解。

貪婪算法可解決的問題通常大部分都有如下的特性:

隨着算法的進行,將積累起其它兩個集合:一個包含已經被考慮過並被選出的候選對象,另一個包含已經被考慮過但被丟棄的候選對象。
有一個函數來檢查一個候選對象的集合是否提供了問題的解答。該函數不考慮此時的解決方法是否最優。
還有一個函數檢查是否一個候選對象的集合是可行的,也即是否可能往該集合上添加更多的候選對象以獲得一個解。和上一個函數一樣,此時不考慮解決方法的最優性。
選擇函數可以指出哪一個剩餘的候選對象最有希望構成問題的解。
最後,目標函數給出解的值。
爲了解決問題,需要尋找一個構成解的候選對象集合,它可以優化目標函數,貪婪算法一步一步的進行。起初,算法選出的候選對象的集合爲空。接下來的每一步中,根據選擇函數,算法從剩餘候選對象中選出最有希望構成解的對象。如果集合中加上該對象後不可行,那麼該對象就被丟棄並不再考慮;否則就加到集合裏。每一次都擴充集合,並檢查該集合是否構成解。如果貪婪算法正確工作,那麼找到的第一個解通常是最優的。

補充一句:

很多圖論的算法本質上是貪心算法,
貪心算法當然也有正確的時候。求最小生成樹的Prim算法和Kruskal算法都是漂亮的貪心算法。
貪心法的應用算法有Dijkstra的單源最短路徑和Chvatal的貪心集合覆蓋啓發式
所以需要說明的是,貪心算法可以與隨機化算法一起使用,具體的例子就不再多舉了。其實很多的智能算法(也叫啓發式算法),本質上就是貪心算法和隨機化算法結合——這樣的算法結果雖然也是局部最優解,但是比單純的貪心算法更靠近了最優解。例如遺傳算法,模擬退火算法。

貪心算法的經典例題:

0-1揹包問題

有一個揹包,揹包容量是M=150kg。有7個物品,物品不可以分割成任意大小。要求儘可能讓裝入揹包中的物品總價值最大,但不能超過總容量。
物品 A B C D E F G
重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg
價值 1040 3050 3540 30$
目標函數:∑pi最大
約束條件是裝入的物品總重量不超過揹包容量:∑wi<=M(M=150)

題目分析:

目標函數:∑pi最大
約束條件是裝入的物品總重量不超過揹包容量:∑wi<=M(M=150)
⑴根據貪心的策略,每次挑選價值最大的物品裝入揹包,得到的結果是否最優?
⑵每次挑選所佔重量最小的物品裝入是否能得到最優解?
⑶每次選取單位重量價值最大的物品,成爲解本題的策略。
值得注意的是,貪心算法並不是完全不可以使用,貪心策略一旦經過證明成立後,它就是一種高效的算法。
貪心算法還是很常見的算法之一,這是由於它簡單易行,構造貪心策略不是很困難。
可惜的是,它需要證明後才能真正運用到題目的算法中。
一般來說,貪心算法的證明圍繞着:整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。
對於例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下:
⑴貪心策略:選取價值最大者。
反例:
W=30
物品:A B C
重量:28 12 12
價值:30 20 20
根據策略,首先選取物品A,接下來就無法再選取了,可是,選取B、C則更好。
⑵貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。
⑶貪心策略:選取單位重量價值最大的物品。
反例:
W=30
物品:A B C
重量:28 20 10
價值:28 20 10
根據策略,三種物品單位重量價值一樣,程序無法依據現有策略作出判斷,如果選擇A,則答案錯誤。
【注意:如果物品可以分割爲任意大小,那麼策略3可得最優解】
對於選取單位重量價值最大的物品這個策略,可以再加一條優化的規則:對於單位重量價值一樣的,則優先選擇重量小的!這樣,上面的反例就解決了。
但是,如果題目是如下所示,這個策略就也不行了。
W=40
物品:A B C
重量:25 20 15
價值:25 20 15
附:本題是個DP問題,用貪心法並不一定可以求得最優解,以後瞭解了動態規劃算法後本題就有了新的解法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章