動態規劃的Matlab實現和實例分析

2021-02-21 校苑數模
動態規劃是解決多階段決策過程最優化問題的一種方法.

該方法是由美國數學家貝爾曼(R.Bellman)等人在2O世紀50年代初提出的.他們針對多階段決策問題的特點,提出了解決這類問題的最優化原理,並成功地解決了生產管理、資源分配等方面的許多實際題,從而建立了運籌學的一個新分支——動態規劃.

動態規劃是現代企業管理中的一種重要決策方法,可用於解決最優路徑、資源分配、生產計劃與庫存、投資、裝載、排序等問題,還可用於生產過程的最優控制等.由於它有獨特的解題思路,因而在處理某些優化問題時,比線性規劃或非線性規劃方法更有效.

而MATLAB是一個功能強大的用於基於矩陣運算的強大數值計算軟體,將Matlab語言應用到動態規劃中去,對實際問題進行程序設計和計算,可以達到計算簡便的目的.



一、動態規劃基本概念


使用動態規劃方法解決多階段決策問題,首先要將實際問題寫成動態規劃模型,此時要用到以下概念:

1)階段
將所給問題的過程,按時間或空間特徵分解成若干互相聯繫的階段,以便按次序去求解每階段的解,每個階段就是一個子問題,常用字母k表示階段變量.

2)狀態
各階段開始時的客觀條件叫做狀態.描述各階段狀態的變量稱為狀態變量,常用sk表示第k階段的狀態變量.狀態變量sk的取值集合稱為狀態集合,用sk表示.

3)決策
當各段的狀態取定以後,就可以作出不同的決策(或選擇),從而確定下一階段的狀態,這種決定稱為決策.表示決策的變量稱為決策變量,常用uk(sk)表示第k階段當狀態為sk時的決策變量.在實際問題中,決策變量的取值往往限制在一定範圍內,稱此範圍為允許決策集合,常用Dk(sk)表示第k階段從狀態sk出發的允許決策集合,顯然有「uk∈Dk(sk).

4)策略
一個由每個階段的決策按順序組成的集合稱為策略,用p表示,即p(s1)={u1(s1),u2(s2),..,un(sn),}。一個n階段決策過程,從1到n叫作問題的原過程.對於任意給定的k(1≤k≤n),從第k階段狀態sk到第n階段狀態sn的過程稱為原過程的一個後部子過程.後部子過程的策略記為pk(sk)={uk(sk),uk+1(sk+1),.,un(sn)},在實際問題中,可供選擇的策略有一定的範圍,此範圍成為允許策略集合。允許策略集合中達到最優效果的策略成為最優策略

5)狀態轉移
動態規劃中本階段往往是上一階段狀態和上一階段的決策進行綜合的結果.如果給定了第k段的狀態sk,且該階段決策為uk(sk),則第k+1段的狀態sk+1也就完全確定.它們的關係可表示為:

sk+1=Tk(sk,uk)

由於上式表示了由k階段到k+1階段的狀態轉移規律,所以稱該式為狀態轉移方程.

6)指標函數
用于衡量所選定策略優劣的數量指標稱為指標函數.一個n階段決策過程,從1到n叫作問題的原過程.對於任意一個給定的k(1≤k≤n),從第k階段到第n階段的過程稱為原過程的一個後部子過程。V1,n(s1,p1,n)表示初始狀態為s1採用策略p1,n時原過程的指標函數值。而Vk,n(sk,pk,n)表示在第k階段,狀態為sk採用策略pk,n時後部子過程的指標函數值.最優指標函數記為fk(sk),它表示從第k階段狀態sk採用最優策略pk,n到過程終止時的最佳效益值.fk(sk)與Vk,n(sk,pk,n)間的關係為:

fk(sk)=Vk,n(sk,pk,n)=optimize  Vk,n(sk,pk,n)

當k=1時,f1(s1)就是從初始狀態s1到全過程結束的整體最優函數.

二、動態規劃基本思路



1)將多階段決策過程劃分階段,恰當地選擇狀態變量、決策變量以定義最優指標函數,從而把問題化成一族同類型的子問題,然後逐個求解.

2)求解時從邊界條件開始,逆序過程行進,逐段遞推尋優.在每一個子問題求解時,都要使用它前面已求出的子問題的最優結果.最後一個子問題的最優解,就是整個問題的最優解.

3)動態規劃方法是既將當前一段與未來各段分開,又把當前效益和未來效益結合起來考慮的一種最優化方法,因此每段的最優決策選取是從全局考慮的,與該段的最優選擇一般是不同的.

三、動態規劃函數使用說明


