运用大M法计算线性规划的最大值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%运用大M法计算线性规划的最大值,计算之前先化成标准型,其中z中存放线性规划的最大值
%x中用于存放解,c为价值列向量,b为资源列向量
function [z,x]=DM2(A,c,b)
M=10000;k=1;flag=1;%设M为1000000,flag用于表示解的类型
[m,n]=size(A);%计算系数矩阵的行数和列数
c1=-M*ones(1,m);
c=[c;c1'];%计算此时的Cj
E=eye(m);
A=[A,E];%初始单纯形表
B=n+1:n+m;%B中存基变量的下标
CB=c1;%CB存放基变量前的系数
sigma=c';
for i=1:m
sigma=sigma+M*A(i,:);%计算初始单纯形表中的检验数sigma
end
D=find(sigma>0);
le=length(D);%循环的判断条件当存在sigma<=0时循环终止
while le
Max=max(sigma);
for i=1:n+m %寻找换入变量
if Max==sigma(i)
k=i; %k中用于存放换入变量的下标
end
end
j=1;
for i=1:m %寻找换出变量
if A(i,k)>0
theta(j)=b(i)/A(i,k); %计算theta的值
j=j+1;
else theta(j)=inf; %当A(i,k)<=0时theta取无穷大
j=j+1;
end
end
Q=min(theta);
for i=1:m
if theta(i)==Q
l=i; %l中用于存放换出变量的下标
end
end
B(l)=k; %更新基变量
CB(l)=c(k); %更新基变量前的系数
%更新单纯形表
b(l)=b(l)/A(l,k);
A(l,:)=A(l,:)/A(l,k);
for i=1:m
if i~=l
b(i)=b(i)-b(l)*A(i,k);
A(i,:)=A(i,:)-A(l,:)*A(i,k);
end
end
%更新单纯形表完毕
sigma=c';
for i=1:m
if c(B(i))~=0
sigma=sigma-c(B(i))*A(i,:); %重新计算检验数sigma end
end
D=find(sigma>0); %判断sigma中是否有大于0的数
le=length(D);
if le %判断是否为无界解
for i=1:n+m
if sigma(i)>0 %对任一sigma>0有pj<=0则为无界解
if A(:,i)<=0
flag=0; %flag=0表示线性规划有无界解
end
end
end
end
if flag==0 %如果flag=0则跳出循环
break;
end
end %循环到此终止
sigma1=sigma;
for i=1:m %判断某非基变量检验数为0则有无穷多最优解sigma1(B(i))=1;
end
for i=1:n+m
if sigma1(i)==0
flag=-1;
end
end
for i=n+1:n+m %判断线性规划是否无可行解
for j=1:m
if B(j)==i %检验基变量中是否有非0的人工变量
flag=2;
end
end
end
if flag==2 %flag=2则表明线性规划无可行解disp('无可行解');
z={};x={};
end
if flag==0 %flag=0则表明线性规划有无界解input('无界解');
z={};x={};
end
if flag==-1 %flag=-1则表明线性规划有无穷多最优解disp('无穷多最优解');
disp('一个最优解是'); %输出一个最优解
z=CB*b;
x=zeros(1,n);
for i=1:m
x(B(i))=b(i);
end
end
if flag==1 %flag=1则表明线性规划有最优解disp('有唯一最优解');
z=CB*b;
x=zeros(1,n);
for i=1:m
x(B(i))=b(i);
end
end。