单纯形法

%单纯形法解线性规划(求解《最优化方法》(天津大学出版社)55页例2.5.1)
%算法根据最优化方法(天津大学出版社)53页算法2.4.1编写
%v1.0 author: liuxi BIT
clc
clear
fprintf('系数矩阵:/n')
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]
fprintf('资源向量,即右端项:/n')
b=[6 8 4 3]'
fprintf('成本系数(价格系数)向量:/n')
c=[-2 -3 0 0 0 0]'
[m n]=size(A);
Lb=[3:6];%初始基变量的位置(人为设定)
Ln=[1:2];%初始非基变量的位置
count=1;%循环计数

while count
    B=A(:,Lb);%基矩阵
    N=A(:,Ln);%非基矩阵
    cB=c(Lb);
    cN=c(Ln);
    B_inv=inv(B);%B的逆矩阵
    fprintf('*****************第%d次迭代********************/n',count)

    fprintf('判别数为:')
    sigma=cN'-cB'*B_inv*N
    if sigma>=0%step2
        fprintf('判别数全都大于等于0/n')
        X=zeros(n,1);
        XB=B_inv*b;
        X(Lb)=XB;
        fprintf('此时有最优解,为'),X
        fprintf('最优值为fmin=%4.2f。/n',c'*X)
        break
    else%step3
        [sigma_min index1]=min(sigma);
        k=Ln(index1);
        fprintf('最小判别数sigma(%d)=%d/n',k,sigma_min)
        Ak=B_inv*A(:,k);
        [Ak_max index2]=max(Ak);
        fprintf('此时有可行解:/n')
        XB=B_inv*b
        fprintf('相应的目标函数值为%d/n',c(Lb)'*XB)
        if Ak_max<=0
            fprintf('进基变量系数全都小于等于0,此时该问题没有最优解。/n')
            break
        else
            temp=XB(index2)/Ak(index2);
            for i=1:m
                if Ak(i)>0
                    if temp>XB(i)/Ak(i)
                        temp=XB(i)/Ak(i);
                        index2=i;
                    end
                end
            end
            l=Lb(index2);
        end
        count=count+1;
        Lb(index2)=k;
        Ln(index1)=l;
        fprintf('x(%d)进基,x(%d)出基/n/n/n',k,l)
    end

end
 

你可能感兴趣的:(单纯形法)