function [p_opt,fval]=dynprog(x,DecisFun,ObjFun,TransFun)       

% 自由始端和終端的動態規劃,求指標函數最小值的逆序算法遞歸計算程序

%輸入參數

% x各階段狀態變量的可能取值,第k列代表第k階段狀態變量可能取值

% DecisFun(k,x)決策函數,由階段k的狀態變量x求出相應的允許決策變量

% ObjFun(k,x,u)階段指標函數

% TransFun(k,x,u)狀態轉移函數,其中x是階段k的某狀態變量,u是相應的決策變量

%輸出參數

% p_opt動態規劃的規划過程,p_opt=[階段序號,狀態變量,決策變量,指標函數]

% fval總目標函數值,是一個列向量,第i元素代表第一個狀態變量取第i個可能值時的總目標


四、動態規劃實例分析



某公司擬將某種設備5臺分配給甲、乙、丙3個工廠,各工廠利潤與設備數量之間的關係如下表所示,問這5臺設備如何分配使3個工廠的總利潤為最大?
 
應用動態規劃方法分析如下
1.階段k
將問題按工廠分為3個階段,k=1,2,3
2.狀態sk
給第k個工廠分配前擁有的設備臺數,顯然s1=5
3.決策uk
分配給第k個工廠的設備臺數,顯然
分給第一個工廠可以0到s1臺之間
分給第二個工廠也可以0到s2臺之間
分給第三個工廠的為s2臺

function u=decisfun(k,s,u)

if k==3

u=s;

else

u=0:s;

end

4.狀態轉移Tk
前後兩個狀態之間的關係如下
s2=s1-u1,s3=s2-u2

function s_next=transfun(k,s,u)

s_next=s-u

5.階段指標Vk
第k階段的指標函數,表示配給第k個工廠uk臺設備所獲得的利益,顯然
Vk=w(uk,k)

function V=subobjfun(k,s,u)

w=[0 0 0 

3 5 4

7 10 6

9 11 11

12 11 12

13 11 12];

w=-w;%由於函數只能求最小值,現在求最大值,故取符號

%第k階段,決策變量為u時,對應的目標值

V=([0 1 2 3 4 5]==u)*w(:,k);%或者直接使用V=w(u,k)

6.各階段狀態變量可能取值
由已知,我們容易知道
s1={5}
s2={0,1,2,3,4,5}
s3={0,1,2,3,4,5}

s=nan*ones(6,3);%沒有取值的地方使用nan代替

s(1,1)=5;

s(:,2)=[0 1 2 3 4 5]』;

s(:,3)=[0 1 2 3 4 5]』;

根據上面的分析,我們編寫程序如下

function matlabsky

%動態規劃函數求解問題演示實例

%by dynamic

%see also http://www.matlabsky.com

%2008.12.23

%

%計算各狀態變量可能取值,第k列代表第k個狀態變量的可能取值,沒有的使用NaN代替

s=nan*ones(6,3);

s(1,1)=5;

s(:,2)=[0 1 2 3 4 5]';

s(:,3)=[0 1 2 3 4 5]';

%直接調用dynprg函數

[p_opt,fval]=dynprog(s,@DecisFun,@ObjFun,@TransFun) 

function u=DecisFun(k,s,u)

%決策函數

if k==3

    u=s;

else

    u=0:s;

end

function s_next=TransFun(k,s,u)

%狀態轉移函數

s_next=s-u;

function V=ObjFun(k,s,u)

%階段目標函數

w=[0 0 0 

3 5 4

7 10 6

9 11 11

12 11 12

13 11 12];

w=-w;%由於函數只能求最小值,現在求最大值,故取符號

%第k階段,決策變量為u時,對應的目標值

V=([0 1 2 3 4 5]==u)*w(:,k);%或者直接使用V=w(u,k)

運行結果如下

p_opt =

     1     5     2    -7

     2     3     2   -10

     3     1     1    -4

fval =

   -21

   NaN

   NaN

   NaN

   NaN

   NaN

複製代碼

這個運行結果解讀如下,我們要一行一行的解讀

對於p_opt:
第一階段,狀態變量為5,決策變量為2,階段指標為-7,也就是說第一階段時有5臺設備,分配給第一個工廠2臺,該工廠的利益為-7
第二階段,狀態變量為3,決策變量為2,階段指標為-10,也就是說第二階段時有3臺設備,分配給第二個工廠2臺,該工廠的利益為-10
第三階段,狀態變量為1,決策變量為1,階段指標為-4,也就是說第三階段時有1臺設備,分配給第三個工廠1臺,該工廠的利益為-4

