當前位置:編程學習大全網 - 源碼下載 - 請問數錢的貪婪算法怎樣確保得到最優解?

請問數錢的貪婪算法怎樣確保得到最優解?

貪婪算法:總是作出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅是在某種意義上的局部最優解。

(註:貪婪算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題它能產生整體最優解。但其解必然是最優解的很好近似解。

基本思路:——從問題的某壹個初始解出發逐步逼近給定的目標,以盡可能快的地求得更好的解。當達到某算法中的某壹步不能再繼續前進時,算法停止

實現該算法的過程:

從問題的某壹初始解出發;

while 能朝給定總目標前進壹步 do

求出可行解的壹個解元素;

由所有解元素組合成問題的壹個可行解;

基本要素:

1、 貪婪選擇性質:所求問題的整體最優解可以通過壹系列局部最優的選擇,即貪婪選擇來達到。(與動態規劃的主要區別)

采用自頂向下,以叠代的方式作出相繼的貪婪選擇,每作壹次貪婪選擇就將所求問題簡化為壹個規模更小的子問題。

對於壹個具體問題,要確定它是否具有貪婪選擇的性質,我們必須證明每壹步所作的貪婪選擇最終導致問題的最優解。通常可以首先證明問題的壹個整體最優解,是從貪婪選擇開始的,而且作了貪婪選擇後,原問題簡化為壹個規模更小的類似子問題。然後,用數學歸納法證明,通過每壹步作貪婪選擇,最終可得到問題的壹個整體最優解。

2、最優子結構性質:包含子問題的最優解

1、 設有n個活動的安排,其中每個活動都要求使用同壹資源,如演講會場,而在同壹時間只允許壹個活動使用這壹資源。每個活動都有使用的起始時間和結束時間。問:如何安排可以使這間會場的使用率最高。

活動 起始時間 結束時間

1 1 4

2 3 5

3 0 6

4 5 7

5 3 8

6 5 9

7 6 10

8 8 11

9 8 12

10 2 13

11 12 14

算法:壹開始選擇活動1,然後依次檢查活動壹i是否與當前已選擇的所有活動相容,若相容則活動加入到已選擇的活動集合中,否則不選擇活動i,而繼續檢查下壹活動的相容性。即:活動i的開始時間不早於最近加入的活動j的結束時間。

Prodedure plan;

Begin

n:=length[e];

a {1};

j:=1;

for i:=2 to n do

if s[i]>=f[j] then

begin a a∪{i};

j:=i;

end

end;

例1 [找零錢] 壹個小孩買了價值少於1美元的糖,並將1美元的錢交給售貨員。售貨員希望用數目最少的硬幣找給小孩。假設提供了數目不限的面值為2 5美分、1 0美分、5美分、及1美分的硬幣。售貨員分步驟組成要找的零錢數,每次加入壹個硬幣。選擇硬幣時所采用的貪婪準則如下:每壹次選擇應使零錢數盡量增大。為保證解法的可行性(即:所給的零錢等於要找的零錢數),所選擇的硬幣不應使零錢總數超過最終所需的數目。

假設需要找給小孩6 7美分,首先入選的是兩枚2 5美分的硬幣,第三枚入選的不能是2 5美分的硬幣,否則硬幣的選擇將不可行(零錢總數超過6 7美分),第三枚應選擇1 0美分的硬幣,然後是5美分的,最後加入兩個1美分的硬幣。

貪婪算法有種直覺的傾向,在找零錢時,直覺告訴我們應使找出的硬幣數目最少(至少是接近最少的數目)。可以證明采用上述貪婪算法找零錢時所用的硬幣數目的確最少(見練習1)。

  • 上一篇:按事務處理源代碼列出的事務處理
  • 下一篇:Qq性別源代碼
  • copyright 2024編程學習大全網