二次學習動態規劃

2021-08-21 09:15:25 字數 2002 閱讀 6607

最近在看一本經典的程式設計師書籍:《程式設計之美》,裡面有一道買書的演算法題,書中指導使用動態規劃去解決該問題,雖然一年前有那麼幾天看似深入的學習了一下動態規劃,但這次看完書上的解釋之後還是不太清楚如何寫**去解決買書問題,所以用文章的方式再次記錄一遍自己學習動態規劃與解決買書問題的過程。

動態規劃是通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法,前面這句解釋是從維基百科摘錄的,描述的相對簡單,全文還有更為詳細的解釋,有興趣的朋友可以看一下,不過看完後可能依舊雲裡霧裡。

但知乎上的這個回答感覺是講清了動態規劃的本質,即尋找狀態定義與狀態轉移方程,為了保證狀態轉移方程的正確性,可能需要嚴謹的證明過程,《程式設計之美》在買書問題上對動態規劃解法著重講解的就是狀態轉移方程的證明過程。

最長上公升子串行問題,算是動態規劃話題的中的典型問題,理解起來不算特別複雜,問題描述:

給定乙個數列,長度為n,求這個數列的最長上公升(遞增)子數列(lis)的長度

以[1, 7, 2, 8, 3, 4]為例,這個數列的最長遞增子數列是[1, 2, 3, 4],長度為4

針對動態規劃問題,最重要的就是狀態定義與狀態轉移方程:

給定乙個數列,長度為n

設fk為:以數列中第k項結尾的最長遞增子串行的長度

求f1..fn中的最大值

f1 = 1

fk = max(fi + 1 |ak > ai, i in (1..k-1))(k > 1)

如果看完上述狀態定義和轉移方程,依舊不理解如何解決問題,建議多看幾遍,多思考幾遍,然後你就通了。

狀態定義不必多說,就是用數學的方式重新描述了一遍問題,但我認為這一步是有一定難度的,沒有經驗的人通常被卡在這一步。

如果狀態定義不清楚,轉移方程也就無從談起,這兩個是動態規劃的核心,寫**跟這兩個相比,就只是砌磚而已…

狀態轉移方程決定了演算法核心邏輯,針對數列list:[1, 7, 2, 8, 3, 4],我們從f1 = 1開始一步步推演:

f(1) = 1,當前狀態:[1]

7 > 1 => f(2) = max(f(1)) + 1 = 2,當前狀態:[1, 2]

2 > 1 => f(3) = max(f(1)) + 1 = 2,當前狀態:[1, 2, 2]

8 > 1, 7, 2 => f(4) = max(f(1), f(2), f(3)) + 1 = 3,當前狀態:[1, 2, 2, 3]

3 > 1, 2 => f(5) = max(f(1), f(3)) + 1 = 3,當前狀態:[1, 2, 2, 3, 3]

4 > 1, 2, 3 => f(6) = max(f(1), f(3), f(5)) + 1 = 4,當前狀態:[1, 2, 2, 3, 3, 4]

最終max(1, 2, 2, 3, 4) = 4,即最大公升序子數列的長度。

function

maxlis

(nums)

// index之前且小於當前元素的列表

let target = nums.slice(0, index).filter(one => one[0] < item[0]);

let status = target.map(item => item[1]);

item[1] = math.max(...status) + 1;

});return

math.max(...(nums.map(item => item[1])));

}console.log(maxlis([1, 7, 2, 8, 3, 4, 2])); // 4

我還不夠深入理解,寫不出來…過兩天,深入的時候再來寫。

部落格原文

序列二次規劃 序列二次規劃法 pdf

序列二次規劃法 序列二次規劃演算法 1 序列二次規劃法簡介 非線性規劃問題是目標函式或約束條件中包含非線性函式的規劃問題。一般 說來,解非線性規劃要比解線性規劃問題困難得多。而且,也不像線性規劃有單 純形法這一通用方法,非線性規劃目前還沒有適於各種問題的一般演算法,各個方 法都有自己特定的適用範圍。...

數學建模 二次規劃

若該線性規劃的目標函式為自變數x的二次函式,約束條件全是線性的,則為二次規劃。在matlab中表達的二次規劃的數學模型如下 mi n12x hx f xs t.ax bae qx b eqlb x u b 其中,f和b是列向量,a是相應維數的矩陣,h實對稱矩陣。matlab中求解二次規劃的命令如下 ...

二次規劃演算法學習筆記

在人臉表情動畫的研究中,大部分工作都是通過採集每一時刻的面部運動資料,並求出該資料在表情基中的線性組合。而這個計算問題是乙個典型的二次規劃問題,如下面的式子所示。通過上述問題求出的結果 即每個表情基對應的權重 作用與各個表情基上就能實現逼真的表情動畫了,而求解二次規劃的方法有很多,下面重點介紹有效集...