原理

程序
function [x,minf]= SimpleMthd(A,c,b,baseVector)
% 约束矩阵:A
% 目标函数系数向量∶ c;
% 约束右端向量∶b;
% 初始基向量∶baseVector
% 目标函数取最小值时的自变量值∶x;
% 目标函数的最小值∶ minf
sz = size(A);
nVia =sz (2);
n=sz(1);
xx=1:nVia;
nobase=zeros(1,1);
m=1;
for i=1:nVia %获取非基变量下标
if (isempty(find(baseVector==xx(i),1)))
nobase (m)= i;
m=m+1;
else
end
end
bCon = 1;
M= 0;
while bCon
nB=A(:,nobase); %非基变量矩阵
ncb= c(nobase); %非基变量系数
B=A(:,baseVector); %基变量矩阵
cb=c(baseVector); %基变量系数
xb=inv(B)*b;
f=cb*xb;
w=cb*inv(B);
for i=1:length(nobase)
sigma(i) = w*nB(:,i) - ncb(i);
end
[maxs,ind]= max(sigma); %ind为进基变量下标
if maxs <= 0 %最大值小于零,输出最优解
minf = cb*xb;
vr=find(c~=0 ,1,'last');
for l=1:vr
ele=find(baseVector==l,1);
if (isempty(ele))
x(l)=0;
else
x(l)=xb(ele);
end
end
bCon=0;
else
y=inv(B)*A(:,nobase(ind));
if y <=0 %不存在最优解
disp('不存在最优解!');
x= NaN;
minf = NaN;
return;
else %寻找出基变量
minb=inf;
chagB = 0;
for j=1:length(y)
if y(j)>0
bz = xb(j)/y(j);
if bz<minb
minb = bz;
chagB = j;
end
end
end %chagB为出基变量下标
tmp = baseVector(chagB);%更新基矩阵和非基矩阵
baseVector(chagB)= nobase(ind);
nobase (ind) = tmp;
end
end
M= M+1;
%迭代步数限制
if(M == 1000000)
disp('找不到最优解!');
x = NaN;
minf = NaN;
return;
end
end
输入
A=[-1 2 1 0 0;2 3 0 1 0;1 -1 0 0 1];
c=[-4 -1 0 0 0];
b=[4; 12; 3];
baseVector=[3,4,5];
[x,minf]= SimpleMthd(A,c,b,baseVector)
结果
