matlab计算单纯形表

今天花了点时间,将这个程序完成了,里面还有一些小错误,代码写的还是有点乱,明天再整理了

update:

今天又花了点时间,将程序里面的错误找出来了一些,现在这个程序应该大体是可用的,那么就这样了

min1=0.00001;(update:如果用nan的话,效果更好,将这些数忽略掉

%b 约束条件 向量(update 应该是行向量)

function [JI opt]=simplex2(C,CB,b,A,BL)

%purpose 验算手工单纯形
%define variables
%C 目标函数变量系数 行向量
%CB 辨识初始基 行向量
%b 约束条件 向量
%A 约束系数矩阵 矩阵
%delta 检验数 行向量
%JBL 基变量序号
%BL 基向量位置-----------换一个结构变成一个逻辑向量
%FBL 非基变量位置
%JI 解
%opt 目标值
%MAX1 提供一个极大值
%MIN1 提供一个极小值
format rat;

max1=100000;
min1=0.00001;
delta=C-CB*A;%计算检验数
[YS GS]=size(A);%非基变量是哪些
disp('显示第一个表')
    disp(C);
    disp(A);
    disp(delta);
    temp12=length(BL);
    s='基变量有X';
    ss='';
    for iij=1:temp12
        ss=strcat(ss,[s num2str(BL(iij)) ' ']);
    end
    disp(ss);
%BL;%这里应该把基变量记载下来

kk=1;
for iii=1:GS      %区别基变量和非基变量
    if all(BL~=iii)
        FBL(kk)=iii;
        kk=kk+1;
    end
end
while (1)%这里就该是一个无限循环,不需要跳出条件,跳出在下面的return里面实现
    if max(delta)<=0
        if all(CB<1.04e-14) if ?]); ? num2str(BL(iij)) ss="" iij="1:temp12" for ; s="基变量有X" CB(temp17)="0;" temp17="CB==max1;">0;%找出检验数为正的项,这一段程序有问题,得不到我想要的东西
        temp1=A(:,deltaj);%找出检验数为正项对应的向量
        temp2=max(temp1);%找出检验数为正项对应的向量的每一列当中最大项
        if any(temp2<0) 
            disp('无界解');
            JI=0;
            opt=0;
            return;
        else
            [deltak,k]=max(delta);
            aik1=A(:,k);%储存A
            %temp3=A(:,k)<0;
         %   temp5=A(:,k);
         %   A(:,k)(temp3)=max1;%将负数转化为正数,以便下一步最小值判断不要出错
         %  A(:,k)
         %用下面这个循环实现这个功能
            temp3=size(A(:,k));
            for iii=1:temp3
                if A(iii,k)<0
                    A(iii,k)=min1;
                end
            end
            [theta,l]=min(b'./A(:,k));%l就是序号         
            A(:,k)=aik1;
     
            %迭代运算
            CB(l)=C(k);%换基  这边就有问题了,替换时候原来的变量没有保留
            BL(l)=k;%保留下面需要的变量 下面这段有问题,是我的思路没想清晰的原因
            tempbl=b(l);%保留b(l)以供下面计算
            tempA=A(l,:);%保留A(l,:)供下面计算
            b(l)=b(l)/A(l,k);
            tempALK=A(l,k);%保留A(l,k)
            A(l,:)=A(l,:)/A(l,k);
            for ii=1:length(A(:,1))
                 if ii~=l
                     b(ii)=b(ii)-A(ii,k)*tempbl/tempALK;
                     A(ii,:)=A(ii,:)-A(ii,k)*tempA/tempALK;
                 end
            end
        end
    end
    input('enter键显示下一个单纯形表');
    delta=C-CB*A;
    disp(C);
    disp(A);
    disp(delta);
    ss='';
    for iij=1:temp12
        ss=strcat(ss,[s num2str(BL(iij))]);%显示基变量
    end
    disp(ss);

end
This entry was posted in 读书笔记 and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *