matlab实现单纯性算法和对偶单纯性算法实现

单纯性算法

  • 模型
    在这里插入图片描述
    在这里插入图片描述
  • 一般线性规划问题中当线性方程组的变量数大于方程个数,这时会有不定数量的解,而单纯形法是求解线性规划问题的通用方法。
    具体步骤是,从线性方程组找出一个个的单纯形,每一个单纯形可以求得一组解,然后再判断该解使目标函数值是增大还是变小了,决定下一步选择的单纯形。通过优化迭代,直到目标函数实现最大或最小值。换而言之,单纯形法就是秉承“保证每一次迭代比前一次更优”的基本思想:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进后更优的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。如果问题无最优解,也可用此法判别。
  • 运算步骤
    在这里插入图片描述
  • 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;
while(1)
    mat=Cn-Cb*invb*N;%看检验数
    if sum(sum(mat>0))>0
        p=(find(mat==max(mat)));%换入变量
        if size(p,2)>1 %提取A的列数
            p=1;
        end
        method = N(:,p);
        a=invb*method;
        m=b./a;
        if sum(sum(m>0))==0
            disp('无界解,不用求了');
            break;
        end
        q=(find(m==min(m(m>0))));%换出变量
        %交换一:使用改进单纯形算法的矩阵形式表示,B-1=E'*B-1
        t=E(:,q);
        E(:,q)=a ;
        N(:,p)=t;
        invb=E\invb;
        %交换二
        b=invb*b1;
        t=Cb(q);
        Cb(q)=Cn(p);
        Cn(p)=t;
        %交换3
        t=Xc(p);
        Xc(p)=Xb(q);
        Xb(q)=t;
        E=eye(row);
        
    else
        if  sum(sum(mat==0))
            disp('有无穷多最优解,以下是其中之一')
            X(Xb)=invb*b1;
            X'
            z=c*X'
            break
        else
            disp('找到最优解')
            X(Xb)=invb*b1;
            X'
            z=c*X'
            break
        end      
    end
end

  • 解决问题例子
    在这里插入图片描述
  • 输出结果
ans =

    2.0000
    6.0000
    2.0000
         0
         0


z =

    22





对偶单纯性算法

  • 对偶单纯形法是指从对偶可行性逐步搜索出原始问题最优解的方法。由线性规划问题的对偶理论,原始问题的检验数对应于对偶问题的一组基本可行解或最优解;原始问题的一组基本可行解或最优解对应于对偶问题的检验数;原始问题约束方程的系数矩阵的转置是对偶问题约束条件方程的系数矩阵。所以,在求解常数项小于零的线性规划问题时,可以把原始问题的常数项视为对偶问题的检验数,原始问题的检验数视为对偶问题的常数项。
  • 模型
    在这里插入图片描述
  • matlab程序示例
function [x,Z] = lp2(N,b,Cn)
%采用对偶单纯形法计算目标函数最小化的线性规划问题
%   N初始系数矩阵 b资源向量 C价值系数
[row,col] = size(N);
A=[-N,eye(row)]
[n1,n2]=size(A);
C=[-Cn zeros(1,n1)]

b=-b;
Xb=find(C==0)
x=zeros(1,n2);             %定义最优解
checknum=zeros(1,n2);      %定义检验数
judgenum=zeros(1,n2);      %定义判断换入变量的值
CB=C(Xb);                  %确定初始基变量
Z=0
while 1
    %计算检验数
    for i=1:n2
        checknum(i)=C(i)-sum(CB*A(:,i));
    end
    [MinJnum,l]=min(b); %找到b最小位置,换出变量
    
    %计算theta
    for i=1:n2
        if A(l,i)>=0
            judgenum(i)=inf;
        else
            judgenum(i)=checknum(i)/A(l,i);
        end
    end
      %找到judgenum最小位置
    [MinTnum,j]=min(judgenum);%换入变量
    %判断最优解
    if b>=0
        if checknum<=0
            disp('得到最优解:')
            b'
            x(Xb)=b'
            disp('得到最优值为:')
            Z=C*x';
            break;
        else
            disp('对偶问题有无界解,原问题无可行解')
            break;
        end      
    else
        %主元素所在行,变换状态信息
        element=A(l,j);
        X=[b,A];
        X(l,:)=X(l,:)/element;%变换成单位
        for i=1:n1
            if i==l
                continue;
            end
            X(i,:)=X(i,:)-X(l,:)*X(i,j+1);%换入元素同列其他元素变为0
        end
        b=X(:,1); %提取b
        A=X(:,2:n2+1);
        %更新CB XB的值
        CB(l)=C(j);
        Xb(l)=j;
    end
end


  • 解决问题示例
    在这里插入图片描述
  • 结果
得到最优值为:

Z =

   -5.6000


ans =

    2.2000    0.4000         0         0         0

猜你喜欢

转载自blog.csdn.net/weixin_42479155/article/details/93381186
今日推荐