對於fval:
總指標值為-21=-7-10-4,也就是說按上面的最優策略,將最大獲利21
後面的那些NaN是由於第一個狀態變量的可能取值我們只是輸入了5,而其他可能值都是用NaN的,故沒有結果

當然第一個狀態變量的可能取多個值,dynprog可以求解第一個狀態變量多取值的情況。可是根據該題實際我們只有一個5。下面我們試試,假如s={4 5}的運行結果

%計算各狀態變量可能取值,第k列代表第k個狀態變量的可能取值,沒有的使用NaN代替

s=nan*ones(6,3);

s(1:2,1)=[4,5];

s(:,2)=[0 1 2 3 4 5]';

s(:,3)=[0 1 2 3 4 5]';

%直接調用dynprg函數

[p_opt,fval]=dynprog(s,@DecisFun,@ObjFun,@TransFun)

複製代碼

運行結果如下,至於結果的解讀,大家可以根據dynprog函數的說明試試看看,能否明白
如果沒法理解,可以與我一起探討下matlabsky@gmail.com

p_opt =

     1     4     2    -7

     2     2     2   -10

     3     0     0     0

     1     5     2    -7

     2     3     2   -10

     3     1     1    -4

fval =

   -17

   -21

   NaN

   NaN

   NaN

   NaN

複製代碼

