玖叶教程网

前端编程开发入门

MATLAB实现单纯形算法和对偶单纯形算法

算例 1

计算结果:

算例 2

计算结果:

单纯形算法matlab代码

%单纯形算法
%Cn按行输入,b按列输入,N按系数矩阵正常输入
function [ X,z ] = func( N,b,Cn )%N:约束条件系数矩阵,b:资源向量,Cn:价值向量
[row,col]=size(N);
Ab=eye(row);%松弛变量的系数矩阵(单位阵)
A=[N,Ab];%完整的系数矩阵
[row2,col2]=size(A);
Cb=zeros(1,row2);%目标函数中初始基变量的系数
C=[Cn Cb];%目标函数的系数
indexB=find(C==0);%初始基变量的下标
sigma=zeros(1,col2);%定义检验数
theta=zeros(row2,1);%定义θ
X=zeros(1,col2);%定义最优解
while(1)
    for i=1:col2
        sigma(i)=C(i)-Cb*A(:,i);%计算检验数
    end
    if sum(sigma>0)
        [maxs,k]=max(sigma);%确定换入变量
        for j=1:row
        theta(j)=b(j,1)/A(j,k);%计算θ
        if theta(j)<=0
            theta(j)=inf;
        end
        end
        
        %判断无界解
        if theta==inf
            disp('该问题为无界解')
            return;
        end
        
        if sum(theta>0)
           [mint,m]=min(theta);%确定换出变量
        end
        element=A(m,k);   %主元素
        x1=[b A];   %增广矩阵
        
        %进行行变换,将主元素化为1,同列元素化为0
        x1(m,:)=x1(m,:)/element;
        for i=1:row2
            if i==m
                continue;
            else
                x1(i,:)=x1(i,:)-x1(m,:)*x1(i,k+1);
            end
        end
        
        b=x1(:,1);   %取出新的b
        A=x1(:,2:col2+1);%取出新的A
        Cb(m)=C(k);  %Cb变化
        indexB(m)=k; %基变量下标变化
    
    else   
        t=(sigma~=0);
        t1=(b>0);
        
        %判断无穷多解
        if sum(t(:))<length(indexB(:))
            disp('该问题有无穷多最优解,以下是其中之一')
            X(indexB)=b';
            disp('最优解为')
            X
            disp('目标函数最优取值为')
            z=C*X' 
        
        %这种情况有可能是退化解
        elseif sum(t1(:))<length(b(:))
            disp('该问题的最优解不是可行解')
            X(indexB)=b';
            disp('最优解为')
            X
            disp('目标函数最优取值为')
            z=C*X'   
        
        %唯一最优解
        else
            disp('该问题有唯一最优解')
           X(indexB)=b';
            disp('最优解为')
            X
            disp('目标函数最优取值为')
            z=C*X'           
        end
        break;
    end
end

对偶单纯形算法matlab代码

%对偶单纯形算法
%Cn按行输入,b按列输入,N按系数矩阵正常输入
function [ X,z ] = func3( N,b,Cn )%N:约束条件系数矩阵,b:资源向量,Cn:价值向量
[row,col]=size(N);
Ab=eye(row);%松弛变量的系数矩阵(单位阵)
A=[-N,Ab];%完整的系数矩阵
b=-b;
[row2,col2]=size(A);
Cb=zeros(1,row2);%目标函数中基变量的系数
C=[-Cn Cb];%目标函数的系数
indexB=find(C==0);%初始基变量的下标
sigma=zeros(1,col2);%定义检验数
theta=zeros(1,col2);%定义θ
X=zeros(1,col2);%定义最优解
while(1)
    t1=(b>=0);
  if sum(t1(:))<length(b(:))
    for i=1:col2
        sigma(i)=C(i)-Cb*A(:,i);%计算检验数
    end
    [minb,m]=min(b);%确定换出变量
    
    %判断无可行解
    if A(m,:)>0
         disp('无可行解')
         return;
    end
    
    %计算θ
    for i=1:col2
        if sigma(i)==0
            theta(i)=inf;
        else
            theta(i)=sigma(i)/A(m,i);
            if theta(i)<0
                theta(i)=inf;
            end
        end
    end
    [mint,k]=min(theta);%确定换入变量
    
    element=A(m,k);%主元素
    x1=[b A];%增广矩阵
    
    %进行行变换,将主元素化为1,同列元素化为0
    x1(m,:)=x1(m,:)/element;
    for i=1:row2
        if i==m
           continue;
        else
           x1(i,:)=x1(i,:)-x1(m,:)*x1(i,k+1);
        end
    end
    
     b=x1(:,1);   %取出新的b
     A=x1(:,2:col2+1);%取出新的A
     Cb(m)=C(k); %Cb变化
     indexB(m)=k;%基变量下标变化
  else
           X(indexB)=-b';
            disp('最优解为')
            X=-X
            disp('目标函数最优取值为')
            z=-C*X'
            return;
  end   
end

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言