?? minforedynprog.m
字號(hào):
function[OptPol,OptObjval]=MinForeDynprog(x,DecisFun,StageObjFun,StateTransFun,ObjFun)
%***************************************************************%
%以下為動(dòng)態(tài)規(guī)劃的順序(前向)最小算法,取自文獻(xiàn)基于Matlab的動(dòng)態(tài)規(guī)劃順序算法的實(shí)現(xiàn).pdf
%基本公式如下:
%順序算法的優(yōu)點(diǎn)缺點(diǎn)需要和逆序算法實(shí)際地做個(gè)比較的
%而且是求最小的算法,如果求最大怎么辦?
%***************************************************************%
%其中x是狀態(tài)變量,一列代表一個(gè)階段狀態(tài);
%M-函數(shù)DecisFun(k ,x)表示由階段k的狀態(tài)變量xk求出相應(yīng)的允許決策變量;
%M-函數(shù)StageObjFun(k ,x ,u)是階段目標(biāo)函數(shù);
%M-函數(shù)StateTransFun(k ,x ,u)是狀態(tài)轉(zhuǎn)移函數(shù),其中x是階段k的某狀態(tài)變量,
%%而u是相應(yīng)的決策變量,對(duì)于順序算法而言,在使用狀態(tài)轉(zhuǎn)移函數(shù)時(shí),一般采用其逆函數(shù)的形式;
%M-函數(shù)ObjFun (v ,f )是第k - 1 階段及其以前階段的目標(biāo)函數(shù),
%%正如基本方程中所描述的那樣,第一階段(初始階段) 的目標(biāo)函數(shù)通常設(shè)為0;
%OptPol由四列構(gòu)成,OptPol=[ 階段號(hào); 狀態(tài); 決策; 階段目標(biāo)函數(shù)值];
%OptObjval是一個(gè)列向量,各元素分別表示各最優(yōu)策略對(duì)應(yīng)的最優(yōu)目標(biāo)函數(shù)值.
%***************************************************************%
%*不懂人家的程序可以一步一步打入command窗口進(jìn)行實(shí)際查看結(jié)果,比較直觀先理解結(jié)果,再去理解實(shí)現(xiàn)過程和手法***%
%*當(dāng)然這是其中的一個(gè)辦法,從宏觀還應(yīng)該找到其算法和程序流程,同時(shí)能找到Nes C語言那樣的程序調(diào)用語義框架聯(lián)結(jié)結(jié)構(gòu)更好,更易理解*%
step=length(x(1,:));%計(jì)算的結(jié)果就是x的列數(shù)=5
x_isnan=~isnan(x);%使得x_isnan返回由1和0組成的判斷x中不為“非數(shù)nan”,如果是數(shù)值返回1,不是返回0
compar_valm=inf*ones(size(x));%全部置+∞
f_opt=nan*ones(size(x));%原先被寫成了man*,全部置為nan,似乎為一張記錄所有結(jié)果的表?其實(shí)目標(biāo)函數(shù)值
d_opt=f_opt;
k=1;
tmp1=find(x_isnan(:,k));%原先把tmp1打成了tmpl了,怪不得老提示變量沒定義呢.找出第一列中非零的行數(shù)為1
tmp2=length(tmp1);%返回tmp1的列數(shù)=1
% 下面這一小段程序干什么用,不清楚啊
for i=1:tmp2
u=nan;
tmp3=feval(StageObjFun,k,x(tmp1(i),k),u);%又把tmp1打成了tmpl了.
f_opt(i,k)=tmp3;%f_opt(i,k)和d_opt(i,k)是代表什么?分布為目標(biāo)函數(shù)和階段目標(biāo)函數(shù)
d_opt(i,k)=u;
end
for k=2:1:step
tmp4=find(x_isnan(:,k));%tmp4找出x_isnan第二列中不為0的所有行數(shù),組成一個(gè)列向量1-500
tmp5=length(tmp4);%tmp5=500
for i=1:tmp5 %i為狀態(tài)變量x的索引,u為決策變量
u=feval(DecisFun,k,x(i,k));%feval這個(gè)函數(shù)還是不會(huì)用,就是一個(gè)返回函數(shù)值,那么DecisFun函數(shù)的定義有點(diǎn)奇怪
tmp6=length(u);%=500
for j=1:tmp6 %即決策變量u(k階段加工零件數(shù))索引號(hào)
tmp7=feval(StateTransFun,k,x(tmp4(i),k),u(j));%當(dāng)k=2,i=1,j=1,tmp7=x+u=1+1=2
tmp8=x(:,k-1)-tmp7; %當(dāng)k=2,j=1,tmp8為500行1列的數(shù)組,第一個(gè)值為500-2
tmp9=find(tmp8==0);%當(dāng)k=2,i=1,j=499,tmp7=x+u=1+499=500,tmp8第一個(gè)值為0
if~isempty(tmp9)
tmp10=feval(StageObjFun,k,tmp7,u(j)); %
tmp10=feval(ObjFun,tmp10,f_opt(tmp9(1),k-1));% f_opt里邊都是非數(shù)啊,怎么在比較的時(shí)候變成0了呢?
if tmp10<=compar_valm(i,k)
f_opt(i,k)=tmp10;%目標(biāo)函數(shù)值對(duì)應(yīng)決策變量為499,表示第一個(gè)車床加工499個(gè)
d_opt(i,k)=u(j); %決策變量,此時(shí)表示第一臺(tái)車床加工499個(gè)
compar_valm(i,k)=tmp10;
end
end
end
end
end
f=f_opt(:,step);f=f(find(~isnan(f)),1);OptObjval=min(f(:));
OptPol=[];tmpx=[];tmpd=[];tmpf=[];
tmp11=find(f_opt(:,step)==OptObjval);tmp12=length(tmp11);
for i=1:tmp12
tmpd(i)=d_opt(tmp11(i),step);tmpx(i)=x(tmp11(i),step);
tmp13=feval(StateTransFun,step,tmpx(i),tmpd(i));
tmpf(i)=feval(StageObjFun,step,tmp13,tmpd(i));
OptPol(step*(i-1)+step,[1,2,3,4])=[step,tmpx(i),nan,nan];
%注釋中的這上下兩行的OptPol應(yīng)該是少一個(gè)括號(hào)的,但不知道應(yīng)該放在哪里,原文如此了.
%step和step-1后面的括號(hào)說明了OptPol(x,y)這種格式才是正確的.
OptPol(step*(i-1)+step-1,[1,2,3,4])=[step-1,tmp13,tmpd(i),tmpf(i)];
for k=step-1:-1:2
tmpx(i)=tmp13;tmp14=x(:,k)-tmpx(i);tmp15=find(tmp14==0);
if ~isempty(tmp15)
tmpd(i)=d_opt(tmp15(1),k);
end
tmp13=feval(StateTransFun,step,tmpx(i),tmpd(i));%有錯(cuò),原先參數(shù)少一個(gè)step
tmpf(i)=feval(StageObjFun,k,tmp13,tmpd(i));
OptPol(step*(i-1)+k-1,[1,2,3,4])=[k-1,tmp13,tmpd(i),tmpf(i)];%k-1后面的括號(hào)說明了OptPol(x,y)這種格式才是正確的.
end
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -