動態規劃的思考(三)

2021-07-15 08:23:59 字數 2302 閱讀 9170

from [

sicp 第一章 1.2.2 樹形遞迴中,有這麼一問題:給了半美元,四分之一美元,10美分,5美分和1美分的硬幣,將1美元換成零錢,一共有多少種不同方式?更一般的問題是,給定了任意數量的現金,我們能寫乙個程式,計算出所有換零錢方式的種數嗎?

動態規劃(dynamic programming,dp),是研究一類最優化問題的方法,通過把原問題分解為相對簡單的子問題的方式求解複雜問題。動態規劃處理的也就是是多階段決策最優化問題,這一類問題可將過程分成若干個互相聯絡的階段,在每一階段都作出決策,從而使整個過程達到最好的結果。因此各個階段決策的選取不能任意確定,它依賴於當前面臨的狀態,又影響以後的發展。當各個階段決策確定後,就組成乙個決策序列,從而也就確定了整個過程的一條活動路線。這種把乙個問題看做是乙個前後關聯具有鏈狀結構的多階段過程稱為多階段決策過程。動態規劃著名的應用例項有:求解最短路徑問題,揹包問題,專案管理,網路流優化等。動態規劃的基本模型如下:

確定問題的決策物件

對決策過程劃分階段

對各階段確定狀態變數

根據狀態變數確定費用函式和目標函式

建立各階段狀態變數的轉移過程,確定狀態轉移方程

作為整個過程的最優策略具有如下性質:無論過去的狀態和決策如何,對前面的決策所形成的當前狀態而言,餘下的諸決策必須構成最優策略。

通俗理解就是子問題的區域性最優將導致整個問題的全域性最優,即問題具有最優子結構的性質,也就是說乙個問題的最優解只取決於其子問題的最優解,非最優解對問題的求解沒有影響。

所謂無後效性原則,指的是這樣一種性質:某階段的狀態一旦確定,則此後過程的演變不再受此前各狀態及決策的影響。也就是說,「未來與過去無關」,當前的狀態是此前歷史的乙個完整總結,此前的歷史只能通過當前的狀態去影響過程未來的演變。

具體地說,如果乙個問題被劃分各個階段之後,階段 i 中的狀態只能由階段 i+1 中的狀態通過狀態轉移方程得來,與其他狀態沒有關係,特別是與未發生的狀態沒有關係,這就是無後效性。從圖論的角度去考慮,如果把這個問題中的狀態定義成圖中的頂點,兩個狀態之間的轉移定義為邊,轉移過程中的權值增量定義為邊的權值,則構成乙個有向無環加權圖,因此,這個圖可以進行「拓撲排序」,至少可以按他們拓撲排序的順序去劃分階段。

一般由初始狀態開始,通過對中間階段決策的選擇,達到結束狀態。這些決策形成了乙個決策序列,同時確定了完成整個過程的一條活動路線。步驟為:

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

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

確定決策並寫出狀態轉移方程:因為決策和狀態轉移有著天然的聯絡,狀態轉移就是根據上一階段的狀態和決策來匯出本階段的狀態。所以如果確定了決策,狀態轉移方程也就可寫出。但事實上常常是反過來做,根據相鄰兩段各狀態之間的關係來確定決策。

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

程式設計實現:動態規劃的主要難點在於理論上的設計,一旦設計完成,實現部分就會非常簡單。

逆向思維法是指從問題目標狀態出發倒推回初始狀態或邊界狀態的思維方法。

如果原問題可以分解成幾個本質相同、規模較小的問題,很自然就會聯想到從逆向思維的角度尋求問題的解決。動態規劃與分治法最大的不同在於分解出來的各個子問題的性質不同:

動態規劃的逆向推導步驟:

分析最優值的結構,刻畫其結構特徵;

遞迴地定義最優值;

按自底向上或自頂向下記憶化的方式計算最優值;

正向思維法是指從初始狀態或邊界狀態出發,利用某種規則不斷到達新的狀態,直到問題目標狀態的方法。動態規劃的正向思維法,正是從已知最優值的初始狀態或邊界狀態開始,按照一定的次序遍歷整個狀態空間,遞推出每個狀態所對應問題的最優值。

在正向思維法中,不再區分原問題和子問題,將動態規劃的過程看成是從狀態到狀態的轉移。將所有的狀態構造出乙個狀態空間,並在狀態空間中設想乙個狀態網路,若對兩個狀態i,j,存在決策變數di使t(i,di)=j,則向狀態網路新增有向邊。給定己知最優值的初始狀態或邊界狀態,可以沿著有向邊推廣到未知最優值的新狀態,利用狀態轉移方程得到新狀態的狀態變數的最優值。我們可以用這種方式遍歷整個狀態空間,得到每個狀態的狀態變數的最優值。

動態規劃的正向推導步驟:

構造狀態網路;

根據狀態轉移關係和狀態轉移方程建立最優值的遞推計算式:

按階段的先後次序計算每個狀態的最優值;

動態規劃需要按階段遍歷整個狀態空間,因此動態規劃的效率取決於狀態空間的大小和計算每個狀態最優值的開銷:如果狀態空間的大小是多項式的,那麼應用動態規劃的演算法就是多項式時間的;如果狀態空間的大小是指數的,那麼應用動態規劃的演算法也是指數時間的。因此,找乙個好的狀態劃分對動態規劃的效率是至關重要的。

動態規劃 思考解決動態規劃問題

關於動態規劃,過了一段時間,自己給自己做乙個小結.給你一道題目 題目題意 乙個n n的方格.從 1,1 進去,從 n,n 出 每乙個交叉點都有花生,每次只能是向下或者向右走。讓你找出走過路線中能踩到的花生的數量最多是多少?給出的資料分析 驗證正確 思考 傳統思考方式 要思考這個幾個東西,但自己總覺得...

dp(動態規劃)思考

dp的核心思想是分治策略和表儲存。分治策略並非dp所獨有,很多演算法都運用了把問題拆解為子問題的做法,比如遞迴。表儲存應該是dp比較獨有的一種方式,通過儲存一些中間結果,可以避免重複計算,從而提公升程式執行的速度。def max length s1,s2 最大公共子串,用dp求解 max len,m...

動態規劃(三)

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例1 輸入 1,...