线性规划单纯形算法&对偶单纯性算法matlab

单纯性算法

%输入参量'
function [ X,z ] = lp( N,b,Cn )%N:约束条件系数矩阵,b:资源向量,Cn:价值向量

%N=[1 0;0 2;3 2];%初始基变量,就是没有使用的,没有添加松弛变量的

[row,col] = size(N);
E=eye(row);%使用单位矩阵
A=[N E];%合起来的A

%Cn=[2 3];%目标函数的参数

Cb=zeros(1,row);%的函数
c=[Cn Cb];%合起来的C
Xb=find(c==0);%初始基变量下标
Xc=find(c~=0);

%b=[4;12;18];%右边的约束条件

b1=b;
invb=inv(E);%B的-1次方
n=size(A,2); %提取A的列数
X=zeros(1,n);
z=0;
mat=c;
while(1)
    %mat=Cn-Cb*N;%看检验数    invb*
    mat(Xc)=mat(Xc)-mat(Xb)*N;
    mat(Xb)=0;
    mxc=mat(Xc);
    if sum(sum(mat>0))>0
        %----------------------------------------------------------------------------
        p=(find(mxc==max(mxc)));%换入变量
        %p
        %----------------------------------------------------------------------------------
        
        
        if size(p,1)>1 %提取A的行数
            p=p(1);
        end

        method = N(:,p);
        a=method;%invb*
        m=b./a;
        if sum(sum(m>0))==0
            disp('无界解,不用求了');
            break;
        end
        
        %---------------------------------------------------------------------------
        q=(find(m==min(m(m>0))));%换出变量
        %p=(find(m==min(m(m<0))));
        %q
        if size(q,1)>1 %提取A的行数
            q=q(1);
        end
        %----------------------------------------------------------------------------------
        
        %交换一:使用改进单纯形算法的矩阵形式表示,B-1=E'*B-1
        t=E(:,q);
        E(:,q)=a ;                      %Blk
        %invb=E\invb;                %Blk的逆乘以B-1即E乘B-1,等于B1^-1,(得到变换后的B-1)
        invb=inv(E);               
        
        N(:,p)=t;
        N=invb*N;
        
        %---------------------------------------------------------------------------------
        
        %交换二
        b=invb*b1;                  %更新b
        b1=b;
        %--------------------------------------------------
        t=Cb(q);                        
        Cb(q)=Cn(p);                %更新c
        Cn(p)=t;
        %------------------------------------------------
        %交换3
        t=Xc(p);
        Xc(p)=Xb(q);
        Xb(q)=t;            %把x的索引更新一下,然后给E更新一下
        E=eye(row);
        
    else
        if  sum(sum(mat==0))
            disp('有无穷多最优解,以下是其中之一')
            %X(Xb)=invb*b1;
            X(Xb)=b;
            %X'
            z=c*X'
            break
        else
            disp('找到最优解')
            %X(Xb)=invb*b1;
            X(Xb)=b;
            %X'
            z=c*X'
            X'
            c
            break
        end      
    end
end

对偶单纯形

%输入参量'
%采用对偶单纯形法计算目标函数最小化的线性规划问题
function [ X,z ] = lp( N,b,Cn )%N:约束条件系数矩阵,b:资源向量,Cn:价值向量

%N=[1 0;0 2;3 2];%初始基变量,就是没有使用的,没有添加松弛变量的

[row,col] = size(N);
E=eye(row);%使用单位矩阵
N=-N
A=[N E];%合起来的A

%Cn=[2 3];%目标函数的参数

Cb=zeros(1,row);%的函数
Cn=-Cn;
c=[Cn Cb];%合起来的C
Xb=find(c==0);%初始基变量下标
Xc=find(c~=0);

