4、貪心算法的實現框架
從問題的某一初始解出發;
while (能朝給定總目標前進一步)
{
利用可行的決策,求出可行解的一個解元素;
}
由全部解元素組合成問題的一個可行解;
5、貪心策略的選擇
由於用貪心算法只能經過解局部最優解的策略來達到全局最優解,所以,必定要注意判斷問題是否適合採用貪心算法策略,找到的解是否必定是問題的最優解。
6、例題分析
下面是一個能夠試用貪心算法解的題目,貪心解的確不錯,惋惜不是最優解。
[揹包問題]有一個揹包,揹包容量是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)每次選取單位重量價值最大的物品,成爲解本題的策略。
值得注意的是,貪心算法並非徹底不可使用,貪心策略一旦通過證實成立後,它就是一種高效的算法。
貪心算法仍是很常見的算法之一,這是因爲它簡單易行,構造貪心策略不是很困難。
惋惜的是,它須要證實後才能真正運用到題目的算法中。
通常來講,貪心算法的證實圍繞着:整個問題的最優解必定由在貪心策略中存在的子問題的最優解得來的。
對於例題中的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,則答案錯誤。