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