細解動態規劃(一)

 
 
概述
 
  動態規劃咱們在工做中會常常用到,有時候你會有這個意識,並且我相信你在項目中確定使用過,只是你不瞭解這種方式是「動態規劃」而已。它最大的特色就是「空間換時間「。
 
  若是你想大體瞭解下,你能夠直接略過細節,直接看「使用動態規劃方法求解最優鋼條切割問題」這一部分。細節部分,只是使用案例和數學公式教你們怎麼去思考問題。
 
 
舉例
  
 
  A公司購買長鋼條,將其切割爲短鋼條出售(切割工序自己沒有成本支出),A公司想知道最佳的切割方案。
  假定:給定一段長度爲n米的鋼條。長度與價格的關係爲:i米的鋼鐵價格爲p i(i=1, 2, ...)元。
  求:切割鋼條方案,使得銷售收益γ n最大。
  價格表的樣例以下:
 
      

 

 
問題分析

   思路:經過假設法,尋找數據間的關係,進行建模。 數組

 

尋找數據間的關係1:

假設n=4,窮舉全部的切割方式,找到最佳的切割方案。spa

不切(0刀):最高9元3d

1刀:最高10元blog

 

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米鋼條的價格,鋼條切割的最大收益爲γ n
 
 
尋找數據間的關係2:
 
根據價格表樣例,尋找到全部最優收益值及對應的最優切個方案:
 

 

觀察數據:(總長爲5米的鋼材最優收益是:2米剛纔最優收益+3米鋼材最優收益加和。)內存

 

 

 

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

 

對於每一個i=一、二、...、n-1,方案步驟以下:class

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

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

因爲沒法預知那種方案會得到最優收益,咱們必須考察全部可能的i,選取其中收益最大者。

 
   最優子結構:爲了求解規模爲n的原問題,咱們先求解形式徹底同樣,規模更小的子問題。經過組合兩個相關子問題的最優解,並在全部可能的兩段切割方案中選取組合收益最大者,構成原問題的最優解。
 
  咱們稱鋼條切割問題知足 最優子結構性質:問題的最優解由相關子問題的最優解組合而成,而這些子問題能夠獨立求解。
 
 
求解簡化版本

 

原有方式:

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

 

遞歸方法CUT-ROD以下:
 

 

分析CUT-ROD:實際運行中,你會發現CUT-ROD的效率不好。由於CUT-ROD反覆地用相同的參數值對自身進行遞歸調用,即它反覆求解相同的子問題,以下圖所示:

 

CUT-ROD的運行時間爲n的指數,時間複雜度以下:

 


 
使用 動態規劃方法求解最優鋼條切割問題

 

  動態規劃方法的核心思想是:對每一個子問題只求解一次,並將結果保存下來。若是隨後再次須要此子問題的解,只需查找保存的結果,而沒必要從新計算。所以,動態規劃方法是付出額外的內存空間來節省計算時間,是典型的時空權衡的例子。

 

  方法1:帶備忘的自頂向下法。此方法扔按天然的遞歸形式編寫,但過程會保存每一個子問題的解(一般保存在數組或散列中)。當須要一個子問題解時,過程首先檢查是否已保存過此解,無則計算,有則返回。

 

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

 

 

 


 
子問題圖

 

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

  

  上面舉得n=4時,鋼條切割問題的子問題圖以下:這是遞歸調用樹的簡化版,樹中標號相同的節點收縮爲圖中的單一頂點,全部邊均從父節點指向子節點。

  

上面的圖中,咱們能夠把每一個頂點向量化,標記爲(x,y)。這個表示求解x的問題時候,咱們須要子問題y的解。

 

 
推薦
 
 
 
相關文章
相關標籤/搜索