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