Matlab计算对偶单纯形表

in Matlab with 0 comment

这学期学运筹学,按照书本的流程写成程序并以手写的格式按步输出
同样依照Bland规则

function [outputArg1] = duiou(a,n)
% author: hunsh
% time: 05/16/2020
% a 为标准的对偶单纯形表
% n 为最大迭代次数,默认无限
% 在有解的情况下,outputArg1是最优值
format rat
raw=a;
times=0;
while 1
if nargin==2 && times>=n
        break
end
    times=times+1;
    tag="";
    tag2=zeros(size(a,2),1);
    tag2(1)=-1;
    for i=2:size(a,1)
        for j=2:size(a,2)
            if a(i,j)==1 && ~any([a(2:i-1,j);a(i+1:size(a,1),j)])
                % 这一行是基
                tag(i,1)="x"+(j-1);
                tag2(j,1)=a(i,1);
            end
        end
    end
    disp([tag rats(a)])
    x_min=0;% 主列
    positive = 1;
    for i=2:size(a,1)
        if a(1,i)<0
            positive = 0;
            for j=2:size(a,2)
                if a(i,j)>0
                    positive =1;
                end
            end
            if positive ==0
                break
            end
        end
    end
    if positive ==0
        outputArg1="无解1";
        break
    end
    for i=2:size(a,1)
        if x_min==0 && a(i,1)<0
            x_min=i;
            
        elseif a(i,1)>0 && x_min~=0
            break
        end
    end
    if x_min == 0
        outputArg1=raw(1,:)*tag2;
        break % 最优解
    end
    tmp=9999;
    y_min=0;% 行
    for i=2:size(a,2)
        if a(x_min,i)<0 && -1*a(1,i)/a(x_min,i)<tmp
            y_min = i;
            tmp = -1*a(1,i)/a(x_min,i);
        end
    end
    if y_min==0
        outputArg1="无解2";
        break % 无解吧?
    end
    a(x_min,:)=a(x_min,:)/a(x_min,y_min);
    for i=1:size(a,1)
        if i==x_min
            continue
        end
        a(i,:)=a(i,:) - a(x_min,:) * a(i,y_min);
    end
    disp("----------------------------------------------------------------------------------------------------");
end

end

下面是单纯形的运行示例,不是对偶,不过差不多的
运行示例

Responses