二阶段法matlab矩阵描述.docx
- 文档编号:8521914
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:8
- 大小:15.86KB
二阶段法matlab矩阵描述.docx
《二阶段法matlab矩阵描述.docx》由会员分享,可在线阅读,更多相关《二阶段法matlab矩阵描述.docx(8页珍藏版)》请在冰豆网上搜索。
二阶段法matlab矩阵描述
functionTwo_stage(zflag,b,A,Aflag,c)
clear;clc
formatrat
fprintf('\n');
zflag=input('请输入所求目标函数的状态(求最大值为1,求最小值为-1):
');
b=input('请输入资源矩阵b:
');
A=input('请输入约束矩阵A:
');
Aflag=input('请输入约束方程的状态矩阵(小于号为-1,等于为0,大于号为1);');
c=input('请输入目标函数价值系数矩阵c:
');
%zflag=1;
%b=[9155];
%A=[531;-5615;211];
%c=[101512];
%Aflag=[-1-11];
%-------------------------------------------------标准化
ifzflag==-1
c=-1*c;
end
nb=size(b);
[mA,nA]=size(A);
fori=1:
nb
(注意:
此处未考虑不等式要变号2014.3.29.14.40)
ifb(i)<0
b(i)=-1*b(i);
A(i,:
)=-1*A(i,:
);
end
end
num1=find(Aflag==-1);
num2=find(Aflag==0);
num3=find(Aflag==1);
N=[];
c1=zeros(1,length(c));%构造第一阶段目标函数系数矩阵
(注意:
此处未考虑当设计变量为无非负要求变量时的情况2014.3.29.14.50)
fori=1:
length(num1)
A(num1(i),nA+1)=1;
c(nA+1)=0;
c1(nA+1)=0;
nA=nA+1;
N(i)=nA;
end
fori=1:
length(num3)
A(num3(i),nA+1)=-1;
A(num3(i),nA+2)=1;
c(nA+1)=0;
c1(nA+1)=0;
c1(nA+2)=-1;
nA=nA+2;
N(end+1)=nA;
end
fori=1:
length(num2)
A(num2(i),nA+1)=1;
c1(nA+1)=-1;
nA=nA+1;
N(end+1)=nA;
end
%以下部分初始化基变量的下标值矩阵N,基变量的系数矩阵CB
%--------------------------------------------------------
CB=zeros(1,mA);
[mA,nA]=size(A);
fori=1:
mA
CB(i)=c1(N(i));%确定基变量的系数
end
if(length(num2)+length(num3))~=0
[A,b,c1,N,CB]=first_stage(A,b,c1,N,CB);
[A,b,c,N,CB]=second_stage(A,b,c,c1,N,CB);
else
fprintf('标准化后初始单纯形表为:
');
c
p=[CB',N',b',A]
disp('***********************************************************');
[A,b,c,N,CB,t1]=second_stage_diedai(A,b,c,N,CB);%只调用第二阶段迭代过程
end
%单纯形法第一阶段函数
%============================================================
function[A,b,c1,N,CB]=first_stage(A,b,c1,N,CB)
k=1;%k是
times=0;
Isend=0;
temp1='第';temp2='次后单纯形表为:
';
b=b';
whileIsend==0
if(times==0)
fprintf('标准化后初始单纯形表为:
');
else
fprintf('%s%d%s',temp1,times,temp2);
end
times=times+1;
[mA,nA]=size(A);
t=zeros(1,mA);
forj=1:
nA%startfor
t(j)=c1(j)-CB*A(:
j);
end%Endfor
c1
p=[CB',N',b,A]
t
[m1,j]=max(t);%确定导入基,导入基的列下标为col
k=max(t);
ifm1<=0
X=zeros(1,nA);
fori=1:
length(N)
X(N(i))=b(i);
end
break;%跳出while循环
else
times2=0;
fori=1:
mA
ifA(i,j)>0
f(i)=b(i)/A(i,j);
else
f(i)=10000;%如果相除是负值,把值设为10000
times2=times2+1;
end
end
iftimes2==mA
fprintf('此问题的无最优解\n')
Isend=1;
break;%跳出ifm1<0
else
[m2,l]=min(f);
CB(l)=c1(j);%确定导出基导出基的行标为l
N(l)=j;
B=[];
fori=1:
length(N)
B=[B,A(:
N(i))];
end
b=B\b;%endtheforcycle,已改变了b数组的值
A=B\A;
end%endif
end%endif
end%endwhile
Z=c1*(X');
ifZ~=0
fprintf('人工变量仍在基变量中,该问题无可行解。
\n')
else
fprintf('第一阶段最优解为:
\n')
X
end
disp('***********************************************************');
%*****************************************************第一阶段完毕
%单纯形法第二阶段函数%
function[A,b,c,N,CB]=second_stage(A,b,c,c1,N,CB)
ifisempty(find(CB==-1))%判断最优解的基变量中是否含有非零的人工变量
n=length(find(c1==-1));%统计人工变量的个数
[mA,nA]=size(A);
A=A(:
1:
nA-n);%除去人工变量后的矩阵A
[A,b,c,N,CB,t1]=second_stage_diedai(A,b,c,N,CB);%调用第二阶段迭代函数
else
fprintf('此问题无解!
')
end
%单纯形法第二阶段迭代函数%
function[A,b,c,N,CB,t1]=second_stage_diedai(A,b,c,N,CB)
[mA,nA]=size(A);
fori=1:
length(N)
CB(i)=c(N(i));
end
k1=1;
times=0;
Isend=0;
whileIsend==0
if(times==0)
fprintf('初始单纯形表为:
');
else
fprintf('%s%d%s\n','第',times,'次迭代的单纯性表');
end
times=times+1;
forj=1:
nA%(nA-n)
t1(j)=c(j)-CB*A(:
j);%计算检验数
end
p=[CB',N',b,A]
c,t1
[m3,column]=max(t1);%找出检验数中最大的值及其所在的列
k1=m3;
j=column;
ftimes=0;
ifm3>0
fori=1:
mA
ifA(i,j)*b(i)>0
f(i)=b(i)/A(i,j);
else
f(i)=10000;%如果相除是负值,把值设为10000
ftimes=ftimes+1;
end
end
ifftimes==mA
fprintf('此问题的无最优解\n')
Isend=1;
else
[m4,row]=min(f);
CB(row)=c(column);
N(row)=column;
B=[];
fori=1:
length(N)
B=[B,A(:
N(i))];
end
b=B\b;%endtheforcycle,已改变了b数组的值
A=B\A;
end
else
Isend=1;
X=zeros(1,nA);
fori=1:
length(N)
X(N(i))=b(i);
fprintf('此问题的最优解为:
\n')
X
fprintf('目标函数的最优值为:
\n')
Z=c*(X')
disp('***********************************************************');
end
end%endif
end%endwhile
%*******************************************************第二阶段迭代函数结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 阶段 matlab 矩阵 描述