SICP 第一章 1.2.2 樹形遞歸中,有這麼一問題:給了半美圓,四分之中的一個美圓。10美分,5美分和1美分的硬幣。將1美圓換成零錢,一共同擁有多少種不一樣方式?更通常的問題是,給定了隨意數量的現金,咱們能寫一個程序,計算出所有換零錢方式的種數嗎?python
所以各個階段決策的選取不能隨意肯定,它依賴於當前面臨的狀態。又影響之後的發展。當各個階段決策肯定後,就組成一個決策序列,從而也就肯定了整個過程的一條活動路線。這樣的把一個問題看作是一個先後關聯具備鏈狀結構的多階段過程稱爲多階段決策過程。算法
動態規劃著名的應用實例有:求解最短路徑問題,揹包問題,項目管理,網絡流優化等。動態規劃的基本模型例如如下:
網絡
通俗理解就是子問題的局部最優將致使整個問題的全局最優,即問題具備最優子結構的性質,也就是說一個問題的最優解僅僅取決於其子問題的最優解,非最優解對問題的求解沒有影響。函數
詳細地說,假設一個問題被劃分各個階段以後,階段 I 中的狀態僅僅能由階段 I+1 中的狀態經過狀態轉移方程得來,與其它狀態沒有關係,特別是與未發生的狀態沒有關係,這就是無後效性。從圖論的角度去考慮。假設把這個問題中的狀態定義成圖中的頂點,兩個狀態之間的轉移定義爲邊,轉移過程當中的權值增量定義爲邊的權值,則構成一個有向無環加權圖,所以,這個圖可以進行「拓撲排序」,至少可以按他們拓撲排序的順序去劃分階段。優化
因此假設肯定了決策,狀態轉移方程也就可寫出。但其實常常是反過來作。依據相鄰兩段各狀態之間的關係來肯定決策。this
動態規劃的正向思惟法。正是從已知最優值的初始狀態或邊界狀態開始,依照必定的次序遍歷整個狀態空間,遞推出每個狀態所相應問題的最優值。spa
在正向思惟法中。再也不區分原問題和子問題,將動態規劃的過程當作是從狀態到狀態的轉移。將所有的狀態構造出一個狀態空間,並在狀態空間中設想一個狀態網絡。若對兩個狀態i,j,存在決策變量di使t(i,di)=j。則向狀態網絡加入有向邊。.net
給定己知最優值的初始狀態或邊界狀態,可以沿著有向邊推廣到未知最優值的新狀態。利用狀態轉移方程獲得新狀態的狀態變量的最優值。設計
咱們可以用這樣的方式遍歷整個狀態空間,獲得每個狀態的狀態變量的最優值。
動態規劃的正向推導步驟:
code
動態規劃需要按階段遍歷整個狀態空間。所以動態規劃的效率取決於狀態空間的大小和計算每個狀態最優值的開銷:假設狀態空間的大小是多項式的,那麼應用動態規劃的算法就是多項式時間的;假設狀態空間的大小是指數的,那麼應用動態規劃的算法也是指數時間的。所以,找一個好的狀態劃分對動態規劃的效率是相當重要的。
還可以正向推導。打表記錄已經計算出的值。
Python實現
NUM = 0 def count_change(amount, money, kinds): ''' 樹形遞歸存在冗餘''' global NUM if amount == 0: NUM+=1 return 1 if amount < 0 or kinds == 0: NUM+=1 return 0 NUM+=1 return count_change(amount, money, kinds - 1) + count_change(amount - money[kinds - 1], money, kinds) def count_dy(amount,money,kinds): '''動態規劃,打表記錄已經計算的值''' table = [[0 for col in range(kinds)] for row in range(amount+1)] table[0] = [1]*kinds for i in range(1,amount+1): for j in range(kinds): # 包括 money[j] x = table[i - money[j]][j] if i-money[j] >= 0 else 0 # 不包括 money[j] y = table[i][j-1] if j>=1 else 0 table[i][j] = x+y return table[amount][kinds-1] if __name__ == '__main__': money = [1, 5, 10, 25, 50] print(count_change(100, money, len(money)),'time:',NUM) print(count_dy(100, money, len(money)),'time:',100*len(money)) ''' 292 time: 15499 292 time: 500 '''
SICP中的Scheme實現(Racket)
【地址:http://blog.csdn.net/thisinnocence/article/details/41073275】