動態規劃和記憶化搜索

原文鏈接 http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5847876

動態規劃和記憶化搜索:

動態規劃:就是一個最優化問題,先將問題分解爲子問題,並且對於這些分解的子問題自身就是最優的才能在這個基礎上得出我們要解決的問題的最優方案,要不然的話就能找到一個更優的解來替代這個解,得出新的最優自問題,這當然是和前提是矛盾的。動態規劃不同於 貪心算法,因爲貪心算法是從局部最優來解決問題,而動態規劃是全局最優的用動態規劃的時候不可能在子問題還沒有得到最優解的情況下就做出決策,而是必須等待子問題得到了最優解之後纔對當下的情況做出決策,所以往往動態規劃都可以用 一個或多個遞歸式來描述。而貪心算法卻是先做出一個決策,然後在去解決子問題。這就是貪心和動態規劃的不同。

一般遇到一個動態規劃類型的問題,都先要確定最優子結構,還有重疊子問題,這兩個是動態規劃最大的特徵,然後就是要寫 動態規劃的 狀態方程,這個步驟十分十分的重要的,寫動歸方程是需要一定的經驗的,這可以通過訓練來達到目的。接着就是要自底向上的求解問題的,先將最小規模的子問題的最優解求出,一般都用一張表來記錄下求得的解,到後來遇到同樣的子問題的時候就可以直接查表得到答案,最後就是通過一步一步的迭代得出最後問題的答案了。

我的理解最重要的東西就是一定會要一個數組或者其他的存儲結構存儲得到的子問題的解。這樣就可以省很多時間,也就是典型的空間換時間

動態規劃的一種變形就是記憶化搜索,就是根據動歸方程寫出遞歸式,然後在函數的開頭直接返回以前計算過的結果,當然這樣做也需要一個存儲結構記下前面計算過的結果,所以又稱爲記憶化搜索。

記憶化搜索/遞歸式動態規劃:

1.記憶化搜索的思想

    記憶化搜索的思想是,在搜索過程中,會有很多重複計算,如果我們能記錄一些狀態的答案,就可以減少重複搜索量

2、記憶化搜索的適用範圍

    根據記憶化搜索的思想,它是解決重複計算,而不是重複生成,也就是說,這些搜索必須是在搜索擴展路徑的過程中分步計算的題目,也就是“搜索答案與路徑相關”的題目,而不能是搜索一個路徑之後才能進行計算的題目,必須要分步計算,並且搜索過程中,一個搜索結果必須可以建立在同類型問題的結果上,也就是類似於動態規劃解決的那種。

也就是說,他的問題表達,不是單純生成一個走步方案,而是生成一個走步方案的代價等,而且每走一步,在搜索樹/圖中生成一個新狀態,都可以精確計算出到此爲止的費用,也就是,可以分步計算,這樣纔可以套用已經得到的答案

3、記憶化搜索的核心實現

     a. 首先,要通過一個表記錄已經存儲下的搜索結果,一般用哈希表實現

     b.狀態表示,由於是要用哈希表實現,所以狀態最好可以用數字表示,常用的方法是把一個狀態連寫成一個p進制數字,然後把這個數字對應的十進制數字作爲狀態

    c.在每一狀態搜索的開始,高效的使用哈希表搜索這個狀態是否出現過,如果已經做過,直接調用答案,回溯

    d.如果沒有,則按正常方法搜索

4、記憶化搜索是類似於動態規劃的,不同的是,它是倒做的“遞歸式動態規劃”。

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