動態規劃(dynamic programming)(二、最優子問題與重疊子問題,以及與貪心的區別)
一、動態規劃基礎
雖然我們在(一)中討論過動態規劃的裝配線問題,但是究竟什麽時候使用動態規劃?那麽我們就要清楚動態規劃方法的最優化問題中的兩個要素:最優子結構和重疊子問題。
1、最優子結構
1)如果問題的一個最優解包含了子問題的最優解,則該問題具有最優子結構。當一個問題具有最優子結構的時候,我們就可能要用到動態規劃(貪心策略也是有可能適用的)。
2)尋找最優子結構時,可以遵循一種共同的模式:
a、問題的一個解可以是一個選擇。例如,裝配站選擇問題。
b、假設對一個給定的問題,已知的是一個可以導致最優解的選擇。不必關心如何確定這個選擇,假定他是已知的。
c、在已知這個選擇之後,要確定那些子問題會隨之發生,以及如何最好的描述所的得到的子問題空間。
d、利用一種“剪貼”技術,來證明在問題的一個最優解中,使用的子問題的解本身也必須是最優的。
3)最優子結構在問題域中以兩種方式變化:
a、有多少個子問題被使用在原問題的一個最優解中,以及
b、再決定一個最優解中使用那些子問題時有多少個選擇
在裝配線調度問題中,一個最優解只使用了一個子問題,但是,為確定一個最優解,我們必須考慮兩種選擇。
4)動態規劃與貪心算法的區別
動態規劃以自底向上的方式來利用最優子結構。也就是說,首先找到子問題的最優解,解決的子問題,然後找到問題的一個最優解。尋找問題的一個最優解需要首先在子問題中做出選擇,即選擇用哪一個來求解問題。問題解的代價通常是子問題的代價加上選擇本身帶來的開銷。
在貪心算法中是以自頂向下的方式使用最優子結構。貪心算法會先做選怎,在當時看來是最優的選擇,然後在求解一個結果子問題,而不是現尋找子問題的最優解,然後再做選擇。
2、重疊子問題
適用於動態規劃求解的最優化問題必須具有的第二個要素是子問題的空間要“很小”,也就是用來解原問題的遞歸算法可以反復的解同樣的子問題,而不是總在產生新的子問題。典型的,不頭痛的子問題數十輸入規模的一個多項式,當一個遞歸算法不斷的調用同一問題是,我們說該最優問題包含重疊子問題。
動態規劃算法總是充分利用重疊子問題,即通過每個子問題只解一次,吧解保存在一個需要時就可以查看的表中,而每一次查表得時間為常數。
動態規劃(dynamic programming)(二、最優子問題與重疊子問題,以及與貪心的區別)