📄 dan.m
字号:
%打印一般LP模型的单纯形表
function D=dan(c,A,b,p)
%本程序编于2006-12-16
%c为目标函数系数向量,A为约束系数矩阵,b为右边向量
%本程序默认处理的对象是非退化的,因为这种处理方式能加快收敛速度,
%若处理的对象是退化的,则输入参数p为2
if nargin==3,p=1;end
[m,n]=size(A);len=length(c);
if len~=n|length(b)~=m|min(b)<0,disp('输入有误!');D=[];S=[];
else
C=[];I=[];for k=1:m,t=aeye(m,k);temp=1;for l=1:n,if A(:,l)==t,temp=0;break;end,end,if temp==1,I=[I,t];C=[C,1];end,end%构造人工变量
if length(C)==0,D=dant(c,A,b,p);
else
y=size([A I],2);C=[zeros(1,y-length(C)),C];d=dant(C,[A I],b,p);x=size(d,1);%第一阶段
if x/(m+1)==1,H=d((m+1)*(-d(x,y+2)-1)+1:x,:);
else H=d((m+1)*(-d(x,y+2)-2)+1:x-m-1,:);
if max(H(1:m,1))>n,H=d((m+1)*(-d(x,y+2)-1)+1:x,:);else d=d(1:x-m-1,:);end
end%提取判别矩阵
f=1;
while f==1&length(H)~=0
s=size(H,1);
if H(s,1)>0,f=0;D=d;disp('原线性规划无解!');
else
a=H(1:s-1,1);
if max(a)<=n,A=H(1:s-1,2:n+1);b=H(1:s-1,y+2);T=dant(c,A,b,p);x=size(T,1);Z=zeros(x,y-n);D=[d;[T Z]];f=0;%第二阶段
else
N=find(a>n);
for k=1:length(N),T=H(N(k),2:n+1);
if T==0,H=H([1:N(k)-1,N(k)+1:s],:);%线性相关
else M=find(T~=0);H(N(k),1)=M(1);H(:,2:y+1)=rce(H(:,2:y+1),N(k),M(1),2);%转换
end
end
end
end
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -