細解動態規劃(一)

2021-09-07 18:24:35 字數 2692 閱讀 8370

概述

動態規劃我們在工作中會經常用到,有時候你會有這個意識,而且我相信你在專案中肯定使用過,只是你不了解這種方式是「動態規劃」而已。它最大的特點就是「空間換時間「。

如果你想大致了解下,你可以直接略過細節,直接看「使用動態規劃方法求解最優鋼條切割問題」這一部分。細節部分,只是使用案例和數學公式教大家怎麼去思考問題。 舉例

a公司購買長鋼條,將其切割為短鋼條**(切割工序本身沒有成本支出),a公司想知道最佳的切割方案。

假定:給定一段長度為n公尺的鋼條。長度與**的關係為:i公尺的鋼鐵**為p

i(i=1, 2, ...)元。

求:切割鋼條方案,使得銷售收益γ

n最大。

**表的樣例如下:

問題分析

思路:通過假設法,尋找資料間的關係,進行建模。 

尋找資料間的關係1:

假設n=4,窮舉所有的切割方式,找到最佳的切割方案。

不切(0刀):最高9元

1刀:最高10元

2刀:最高7元

3刀:最高4元

從上面的圖分析得出

1) n公尺的鋼條共有2

n-1種切割方案。

2)最優策略方案為:將鋼條切割為兩段長度均為2公尺的鋼條,總價值為10。

用數學符號開始演練:(我們用加法符號表示切割,如  7 = 2 + 2 + 3,表示為長度7公尺的鋼條切割段數為3段,每段分別為:2公尺、2公尺、3公尺。)

k為最優切割鋼條方案中的段數,p

i為i公尺鋼條的**,鋼條切割的最大收益為γ

尋找資料間的關係2:

根據**錶樣例,尋找到所有最優收益值及對應的最優切個方案:

觀察資料:(總長為5公尺的鋼材最優收益是:2公尺剛才最優收益+3公尺鋼材最優收益加和。)

從上述表,我們可以得出:對於γn(n>= 1),我們可以用更短的鋼條的最優切割收益來描述它:

對於每個i=1、2、...、n-1,方案步驟如下:

1)將鋼條切割為長度為i和n-i的兩段;

2)求解這兩段的最優切割收益γi和γn-i。——每種方案的最優收益為兩段的最優收益之和。

由於無法預知那種方案會獲得最優收益,我們必須考察所有可能的i,選取其中收益最大者。

最優子結構我們稱鋼條切割問題滿足

求解簡化版本

原有方式:

簡化版本:鋼條從左邊切割下長度為i的一段,對左邊的一段i不再進行切割,只對右邊剩下的長度為n-i的一段繼續進行切割(採用了一種自頂向下的遞迴方式)

遞迴方法cut-rod如下:

分析cut-rod:實際執行中,你會發現cut-rod的效率很差。因為cut-rod反覆地用相同的引數值對自身進行遞迴呼叫,即它反覆求解相同的子問題,如下圖所示:
使用 動態規劃方法求解最優鋼條切割問題

動態規劃方法的核心思想是:對每個子問題只求解一次,並將結果儲存下來。如果隨後再次需要此子問題的解,只需查詢儲存的結果,而不必重新計算。因此,動態規劃方法是付出額外的記憶體空間來節省計算時間,是典型的時空權衡的例子。

方法1:帶備忘的自頂向下法。此方法扔按自然的遞迴形式編寫,但過程會儲存每個子問題的解(通常儲存在陣列或雜湊中)。當需要乙個子問題解時,過程首先檢查是否已儲存過此解,無則計算,有則返回。

方法2:自底向上法。將子問題按規模排序,按由小至大順序求解。當求解某個子問題時,它所依賴的那些更小的子問題都已求解完畢,結果已儲存。每個子問題只需求解一次,當我們求解它時,它的所有前提子問題都已經求解完成。

子問題圖

當思考乙個動態規劃問題時,我們應該弄清所涉及的子問題及子問題之間的依賴關係。

上面舉得n=4時,鋼條切割問題的子問題圖如下:這是遞迴呼叫樹的簡化版,樹中標號相同的節點收縮為圖中的單一頂點,所有邊均從父節點指向子節點。

上面的圖中,我們可以把每個頂點向量化,標記為(x,y)。這個表示求解x的問題時候,我們需要子問題y的解。

推薦

動態規劃 一

在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...

動態規劃(一)

動態規劃的兩種常用形式 1 遞迴型 在函式中呼叫自身 優點 直觀,容易編寫 缺點 可能會因為遞迴層數太深導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說,比遞推型慢。2 遞推型 for迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...

動態規劃 (一)

對於動態規劃的學習總共進行了兩節課,到現在為止還是一頭霧水,雖然看懂了老師上課講的例題,但是做v judge的時候還是都不太會,我主要認為我只知道了動態規劃的基本思想,就是將乙個大的問題,分成若干個小問題,但與貪心演算法不同的是,動態規劃中的每乙個小問題之間都相互影響,在每一步都取得最優解,且在不斷...