一、基本概念
所謂貪心算法是指,在對問題求解時,總是 做出在當前來看是最好的選擇。也就是說,不從整體最優上加以考慮,通過貪心算法做出來的往往是在把 原問題拆分成幾個小問題,分別求 每個小問題的最優解,再把這些“局部最優解”疊起來,就作為整個問題 當前 的最優解。
貪心算法無固定的算法框架,算法設計的關鍵是貪心策略的選擇,必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇貪心策略必須具備 無后效性(即某個狀態以后的過程不會影響以前的狀態,只與當前狀態有關)。
比如,求 最小生成樹的Prim算法 和 Kruskal算法 都是漂亮的貪心算法。
二、基本思路
- 建立 數學模型 來描述問題;
- 把求解的問題分成 若干個子問題;
- 對每個子問題求解,得到 子問題的局部最優解;
- 把子問題的局部最優解 合成 原來問題的一個解。
三、存在的問題
- 不能保證求得的最后解是最佳的;
- 不能用來 求最值 的問題;
- 只能求 滿足某些約束條件 的可行解的范圍。
四、例題分析
【背包問題】有一個背包,容量是M=150,有7個物品,物品可以分割成任意大小。要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。
物品:A B C D E F G
重量:35 30 60 50 40 10 25
價值:10 40 30 50 35 40 30
題目分析:為了使背包總價值最大,我們可以制定三種策略:
- 每次挑選價值最大的物品裝入背包;
- 每次挑選重量最小的物品裝入背包;
- 每次挑選單位重量價值最大的物品裝入背包;
策略 1 結果:選擇 D B F E 總重量 130 總價值 165;
策略 2 結果:選擇 F G B A E 總重量 140 總價值 155;
策略 3 結果:選擇 F B G D A 總重量 150 總價值 170;
結果分析:可以看到單位重量價值最大的策略 的結果比其它更好。
總結:由此可見,策略制定的不同,得到的解也會不同,我們只需要針對不同的問題制定不同的策略即可。
五、算法的使用前提
- 原問題復雜度過高;
- 求全局最優解的數學模型難以建立;
- 求全局最優解的計算量過大;
- 沒有太大必要一定要求出全局最優解,“比較優”就可以。
六、分解問題方式
- 按串行任務分
時間串行的任務,按子任務來分解,即每一步都是在前一步的基礎上再選擇當前的最優解。
- 按規模遞減分
規模較大的復雜問題,可以借助遞歸思想,分解成一個規模小一點點的問題,循環解決,當最后一步的求解完成后就得到了所謂的“全局最優解”。
- 按並行任務分
這種問題的任務不分先后,可能是並行的,可以分別求解后,再按一定的規則(比如某種配比公式)將其組合后得到最終解。