【算法】算法思想之動態規划


  動態規划(dynamic Programming)主要解決的問題:多階段決策過程最優化, 其主要的思想是將最優化決策過程分為若干個互相聯系的階段,每個階段需要作出一個決策,並且當前階段的決策會影響下一階段的決策,從而影響到整個過程的活動路線。


基本概念

  • 階段(Stage):把所給問題的求解,恰當地划分成若干個相互聯系的階段,以便於求解。通常用k表示階段變量
  • 狀態(State):狀態表示某段的出發位置。它既是該段某支路的始點,同時也是前一段某支路的終點。通常一個階段包含若干個狀態。描述過程狀態的變量,稱為狀態變量。常用Xk表示在第k段的某一狀態。
  • 決策(Decision):決策就是某階段狀態給定以后,從該狀態演變到下一階段某狀態的選擇,描述決策的變量,稱為決策變量。常用uk(xk)表示第k段當狀態處於xk 時的決策變量。決策變量的取值往往限制在某一范圍之內,此范圍稱為允許決策集合
  • 策略(Policy):各個階段所確定的決策就構成一個決策序列,通常稱為一個策略
  • 指標函數:在多階段決策過程最優化問題中,指標函數是用來衡量所實現過程的優劣的一種數量指標,它是一個定義在全過程和所有后部子過程上的確定數量函數,常用Vk,n表示。不同的問題中,指標的含義也不同:距離、利潤、成本、產量、資源消耗等。
  • 最優指標函數:指標函數Vk,n的最優值,稱為相應的最優指標函數。

動態規划最優化原理

  作為整個過程的最優策略具有這樣的性質:即無論過去的狀態和決策如何,對前面的決策所形成的狀態而言,余下的諸決策必須構成最優策略

動態規划解題步驟

  1. 正確划分階段,用階段變量表示,比如月份,年份等等。
  2. 正確選擇狀態變量xk, 使它既能描述過程的狀態,又要滿足無后效性。所謂無后效性是指:如果某段狀態給定,則在這段以后過程的發展不受前面各階段狀態的影響。
  3. 確定決策變量uk及每段的允許決策集合。
  4. 寫出狀態轉移方程,表示由k段到k+1段的整體轉移規律,第k段的狀態和決策確定,則第k+1段的狀態也應該確定下來。
  5. 確定指標函數和遞推關系式,它是定義在全過程和所有后部子過程上的數量函數。

動態規划問題舉例

最短路線問題

  給出一個線路網絡, 從A點要鋪設一條管道到G點,其兩點之間連線上的數字表示兩點間的距離;要求選擇一條由A到G的鋪管線路,使總距離為最短。

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704215615748-1030981036.png)

在求解的各個階段,我們利用了k階段與k+1階段之間的如下關系:

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704215637142-1579981104.png)

機器負荷分配問題

  設機器在高負荷下生產的產量函數為S1=8u1, 年折損率為a=0.7; 在低負荷下生產的產量函數為S2=5u2,年折損率為b=0.9。開始生產時完好機器的數量x1=1000台。按題意要安排好五年的生產計划,使產品的總產量最高。

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704215729820-1730730527.png) ![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704215744535-677012138.png) ![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704215751980-1176185463.png)

資源分配問題

  設有某種原料,總數量為a, 用於生產n種產品。若分配數量xi用於生產第i種產品,其收益為gi(xi)。問應如何分配,才能使生產n種產品的總收入最大?

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704215820773-1254456597.png)

生產與存儲問題

復雜系統工作可靠性問題

動態規划解TSP問題

可基於動態規划思想解決的問題

0/1背包問題

  設V[i,j] 表示從前i項{u1,u2,…,ui}中取出來的裝入體積為j的背包的物品的最大價值。

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704215912381-66908496.png)

最長公共子序列

  令L[i, j]表示a1 a2 … ai 和 b1 b2 … bj的最長公共子序列的長度。

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704220136690-1704391893.png)

計算二項式系數

  可以將二項式系數保存在一張n+1行k+1列的表中,行從0到n,列從0到k,逐行填表完成計算。

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704220001150-1618347286.png)

矩陣鏈相乘

  用Mi, j表示Mi Mi+1 … Mj的乘積,並假設鏈Mi, j的乘法的耗費用數量乘法的次數來測度, 記為C[i, j]。

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704220015976-1474082054.png)

爬樓梯問題(leetCode 70)

  假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意:給定 n 是一個正整數。
  每一階段可以選擇1步或者兩步,f(n)=f(n-1)+f(n-2),其實這是一個斐波那契數列第n項問題

最大子序和(leetCode 53)

  給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

![](https://img2018.cnblogs.com/blog/1608161/201907/1608161-20190704220041732-194371155.png)

打家劫舍(leetCode 198)

  一個專業的小偷,計划偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
  解答:對於此題,如果只有兩家或者以下,我們選擇金額最大的。如果2家以上,那我們打劫到第 i 家的時候,就要考慮,要不要打劫這一家,也就是(這一家的價值+打劫到 i - 2家的最大價值)和(打劫到上一家(i - 1)的最大價值),比較這兩個值,選較大值作為打劫到第 i 家的最大價值。最后輸出最后一家就可以了。
dp[i] = max(dp[i-2]+nums[i], dp[i-1])

總結

  本文對算法常用解題思想——動態規划做了主要的介紹,並列舉了一些動態規划的典型問題和一些基於動態規划思想解決的經典題目。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM