演算法 貪心演算法

2021-06-19 01:57:57 字數 2190 閱讀 2826

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域性最優。貪心演算法對於大部分的優化問題都能產生最優解,但不能總獲得整體最優解,通常可以獲得近似最優解。

乙個小孩買了價值少於

1美元的糖,並將

1美元的錢交給售貨員。售貨員希望用數目最少的硬幣找給小孩。假設提供了數目不限的面值為

2 5美分、

1 0美分、

5美分、及

1美分的硬幣。售貨員分步驟組成要找的零錢數,每次加入乙個硬幣。選擇硬幣時所採用的貪婪準則如下:每一次選擇應使零錢數盡量增大。為保證解法的可行性(即:所給的零錢等於要找的零錢數),所選擇的硬幣不應使零錢總數超過最終所需的數目

為使找回的零錢的硬幣數最小,不考慮找零錢的所有各種方案,而是從最大面值的幣種開始,按遞減的順序考慮各幣種,先盡量用大面值的幣種,只當不足大面值幣種的金額才會去考慮下一種較小面值的幣種。這就是在採用貪婪法。這種方法在這裡之所以總是最優,是因為銀行對其發行的硬幣種類和硬幣面值的巧妙安排。如果只有面值分別為1,

5和11單位的硬幣,而希望找回總額為

15單位的硬幣,按貪婪演算法,應找1個

11單位面值的硬幣和4個

1單位面值的硬幣,共找回

5個硬幣。但最優的解答應是3個

5單位面值的硬幣。

用貪心法求解問題應該考慮如下幾個方面: (

1)候選集合

c:為了構造問題的解決方案,有乙個候選集合

c作為問題的可能解,即問題的最終解均取自於候選集合

c。例如,在付款問題中,各種面值的貨幣構成候選集合。 (

2)解集合

s:隨著貪心選擇的進行,解集合

s不斷擴充套件,直到構成乙個滿足問題的完整解。例如,在付款問題中,已付出的貨幣構成解集合。 (

3)解決函式

solution

:檢查解集合

s是否構成問題的完整解。例如,在付款問題中,解決函式是已付出的貨幣金額恰好等於應付款。 (

4)選擇函式

select

:即貪心策略,這是貪心法的關鍵,它指出哪個候選物件最有希望構成問題的解,選擇函式通常和目標函式有關。例如,在付款問題中,貪心策略就是在候選集合中選擇面值最大的貨幣。 (

5)可行函式

feasible

:檢查解集合中加入乙個候選物件是否可行,即解集合擴充套件後是否滿足約束條件。例如,在付款問題中,可行函式是每一步選擇的貨幣和已付出的貨幣相加不超過應付款。

greedy(c)  //c

是問題的輸入集合即候選集合

;  //

初始解集合為空集

while (not solution(s))  //集合s

沒有構成問題的乙個解 ;

c=c-;

}return s;

對於乙個具體的問題,怎麼知道是否可用貪心演算法解此問題,以及能否得到問題的最優解呢

?這個問題很難給予肯定的回答。

但是,從許多可以用貪心演算法求解的問題中看到這類問題一般具有

2個重要的性質:

貪心選擇性質

最優子結構性質

子問題:假設為了解決某一優化問題,需要依次作出

n個決策d1,

d2,…,

dn,對於任何乙個整數k,

1 < k< n

,以dk

作為問題的初始狀態,來進行以後的決策,這樣的問題就成為是原問題的乙個子問題。 所謂

貪心選擇性質是指所求問題的

整體最優解可以通過一系列

區域性最優的選擇,換句話說,當考慮做何種選擇的時候,我們只考慮對當前問題最佳的選擇而不考慮子問題的結果。這是貪心演算法可行的第乙個基本要素。

貪心演算法以迭代的方式作出相繼的貪心選擇,每作一次貪心選擇就將所求問題簡化為規模更小的子問題。

對於乙個具體問題,要確定它是否具有貪心選擇性質,必須證明每一步所作的貪心選擇最終導致問題的整體最優解。

當乙個問題的最優解包含其子問題的最優解時,稱此問題具有

最優子結構性質。問題的最優子結構性質是該問題可用貪心演算法求解的關鍵特徵。

演算法 貪心演算法

集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...

演算法 貪心演算法

貪心演算法,又稱貪婪演算法 greedy algorithm 是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優解出發來考慮,它所做出的僅是在某種意義上的區域性最優解。貪婪演算法是一種分階段的工作,在每乙個階段,可以認為所做決定是最好的,而不考慮將來的後果。這種 眼下能夠拿到...

演算法 貪心演算法

問題描述 解決思路 實現思路 實現 public class main2 else system.out.println activity n,programs public static intactivity int n,program programs swap programs,i,inde...