单纯形算法matlab代码

今天介绍一下对偶单纯形算法求解线性规划问题的matlab代码:

function [ X, Z] = dual( A, B, C ,D)
% 单纯形法的实现
% X: 目标函数的最优解
% Z: 目标函数的极小值
% A: 约束函数的系数矩阵
% B: 约束函数的常数列向量
% C: 目标函数的系数向量
% D: 求最大值为1,求最小值为0
% E: 将B,A拼接成新的矩阵
flag = 1;
S=0;
Z=0;
[m, n] = size(A);
W=ones(m,1);
Q=[A B];
BIndex = n - m  + 1 : n;                % 基向量下标集合,确定初始可行基
    if D==0                             %如果求最小值将C取反
        C=-C;
    end
    if (n < m)
    disp('系数矩阵不符合要求!')
    else if rank(A)<rank(B)
      disp('原问题无可行解!')
    else
        while flag
            Cb = C(BIndex);             % 基矩阵对应的目标值b
            Zj = (Cb)*A;
            Rj =C-Zj;                   %Rj即为单纯形表中的σj,计算判别数
            X = zeros(1, n);
            %B
            if B>=0               %此种情况为最优解情况
            for i=1:m
                   X(BIndex(i))=B(i);
            end
            for i=1:n
                Z=Z+(C(i)*X(i));
            end
               flag = 0;
               fprintf('迭代次数为:%d\n',S);
               disp('已找到最优解:')
               S=0;
               break;
            else
                S=S+1;
                [~, k2]=min(B);    %获得换出基变量的位置
                %Rj   //此处为代码调试点
               for i=1:n
                   if A(k2,i)>=0
                       F(1,i)=inf;
                   else
                   F(1,i)=Rj(1,i)/A(k2,i);
                   end
               end
               %F
                 [~, k1] = min(F); %获得换入基变量的位置
                 %k1  //此处为代码调试  
               %A     //此处为代码调试点
               %B     //此处为代码调试点
                BIndex(k2)=k1;     %新的基变量
                E=[B,A];           %B,A合成一个新的矩阵
               % E   //此处为代码调试点
               %A    //此处为代码调试点
                E(k2,:)=E(k2,:)/E(k2,k1+1); %将A中k2行,除于A中k2行,k1列;
                for i=1:m                   %更新E
                  if(i==k2)
                      continue;
                  end
                    while(1)
                        E(i,:)= E(i,:)-E(i,k1+1)*E(k2,:);%将E进行初等行换,将主元素所在列其余元素变为0
                        if(E(i,k1+1)==0)
                        break;
                        end
                    end
                    B=E(1:m,1); %E拆开
                    A=E(1:m,2:n+1);
                    %继续进行下一步循环,直到flag被修改为1
               end
            end
        end
    end
end

这是我的作业,调试效果较好

猜你喜欢

转载自blog.csdn.net/weixin_43264420/article/details/92405420