Matlab 单纯型算法
使用单纯型表计算的Matlab代码
注意B与C输入为一列向量
function [x,Optimum,Resultsituation] = danchunxing(A,B,C)
%返回Resultsituation=1 找到最优解, 返回Resultsituation=-1 无最优解。
p=[];
Resultsituation=0;
Optimum = 0;
[m,n]=size(A);
x = zeros(n,1);
for i=1:m
for j = find(A(i,:)==1)
if (sum(A(:,j)==0)==m-1)
p=[p j];
end
end
end
[~,length]=size(p);
if (length<m)
disp("无满足要求的线性无关的列向量");
return;
end
p=p(1:m);
CB=C(p);
sigma = C'-CB'*inv(A(:,p))*A; %(A(:,p)是一个单位矩阵,求逆矩阵还是一个单位阵。
sigma(p) = 0;
while(1)
if isempty(find(sigma<0))
Resultsituation = 1;
x(p)=B;
x=x';
disp("判别数均为正值,找到最优解");
Optimum=sum(CB.*B);
return;
end
h=find(sigma<0);
if (sum(A(:,h)<0)==m)
Resultsituation = -1;
disp("判别数为负值,但无最优解");
return;
end
[f,g]=min(sigma);
theta=find(A(:,g)>0);
[l,o]=min(B(theta)./A(theta,g));
o=theta(o);
G=[B A];
for k=1:m
if k==o;
G(o,:)=G(o,:)*(1./G(o,g+1));
k=k+1;
else
G=IkJRow(G,k,o,-G(k,g+1)/G(o,g+1));
end
end
sigma=-(sigma(g)/A(o,g)).*A(o,:)+sigma;
B=G(:,1);
A=G(:,2:end);
CB(o)=C(g);
p(o)=g;
end
function A=IkJRow(A,i,j,k)
%初等矩阵变换
A(i,:)=A(i,:)+k*A(j,:);
end
算法例子验证
A=[2 0 -4 1;-1 1 3 0]
B=[6;5]
C=[1;-3;2;4]
[u,v,w]=danchunxing(A,B,C)
u =
3 8 0 0
v =
-21
w =
1
结果正确。
需要加入松弛变量的情况
A=[1 1 1 0 0 0; 1 2 0 1 0 0; 1 0 0 0 1 0; 0 1 0 0 0 1]
B =[6;8;4;3]
C=[-2;-3;0;0;0;0]
[u,v,w]=danchunxing(A,B,C)
u =
4 2 0 0 0 1
v =
-14
w =
1
结果正确