这学期学运筹学,按照书本的流程写成程序并以手写的格式按步输出
依照Bland规则
function [output] = danchun(a)
% author: hunsh
% time: 05/16/2020
% a 为标准的单纯形表
% 在有解的情况下,output是最优值
format rat
raw=a;
while 1
tag="";
tag2=zeros(size(a,2),1);
tag2(1)=-1;
for i=2:size(a,1)
for j=2:size(a,2)
if a(i,j)==1 && ~any([a(2:i-1,j);a(i+1:size(a,1),j)])
% 这一行是基
tag(i,1)="x"+(j-1);
tag2(j,1)=a(i,1);
end
end
end
disp([tag rats(a)])
x_min=0;% 主列
positive = 1;
for i=2:size(a,2)
if a(1,i)<0
positive = 0;
for j=2:size(a,1)
if a(j,i)>0
positive =1;
end
end
if positive ==0
break
end
end
end
if positive ==0
output="无解1";
break
end
for i=2:size(a,2)
if x_min==0 && a(1,i)<0
x_min=i;
elseif a(1,i)>0 && x_min~=0
break
end
end
if x_min == 0
output=raw(1,:)*tag2;
break % 最优解
end
tmp=9999;
y_min=0;% 行
for i=2:size(a,1)
if a(i,x_min)>0 && a(i,1)/a(i,x_min)<tmp
y_min = i;
tmp = a(i,1)/a(i,x_min);
end
end
if y_min==0
output="无解2";
break
end
a(y_min,:)=a(y_min,:)/a(y_min,x_min);
for i=1:size(a,1)
if i==y_min
continue
end
a(i,:)=a(i,:) - a(y_min,:) * a(i,x_min);
end
disp("----------------------------------------------------------------------------------------------------");
end
end
下面是运行示例
本文由 hunsh 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 16, 2020 at 11:46 pm