所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解。
貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性(即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。)
貪心策略適用的前提是:區域性最優策略能導致產生全域性最優解。
實際上,貪心演算法適用的情況很少。一般對乙個問題分析是否適用於貪心演算法,可以先選擇該問題下的幾個實際資料進行分析,就可以做出判斷。
從問題的某一初始解出發:
while (朝給定總目標前進一步)
由所有解元素組合成問題的乙個可行解;
【揹包問題】有乙個揹包,容量是m=150,有7個物品,物品可以分割成任意大小。要求盡可能讓裝入揹包中的物品總價值最大,但不能超過總容量。
物品:a b c d e f g
重量:35 30 60 50 40 10 25
價值:10 40 30 50 35 40 30
分析:目標函式: ∑pi最大
約束條件是裝入的物品總質量不超過揹包容量:∑wi<=m( m=150)
(1)根據貪心的策略,每次挑選價值最大的物品裝入揹包,得到的結果是否最優?
(2)每次挑選所佔重量最小的物品裝入是否能得到最優解?
(3)每次選取單位重量價值最大的物品,成為解本題的策略
值得注意的是,貪心演算法並不是完全不可以使用,貪心策略一旦經過證明成立後,它就是一種高效的演算法。比如,求最小生成樹的prim演算法和kruskal演算法都是漂亮的貪心演算法。
貪心演算法還是很常見的演算法之一,這是由於它簡單易行,構造貪心策略不是很困難。
可惜的是,它需要證明後才能真正運用到題目的演算法中。
一般來說,貪心演算法的證明圍繞著:整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。
對於例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下:
(1)貪心策略:選取價值最大者。反例:
w=30
物品:a b c
重量:28 12 12
價值:30 20 20
根據策略,首先選取物品a,接下來就無法再選取了,可是,選取b、c則更好。
(2)貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。
(3)貪心策略:選取單位重量價值最大的物品。反例:
w=30
物品:a b c
重量:28 20 10
價值:28 20 10
根據策略,三種物品單位重量價值一樣,程式無法依據現有策略作出判斷,如果選擇a,則答案錯誤。但是果在條件中加一句當遇見單位價值相同的時候,優先裝重量小的,這樣的問題就可以解決.
所以需要說明的是,貪心演算法可以與隨機化演算法一起使用,具體的例子就不再多舉了。(因為這一類演算法普及性不高,而且技術含量是非常高的,需要通過一些反例確定隨機的物件是什麼,隨機程度如何,但也是不能保證完全正確,只能是極大的機率正確)。
貪心演算法例4
有1元 5元 10元 50元 100元 500元的硬幣無窮多枚,現在用這些硬幣支付s元,最少需要多少枚硬幣 例 輸入 763輸出 需要500元硬幣1枚 需要100元硬幣2枚 需要50元硬幣1枚 需要10元硬幣1枚 需要1元硬幣3枚 include include intmain int argc,c...
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...
演算法 貪心演算法
把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...