数学建模 最优化方法:动态规划 学习笔记
動態規劃簡介
動態規劃是求解多階段決策問題的一種最優化方法。多階段決策過程是指這樣一類特殊的決策問題:由問題的特性可將整個決策過程按時間、空間等標志劃分為若干相互關聯又相互區別的階段。在它的每一個階段都需要做出決策,從而使整個過程達到最好的效果。由于各階段決策間有機地聯系,本階段的決策會影響到下一段的決策。所以在作決策時不僅要考慮本階段最優,還要考慮對最終目標的影響。
遞歸算法
算法描述:
首先要明確的是問題可以分為幾個階段,分階段的依據可以是時間,空間或者邏輯關系,例如將10枚金幣分給4個商人這個過程,可以先把金幣分給商人Tony,再在剩下的錢里面分一部分給Steven,再依次給Bruce和Jimmy,這樣就構造出了簡單的邏輯關系。階段確定之后再看每個階段所有可能的狀態,用k表示階段的序號,sk表示該階段的狀態,Sk表示階段k所有可能狀態的集合。決策就是對于階段k所處的狀態sk進行的操作,記作uk(sk),對應的Dk(sk)是該階段所能采取的策略集合。策略則是該過程依次進行的所有決策的集合p1n{u1(s1),u2(s2),…un(sn)},所有可選的策略集合為P1n.
狀態轉移方程:動態規劃中本階段的狀態是上一階段狀態和上一階段的決策結果。如果給定了第k階段的狀態 ,本階段決策 ,則第k+1階段的狀態 也完全確定,關系為 sk+1=Tk(sk,uk)稱為狀態轉移方程。
指標函數:
用于衡量所選定策略優劣的數量指標稱為指標函數,它分為階段指標函數和過程指標函數兩種。階段指標是指k階段 從狀態sk 出發,采用決策uk 時的效益,用 d(sk,uk)表示。對于任意一個給定的k,從第k階段到第n階段的過程稱為一個原過程的后部子過程。V1n(s1,p1n)表示初始狀態為 采用策略p1n時原過程的指標函數值。
最優指標函數
記為 fk(sk),它表示從第k階段狀態 采用最優策略pkn 到過程終止時的最佳效益值。當k=1時,是從初始狀態到全過程結束時整體最優函數。
核心算法可用以下公式描述:
舉例如下:
這是動態規劃的經典例題:求A->E最短路徑,而且形式十分簡單,階段也比較明顯:5個階段A->B->C->D->E。接下來用遞推算法加以實現:
結果
Len =8 0 0 07 6 8 05 4 0 03 1 5 0 way =2 1 1 1從A開始的最短路徑為8,從B1開始的最短路徑為7,從B2開始的最短路徑為6,依此類推。具體路徑為A->B2->C1->D1->E。分的階段再多一些,每個階段的可能狀態在多一些,枚舉算法將會計算所有可能路徑的長度,每條路徑的節點數量為階段數k,然后從中取最小。該算法雖然計算路徑的數量,但每條路徑的節點數量都是2。而且當走到B1點的時候不必再向下一一探索,直接選擇已經求出的最短路徑即可。
從上面的算法描述可以很快判斷出這就是遞歸算法,針對下面一道更經典,更容易的例題,分別用遞歸與遞推來實現:
遞歸:
結果(將金字塔都推到左面對齊):
Flag =86 0 0 0 057 73 0 0 039 46 65 0 018 27 39 32 012 7 13 24 11 Route =1 0 0 0 00 1 0 0 00 0 1 0 00 0 1 0 00 0 0 1 0遞推:
clear;clc; Data=[13 0 0 0 0;11 8 0 0 0;12 7 26 0 0;6 14 15 8 0;12 7 13 24 11]; Route=zeros(size(Data)); Flag=zeros(size(Data)); n=size(Data,1); sum=0; for i=n:-1:1for j=1:iif i==nFlag(i,j)=Data(i,j);elseFlag(i,j)=Data(i,j)+max(Flag(i+1,j),Flag(i+1,j+1));sum=sum+1;endend end for i=1:size(Data,1)Route(i,find(Flag(i,:)==max(Flag(i,:))))=1; end最后一例:將擁有非連續目標函數的線性規劃問題轉為動態規劃問題(思路和之前算法描述里面商人分金幣的例子完全一致,不必贅述,直接遞歸實現)
資源分配問題
資源分配問題就是將數量一定的資源恰當地分配給若干個使用者,而使總的目標函數值為最優。資源分配問題本屬于靜態規劃,但當我們認為引進時間因素后,可把它們看成是按階段進行的多階段決策問題。
例:某市電信局有4套通信設備,準備分給甲、乙、丙三個地區支局,事先調查了各支局的經營情況,并對各種分配方案作了經濟效益的估計,如表所示其中設備數為0時的收益,指已有的經營收益,問應如何分配這四套設備,使總的收益為最大?
結果:
>> outout =164>> numnum =3 0 1最優分配:給甲3個,給乙0丙
后記
這里是用matlab進行的算法實現,matlab完全不需要編程起點,直接上手就能用,以上全都是最簡單的單一解,對于具有同樣的最優指標,很可能有多個解,就競賽而言,給出一種可行方案已經足夠,但本著科學的精神,我無法允許自己將如此簡單的題目還做的半吊子!在學習相關數據結構知識后,必將以上垃圾代碼更新。最后想吐槽一下自己,高考不咋地,被分到了數學專業,每天各種定理,計算。前三個學期光顧著搞績點,結果數學基礎知識學了一堆,動手解決問題的能力卻垃圾地不行,寫以上這樣的小程序還調了很久。自己的目前的目標就是往機器學習方面發展,可是沒有人領著入門,只能馬上獨自啃書,門要靠自己打開,我大學不想再后悔一次了。嘴炮說再多也是廢話,這是我第一次,也是最后一次在網絡上表達自己真實的感受,今后只能用行為來證明自己。
總結
以上是生活随笔為你收集整理的数学建模 最优化方法:动态规划 学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推一波JAVA学习公众号
- 下一篇: 第10章-定位、层级关系