1. 程式人生 > >貪心演算法 AND 動態規劃

貪心演算法 AND 動態規劃

貪心演算法

  • 貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心選擇是採用從頂向下、以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問題簡化為一個規模更小的子問題。
  • 對於一個具體問題,要確定它是否具有貪心選擇的性質,我們必須證明每一步所作的貪心選擇最終能得到問題的最優解。通常可以首先證明問題的一個整體最優解,是從貪心選擇開始的,而且作了貪心選擇後,原問題簡化為一個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步貪心選擇,最終可得到問題的一個整體最優解。
  • 當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。運用貪心策略在每一次轉化時都取得了最優解。最優子結構性質是該問題可用貪心演算法或動態規劃演算法求解的關鍵特徵
    。貪心演算法的每一次操作都對結果產生直接影響,而動態規劃則不是。貪心演算法對每個子問題的解決方案都做出選擇,不能回退;動態規劃則會根據以前的選擇結果對當前進行選擇,有回退功能。動態規劃主要運用於二維或三維問題,而貪心一般是一維問題

思路

貪心演算法的基本思路是從問題的某一個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。每一步只考慮一個數據,他的選取應該滿足區域性優化的條件。若下一個資料和部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增演算法停止。

演算法特性

  • 隨著演算法的進行,將積累起其它兩個集合:一個包含已經被考慮過並被選出的候選物件,另一個包含已經被考慮過但被丟棄的候選物件。
  • 有一個函式來檢查一個候選物件的集合是否提供了問題的解答。該函式不考慮此時的解決方法是否最優。
  • 還有一個函式檢查是否一個候選物件的集合是可行的,也即是否可能往該集合上新增更多的候選物件以獲得一個解。和上一個函式一樣,此時不考慮解決方法的最優性。
  • 選擇函式可以指出哪一個剩餘的候選物件最有希望構成問題的解。
  • 最後,目標函式給出解的值。
  • 為了解決問題,需要尋找一個構成解的候選物件集合,它可以優化目標函式,貪婪演算法一步一步的進行。起初,演算法選出的候選物件的集合為空。接下來的每一步中,根據選擇函式,演算法從剩餘候選物件中選出最有希望構成解的物件。如果集合中加上該物件後不可行,那麼該物件就被丟棄並不再考慮;否則就加到集合裡。每一次都擴充集合,並檢查該集合是否構成解。如果貪婪演算法正確工作,那麼找到的第一個解通常是最優的。

演算法例項

0-1揹包問題

有一個揹包,揹包容量是M=150kg。有7個物品,物品不可以分割成任意大小。要求儘可能讓裝入揹包中的物品總價值最大,但不能超過總容量。
物品 A B C D E F G
重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg
價值 10元 40元 30元 50元 35元 40元 30元

程式碼演示

。。。。。。。。。待續

動態規劃

  • 動態規劃演算法是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。
  • 動態規劃演算法的基本思想與分治法類似,也是將待求解的問題分解為若干個子問題(階段),按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題,最後一個子問題就是初始問題的解。

具有3個性質:

  • 最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。
  • 無後效性:即某階段狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。
  • 有重疊子問題:即子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。(該性質並不是動態規劃適用的必要條件,但是如果沒有這條性質,動態規劃演算法同其他演算法相比就不具備優勢)

演算法例項