所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。
貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
貪心演算法的基本思路如下:
1.建立數學模型來描述問題。
2.把求解的問題分成若干個子問題。
3.對每一子問題求解,得到子問題的區域性最優解。
4.把子問題的解區域性最優解合成原來解問題的乙個解。
實現該演算法的過程:
從問題的某一初始解出發;
while 能朝給定總目標前進一步 do
求出可行解的乙個解元素;
由所有解元素組合成問題的乙個可行解;
下面是乙個可以試用貪心演算法解的題目,貪心解的確不錯,可惜不是最優解。
例題分析
[揹包問題]有乙個揹包,揹包容量是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,則答案錯誤。
演算法設計與分析 貪心演算法
time limit 1000 ms memory limit 65536 kib problem description 一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生乙個最優解。對於給定的n和k個加油站位...
演算法設計與分析 貪心演算法
分解 將原問題求解過程劃分為連續的若干個決策階段 決策 在每乙個階段依據貪心策略進行貪心決策,得到區域性的最優解,並縮小待求解問題的規模 合併 將各個階段的區域性解合併為原問題的乙個全域性最優解 greedy c c是問題的輸入集合即候選集合 初始解集合為空集 while not solution ...
演算法設計與分析9 貪心演算法
木棒加工問題 現有n根木棒,已知它們的長度和重量。要用一部木工機一根一根地加工這些木棒。該機器在加工過程中需要一定的準備時間,是用於清洗機器,調整工具和模版的。木工機需要的準備時間如下 1 第一根木棒需要1min的準備時間 2 在加工了一根長為l 重為w的木棒之後,接著加工一根長為l l l 重為 ...