多阶段决策优化最短路径问题的矩阵表示的matlab 程序
程序作者:Havian Zhang
Email :zvisual@sina.com
仅供学习交流,如有不当之处,请不吝赐教。谢谢
(此为word 文档,可以下载直接复制至matlab 中按相关规则使用即可)
参考文献:
《多阶段决策优化最短路径问题的矩阵表示》,张华节,李璀。四川兵工学报,2011.11
关键词:多阶段决策;优化;最短(小)路径;matlab 程序;矩阵;分块(层);带余除法;多叉树
1. 算例
对于文中的算例:(对于其他类似的问题,如有某相邻的阶段不能到达的情况或求最大值的问题,可以参见论文,里面有详细的操作说明。)
可将下列程序复制到matlab 中运行即可。其中转换矩阵函数以及最短路径函数需按matlab 中函数的运行规则使用即可。
%------------论文例子-Matlab 程序--(主程序)-------------%
w=[1 3 2 3 2 1]; %---某状态下的可能路径数---%
N=length(w);
ab=[3 2 1]'; %---此次参见论文中的设定方法即可(简单便利)---% bc=[4 3;2 7;8 6];
cd=[2 5 1 3 4 6];
de=[5 1 4 3 6 2];
ef=[3 2];
mab1=metrixT1(ab,w); %---为转换矩阵---%
mbc2=metrixT2(bc,w); %---为转换矩阵---%
mcd3=metrixT3N(cd,w,3); %---为转换矩阵---%
mde4=metrixT3N(de,w,4); %---为转换矩阵---%
mef5=metrixT3N(ef,w,5); %---为转换矩阵---%
m=mab1+mbc2+mcd3+mde4+mef5
fdmin(m,w) %---输出最优路径函数1---%
fdmins(m,w) %---输出最优路径函数2---%
%-----------------------主程序---结束------------------%
此问题的matlab 输出结果如下:
下为转换矩阵函数以及最短路径函数的Matlab 程序。需按matlab 中函数的运行规则使用即可。
温馨提示:
例如:对转换矩阵函数metrixT1的matlab 程序建立新的editor 文件,名字为metrixT1.m 即可使用。
%----------转换矩阵metrixT1--Matlab 程序--begin----%
function b=metrixT1(a,w)
%%%%%%%%%%%%%%%%%%%%适用于第二个分块矩阵的变换%%%%%%%%%%%%%%%%%%%%%%% c=1;
for i=3:length(w)
c=c*w(i);
end
b=ones(w(2),c); %标准/可能结果的矩阵及其维数
n=size(b);
for i=1:n(2)
b(:,i)=a.*b(w(2),i);
end
b;
%----------转换矩阵metrixT1--Matlab 程序--end----%
-Matlab 程序--begin----%
function b0=metrixT2(a,w)
%%%%%%%%%%%%%%%%%%%%%%%%%%适用于第二个分块
换%%%%%%%%%%%%%%%%%%%%%%%%
c=1;n1=size(a);
for i=3:length(w)
c=c*w(i);
end
c1=c/w(3); %第2个分块矩阵元素重复个数:w4*-*wN
b0=ones(w(2),c); %标准/可能结果的矩阵及其维数
n0=size(b0);
b=ones(w(2),c1); %第2个分块矩阵元素重复的小矩阵的维数
n=size(b);
for j=1:n1(2)
for i=1:n(2)
b1(:,i)=a(:,j).*b(w(2),i);
end
b0(:,1+n(2)*(j-1):n(2)*j)=b1;
end b0;
%----------转换矩阵metrixT2--Matlab 程序--end----%
程序--begin----%
function M=metrixT3N(a,w,l)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%主要变换M3之后
阵%%%%%%%%%%%%%%%%%%%%%%
n1=size(a); %a为一行向量
c=1; %l:第l 个分块矩阵
for i=3:length(w)
c=c*w(i);
end
cl=1;
for i=3:l+1
cl=cl*w(i);
end
矩阵的的分块变矩
if l+2
cc=1;
for i=l+2:length(w)
cc=cc*w(i);
end
if n1(2)==cl
M1=metrixT3N1(a,w,cc,cc*n1(2)); %重复向量a 中元素wi+1*-*wN次 M=metrixT3N2(M1,w,1);
else
k=cl/n1(2); %由k 个重复小矩阵合并所得
M1=metrixT3N1(a,w,cc,cc*n1(2));
M=metrixT3N2(M1,w,k);
end
else
M=metrixT3N2(a,w,c/n1(2));
end
M; %变换成w2*w3-wN的矩阵
%----------转换矩阵metrixT3N--Matlab 程序--end----%
程序--begin----%
function M=metrixT3N1(a,w,cl,l)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
次%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n1=size(a);
c=1;
for i=3:length(w)
c=c*w(i);
end
M=ones(n1(1),l);%n1(2)*cl
b=ones(n1(1),cl); %第 个分块矩阵元素重复的小矩阵的维数
n=size(b);
for j=1:n1(2)
for i=1:n(2)
b1(:,i)=a(:,j).*b(:,i);
end
M(:,1+n(2)*(j-1):n(2)*j)=b1;
end M;
%----------转换矩阵metrixT3N1--Matlab 程序--end----%
程序--begin----%
function M=metrixT3N2(a,w,k)
%%%%%%%%%%%%%%%将矩阵a(一般为行向量) 复制k 次达到(w2*w3-wN)
将列复制cl
维%%%%%%%%%%%%%%%%
n1=size(a);
c=1;
for i=3:length(w)
c=c*w(i);
end
M=ones(w(2),c);
%b=ones(n1(1),n1(2)); %第 个分块矩阵元素重复的小矩阵的维数 n=size(M);
for i=1:n(1)
for j=1:k
M(i,1+n1(2)*(j-1):n1(2)*j)=a;%(i,:)
end
end
M;
%----------转换矩阵metrixT3N2--Matlab 程序--end----%