日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数学建模 最优化方法:动态规划 学习笔记

發(fā)布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学建模 最优化方法:动态规划 学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

動態(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):

clear;clc; %決策集合利用三維矩陣存儲 Data=zeros(5,5,4); Data(1,1:3,1)=[3 2 1]; Data(1:3,1:2,2)=[4 3;1 3;3 5]; Data(1:2,1:3,3)=[2 5 3;1 4 2]; Data(1:3,1,4)=[3;1;5]; Len=zeros(4,4);%路徑長度 Route=zeros(5,5,4);%路徑記錄 choice=[1 3 2 3];%每個階段可選操作數(shù)量 %開始 for i=4:-1:1if i==4for j=1:choice(i)Len(i,j)=Data(j,1,4);Route(j,1,i)=1;endelsefor j=1:choice(i)Len(i,j)=min(Data(j,1:choice(i+1),i)+Len(i+1,1:choice(i+1)));ind=find((Data(j,1:choice(i+1),i)+Len(i+1,1:choice(i+1)))==Len(i,j));Route(j,ind,i)=ones(size(ind));endend end way=[]; ind=2; way(end+1)=ind; %從路徑記錄中讀出路徑 for i=2:4ind=find(Route(ind,1:choice(i),i)==1);way(end+1)=ind; end

結(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):

遞歸:

global Route;%路線記錄 global Data;%數(shù)據(jù)集 global Flag;%路徑長度記錄,同時也是是否再次需要計算的一個標(biāo)志 global sum;%計算次數(shù) sum=0; 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)); pyramid(1,1); for i=1:size(Data,1)Route(i,find(Flag(i,:)==max(Flag(i,:))))=1; end function Sum=pyramid(i,j) global Data; global Flag; global sum; if Flag(i,j)>0%如果已經(jīng)計算過以該該點為起點的最短路程,直接賦值即可,避免重復(fù)計算Sum=Flag(i,j);return; end if i==size(Data,1)%遞歸返回Sum=Data(i,j);Flag(i,j)=Sum;sum=sum+1;return; elseSum=Data(i,j)+max(pyramid(i+1,j),pyramid(i+1,j+1));Flag(i,j)=Sum;sum=sum+1;return; end

結(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è)備,使總的收益為最大?

clear;clc; num=[]; [num,out]=resource_distribution(1,num); function [newnum,out]=resource_distribution(i,num) if i==4out=0;newnum=num;return; elsecompare=[];NEWNUM=zeros(1,3,length(0:4-sum(num)));for k=0:4-sum(num)temp=num;if i<3temp(end+1)=k;else temp(end+1)=4-sum(num);end[temp_num,value]=resource_distribution(i+1,temp);NEWNUM(:,:,k+1)=temp_num;compare(end+1)=value+profit(i,k+1);endind=find(compare==max(compare));newnum=NEWNUM(:,:,ind(1));out=max(compare);return end function profit=profit(index,num) A=[38 41 48 60 66;40 42 50 60 66;48 64 68 78 78]; profit=A(index,num);

結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。