单纯型算法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

结果正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值