%b=[4;12;18];%右边的约束条件
b=-b;
b1=b;
invb=inv(E);%B的-1次方
n=size(A,2); %提取A的列数
X=zeros(1,n);
z=0;
while(1)
    mat=Cn-Cb*invb*N;%看检验数
    if sum(sum(b<0))>0
        %----------------------------------------------------------------------------
        %p=(find(mat==max(mat)));
        q=(find(b==min(b)));%换出变量
        %p
        %----------------------------------------------------------------------------------
        
        if size(q,2)>1 %提取A的列数
            q=q(1);
        end
        Nt=invb*N ;                    %更新N
        methodt = Nt(q,:);
        %a=method
        %a=invb*method;
        m=Cn./methodt;
        if sum(sum(m>0))==0
            disp('无界解,不用求了');
            break;
        end
        
        %---------------------------------------------------------------------------
        %q=(find(m=min(m(m>0))));%换出变量
        p=(find(m==min(m(m>0))));%换入变量
        %q
        %----------------------------------------------------------------------------------
        %----------------------------------------------------------------------------------------
        %
        method = N(:,p);
        a=invb*method;
        %------------------------------------------------------------------------------------------
        %交换一:使用改进单纯形算法的矩阵形式表示,B-1=E'*B-1
        t=E(:,q);
        E(:,q)=a ;                      %Blk
        N(:,p)=t;
        invb=E\invb;                %Blk的逆乘以B-1即E乘B-1,等于B1^-1,(得到变换后的B-1%---------------------------------------------------------------------------------
        
        %交换二
        b=invb*b1;                  %更新b
        
        %--------------------------------------------------
        t=Cb(q);                        
        Cb(q)=Cn(p);                %更新c
        Cn(p)=t;
        %------------------------------------------------
        %交换3
        t=Xc(p);
        Xc(p)=Xb(q);
        Xb(q)=t;            %把x的索引更新一下,然后给E更新一下
        E=eye(row);
        
    else
        if  sum(sum(mat==0))
            disp('有无穷多最优解,以下是其中之一')
            %X(Xb)=invb*b1;
            X(Xb)=b
            %X'
            z=c*X'
            break
        else
            disp('找到最优解')
            %X(Xb)=invb*b1;
            X(Xb)=b;
            %X'
            z=c*X'
            break
        end      
    end
end

思考题

1、具有等式约束的线性规划问题,目标函数最大化与目标函数最小化对于单纯形算法的计算过程有何影响?
答:
①.在基变换中确定换入变量的过程中二者不同:目标函数最大化选择检验数中最大的且为正的数对应的决策变量作为换入变量,目标函数最小化选择检验数中最小的且为负的数对应的决策变量作为换入变量
②.在最优解判定中二者不同:目标函数最大化问题中当检验数小于等于0时,取得最优解;目标函数最小化问题中当检验数大于等于0时,取得最优解

2、简述松弛变量和人工变量的异同.
答:
相同点:
①.都添加到约束条件上
②.取值均非负
不同点:
①.目的不同:添加松弛变量是为了将不等式约束化为等式约束,而添加人工变量是为了给单纯形算法提供初始可行基变量
②.含义不同:松弛变量有具体含义而人工变量没有具体含义
③.在解中不同:当原问题有最优解时,松弛变量取值可以非0,而人工变量取值必定为0

3、简述影子价格的定义及其经济解释.
答:
定义:在一对原问题和对偶问题中,若原问题的某个约束条件的右端项常数bi(第i种资源的拥有量)增加一个单位时,所引起目标函数最优值z的改变量称为第i种资源的影子价格,其值等于对偶问题中对偶变量的最优取值yi
经济解释:
①.影子价格是一种边际价格:是指在其他条件不变的情况下,单位资源数量的变化所引起的目标函数最优值的变化量,对偶变量的最优取值yi*就是第i种资源的边际价格
②.影子价格是一种机会成本,是在资源最优利用条件下对单位资源的估价,这种估价不是资源实际的市场价格。当影子价格大于市场价格时,企业应当购进这种资源,影子价格与市场价格之差为单位纯利润。当影子价格小于市场价格时,企业应当有偿转让这种资源,市场价格与影子价格之差为单位纯利润。
③.影子价格反映了资源的稀缺程度,影子价格可以作为在最优解时某种资源利用状态的指标。当某种资源的影子价格大于0时,即线性规划问题的对偶变量大于0,由对偶问题的互补松驰性,说明该资源被充分利用。当某种资源未被充分利用时,该资源的影子价格为0。

实验的难点分析

简述实验过程中遇到的困难及解决办法:
(1) 真的事一个bug 调一天,如果只是想简单的实现功能其实是比较简单的
(2) 当时当我做完之后使用的过程中出现了很多意想不到的bug
(3) 刚开始我想使用B1-1=Elk*B-1然后只是不停的计算B-1然后让他们在最初的矩阵上乘就完事,
(4) 一开始简单的题也可以算出来,但做到第三题我发现出现了错误,我开始找原因,debug了一圈发现这么求invb有的时候求出来的invb是错的,我就又改了思路,
(5) 一步步模拟老师上课讲的单纯性算法矩阵形式求解的迭代过程
(6) 然后第四题又出现了错误,又debug了一全原来是因为我没有家变量大于零的约束,,加上之后就好。
(7) 总之新的就是虽然乍一看这个算法挺简单的,但真的想自己实现其实还是存在很多的问题,何况我这还只是一个demo并没用封装等式约束的情况,对于需要使用大M法的情况跟两阶段法也没有封装上去,再人性化一点其实还可以做一个GUI总之就是一个看起来简单的东西真正做起来其实并不简单,实现起来有很多的小坑。

发布了154 篇原创文章 · 获赞 11 · 访问量 5872

猜你喜欢

转载自blog.csdn.net/weixin_45569785/article/details/105422924