相關焦點

  • 用MATLAB巧解微分方程實例分析
    MATLAB巧解微分方程實例分析王少華 西安電子科技大學 微分方程求解難,字母一堆看著煩。寫錯數字一時爽,一直寫錯一直爽。一會兒,對答案,不僅和答案不一樣,和第一次算出來得也不一樣,這就有點酸爽了,算第三遍時,心就有點著急了,這怎麼就算不對呢?越想越著急,越著急,式子寫得越亂,然後那兩個小時就基本上沒幹其他事了。大二選了matlab課,感覺這玩意兒tql(太強了),然後突發奇想,用這軟體不恰可以撫慰我那被微分方程傷害了的幼小得心靈嘛。
  • [優化] 《MATLAB高效編程技巧與應用:25個案例分析》源程序+數據
    《MATLAB高效編程技巧與應用:25個案例分析》源程序+數據 所屬分類:計算機 > 計算機輔助設計與工程計算 > Matlab 內容簡介本書是作者八年matlab使用經驗的總結,精心設計的所有案例均來自於國內各大matlab技術論壇網友的切身需求,其中不少案例涉及的內容和求解方法在國內現已出版的matlab書籍中鮮有介紹
  • Matlab和Modelsim的聯合仿真——實例
    實例1:舉一個簡單的例子說明如何用Matlab產生的數據用作Modelsim仿真。
  • 想通過視頻自學MATLAB的同學戳這裡!
    圖像分割技術MATLAB圖像處理實例詳解視頻第8章:圖像變換技術MATLAB圖像處理實例詳解視頻第9章:彩色圖像處理MATLAB圖像處理實例詳解視頻第10章:圖像壓縮編碼MATLAB圖像處理實例詳解視頻第11章:圖像特徵分析MATLAB圖像處理實例詳解視頻第12章:形態學圖像處理MATLAB圖像處理實例詳解視頻第13
  • 一文了解Matlab如何製作動態圖像
    今天的推文,我們主要來介紹matlab中幾種繪製動態圖像的方法。
  • Web前端設計-JavaScript動態設置CSS樣式實例分析
    其基本語法描述如下:HTMLElement.setAttribute(name,value);03動態CSS樣式設置實例本例主要設置實現在滑鼠經過某一個DIV時,動態改變該DIV層的style樣式屬性,主要改變屬性包括背景顏色、字體大小及光標形狀等。
  • 「資料分享」41款GUI實例助你隨心所欲玩轉matlab GUI開發
    matlab愛好者今天給大家帶來由Matt Fig收集整理開發的GUI界面編程實例以及相關GUI編程問題錦集,資料包含41個GUI開發實例以及47個GUI開發問題,所有實例均在非詳見實例:GUI_1415 列表框中的「 listboxtop」和「 value」有什麼區別?
  • 用matlab來實現fpga功能的設計
    近年來,在數字通信、網絡、視頻和圖像處理領域,FPGA已經成為高性能數位訊號處理系統的關鍵元件。FPGA的邏輯結構不僅包括查找表、寄存器、多路復用器、存儲器,而且還有快速加法器、乘法器和I/O處理專用電路。FPGA具有實現高性能並行算法的能力,是構成高性能可定製數據通路處理器(數字濾波、FFT)的理想器件。
  • 動態規划算法秘籍
    動態規劃是1957年理察·貝爾曼在《Dynamic Programming》一書中提出來的,八卦一下,這個人可能有同學不知道,但他的一個算法你可能聽說過,他和萊斯特·福特一起提出了求解最短路徑的Bellman-Ford 算法,該算法解決了Dijkstra算法不能處理負權值邊的問題。
  • 使用 matlab 進行傅立葉分析和濾波
    >公式法下例 是將振幅為1的5Hz正弦波和振幅為0.5的10Hz正弦波相加之後進行傅立葉分析。對應的逆變換有兩種,分別為x=ifft(y)和x=ifft(y.N)。一般而言,N點fft的結果y,在處對應的頻率為最高採樣率的一半,y的後一半與前一半對稱。下例 是將振幅為1的5Hz正弦波和振幅為0.5的10Hz正弦波相加之後進行傅立葉分析。
  • Python是這樣調用matlab程序的!
    Python是純粹的自由軟體, 原始碼和解釋器CPython遵循 GPL(GNU General Public License)協議。Python語法簡潔清晰,特色之一是強制用空白符(white space)作為語句縮進。Python具有豐富和強大的庫。它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。
  • matlab和c語言的區別
    MATLAB和MathemaTIca、Maple並稱為三大數學軟體。它在數學類科技應用軟體中在數值計算方面首屈一指。MATLAB可以進行矩陣運算、繪製函數和數據、實現算法、創建用戶界面、連接其他程式語言的程序等,主要應用於工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。
  • 100個C語言編程實例分析
    全面、系統地講述了C語言各個方面的知識點和程序設計的基本方法,對100個典型實例的分析和講解,以及編寫程序過程中值得注意的地方,內容深入淺出,通俗易懂
  • python和matlab哪個好?
    MATLAB和MathemaTIca、Maple並稱為三大數學軟體。它在數學類科技應用軟體中在數值計算方面首屈一指。MATLAB可以進行矩陣運算、繪製函數和數據、實現算法、創建用戶界面、連接其他程式語言的程序等,主要應用於工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。
  • 關於Matlab的那些事
    而後由於所學的專業是生命科學和環境相關的東西,用到matlab的機會不多,主要是一些功能用matlab實現起來不是很方便,而且手邊有現成的軟體可以做到,例如圖像分析,還有DNA序列分析都有現成軟體等。本以為不會與其有太多交集。我下決心學習matlab是在經歷幾件事情之後。
  • 移動機器人路徑規划算法研究及仿真平臺的設計與實現
    一、項目介紹1、項目來源:當移動機器人處在一個簡單或複雜、靜態或動態、已知或未知的環境中時,機器人的首要任務是感知環境,避開障礙物,然後以最小或較小的消耗(時間、空間或者能量)完成自己的任務,這個過程的基礎所在就是路徑規劃。
  • 關於動態規劃,你想知道的都在這裡了
    接下來,我將解釋什麼是動態規劃,給出一個解決動態規劃問題的秘訣,並且和大家一起分析幾個示例,以便你能夠更好地理解其應用場合和應用方法。和我以往有關編程面試的文章一樣,在本文中,我將分享自己在使用這種方法解決問題時的思考過程,這樣當你在面對其中一個問題時,按照這個過程一定也能解決。不需要死記硬背,我們只需要通過了解技術和實踐,將想法轉化成代碼技能。
  • 拒絕遺忘:高效的動態規划算法
    不懂動態規劃的人會在解決過的問題上再次浪費時間,懂的人則會事半功倍。那麼什麼是動態規劃?這種算法有何神奇之處?本文作者給出了初步的解答。假設你正在使用適當的輸入數據進行一些計算。你在每個實例中都進行了一些計算,以便得到一些結果。當你提供相同的輸入時,你不知道會有相同的輸出。這就像你在重新計算之前已經計算好的特定結果一樣。那麼問題出在哪裡呢?
  • 編程小技巧之matlab python畫二項分布的動態圖
    >在數據處理中,matlab和Python是常用的工具,在量化模型中,概率論是一項很重要的基礎,而中心極限定理在概率論中又是一個很重要的理論。中心極限定理的定義為:設隨機序列{Xi}獨立同分布,有共同的數學期望u和方差σ^2,部分和由定義,則Sn的標準化
  • 學習matlab的一點心得體會
    而後由於所學的專業是生命科學和環境相關的東西,用到matlab的機會不多,主要是一些功能用matlab實現起來不是很方便,而且手邊有現成的軟體可以做到,例如圖像分析,還有DNA序列分析都有現成軟體等。本以為不會與其有太多交集。我下決心學習matlab是在經歷幾件事情之後。