常用算法之貪心算法

貪心算法是指在對問題求解時,總是做出在當前看來是最好的選擇。即,不從整體最優上加以考慮,它所做出的僅是在某種意義上的局部最優解。貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。

常用算法之貪心算法

貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。所以對所採用的貪心策略一定要仔細分析其是否滿足無後效性。

常用算法之貪心算法

基本思路:

1、建立數學模型來描述問題。

2、把求解的問題分成若干個子問題。

3、對每一子問題求解,得到子問題的局部最優解。

4、把子問題的解局部最優解合成原來解問題的一個解。

常用算法之貪心算法

適用的問題

貪心策略適用的前提是:局部最優策略能導致產生全局最優解。實際上,貪心算法適用的情況很少。對一個問題分析是否適用於貪心算法,可以先選擇該問題下的幾個實際數據進行分析,就可做出判斷。

常用算法之貪心算法

實現框架

從問題的某一初始解出發,

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)每次選取單位重量價值最大的物品,成為解本題的策略。

常用算法之貪心算法

對於例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下:

(1)貪心策略:選取價值最大者。反例:

W=30

物品:A B C

重量:28 12 12

價值:30 20 20

根據策略,首先選取物品A,接下來就無法再選取了,可是,選取B、C則更好。

(2)貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。

(3)貪心策略:選取單位重量價值最大的物品。

常用算法之貪心算法

根據策略,三種物品單位重量價值一樣,程序無法依據現有策略作出判斷,如果選擇A,則答案錯誤。

貪心算法並不是完全不可以使用,貪心策略一旦經過證明成立後,它就是一種高效的算法。上面實例試用貪心算法求解,貪心解的確不錯,可惜不是最優解。

常用算法之貪心算法


分享到:


相關文章: