[轉]: 五大基本算法——動態規劃算法

每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策的序列就是就是在變化的狀態中產生出來的。

所以,這種多階段最優化決策解決問題的過程叫動態規劃。

一、算法思想

在思想上與分治法類似,將待求解問題分爲若干個子問題,按順序求解子階段,前一子問題的解爲後一子問題的求解提供了有用的休息。求解任一子問題時,可以列出各種可能的局部解,通過決策保留那些有可能達到最優的局部解,丟其捨棄其它局部解。依次解決各子問題。最後一個問題就是初始問題的解。

動態規劃解決問題多數有重疊子問題這個特點,爲減少重複計算,對每一個子問題只解一次,將其不同階段的不同狀態保存在一個二維數組中。

與分治法最大的差異是:適合於動態規劃法求解的問題,經分解後問題往往不是相互獨立的。

二、基本要素

1、最優子結構性質

大問題的最優解包含了小問題的最優解,小問題的最優解又可以合併成大問題的最優解。

一個最優化策略的子策略總是最優的,一個問題滿足最優化原理又稱其具有最優子結構性質。

2、重疊子問題性質

含有多個子問題,並且算法過程中會多次使用,這時動態規劃法提供了查動態規劃表的方法來簡化流程,使重疊的子問題不會重複計算。

子問題之間不獨立,一個子問題在下一個階段決策中可能被多次使用。

3、無後效性

無後效性:上一階段的解決方案一旦確定,狀態就確定,只會影響下一步,而不會反向影響。

某一階段狀態一旦確定,就不會受此狀態之後的決策影響。

二、基本步驟

處理的是一個多階段決策問題,一般是由初始狀態開始,對中間階段決策的選擇,達到結束時,這些決策形成了一個決策序列,同時確定了完成整個過程的一條活動路線。

1、劃分階段:按照問題的時間或空間特徵,把問題分爲若干個階段。在劃分階段時,注意劃分後的階段一定是要有序的或者是可排序的。否則問題就無法求解。

2、確定狀態和狀態變量:將問題發展到各個階段時所處於的客觀情況用不同的狀態表示出來,當然狀態的選擇要滿足無後效性。

3、確定決策並寫出狀態轉移方程:因爲決策和狀態轉移有着天然的聯繫,狀態轉移就是根據上一階段的狀態和決策來導出本階段的狀態。所以如果確定了決策,狀態轉移方程也就可以寫出。但一般是根據前後的兩個階段的狀態之間的關係來確定決策方法和狀態轉移方程的。

4、尋找邊界條件:狀態轉移方程是一個遞推式,需要一個遞推的終止條件或邊界條件。

三、動態規劃法與分治法的區別

1、動態規劃法經分解得到的子問題往往不是互相獨立的,而分治法必須要求子問題獨立。
2、分治法可能會多次計算同一子問題,而動態規劃法利用查動態規劃表,保存已經計算過的子問題解,避免了重複計算。

四、動態規劃法與貪心算法的區別

貪心算法性質:每一步選擇都採取當前狀態下最優的選擇,而不着眼於全局最優。

動態規劃法(最優子結構+重疊子問題)——>自底向上
每一步的最優解由上一步的局部最優解進行選擇得出,因此需要保存之前求解的所有子問題的最優解備查。

貪心算法(最優子結構+貪心選擇性質)——>自頂向下
每一步的最優解由上一步的最優解推導而得,當前最優解包含上一步的最優解,但之前的最優解不做保留。因此,在貪心算法中,做出的每一步決策都無法改變

相同點:兩者都具有最優子結構性質(每一步的選擇都將當前問題簡化爲一個規模更小的與原問題相同形式的子問題)

不同點:動態規劃算法每步往往依賴於相關子問題的解,因而只有在解出相關子問題的解後才能做出選擇。而貪心算法只着眼於當前狀態的最優解,即局部最優選擇,然後再去解出這個選擇後的狀態的相應的子問題。(自底向上與自頂向下)

區別兩者的經典例子:0/1揹包問題與揹包問題

0/1揹包問題需採用動態規劃算法達到最優解。
揹包問題採用貪心算法可求解。

對於0/1揹包問題,不能用貪心算法求解,爲什麼?

因爲對該問題用貪心選擇策略求解無法保證最後揹包被裝滿,閒置的揹包空間會影響每公斤揹包的價值,進而影響整體求解的最大價值。

0/1揹包問題應比較:選擇與不選擇兩種方案的哪種更優,然後再進行下一步選擇,這樣會形成多個重疊子問題,須用動態規劃中的動態規劃表進行存儲。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章