• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: Matlab
  • 标签: matlab  

资源简介

用单纯形法解线性等式、不等式约束。目标函数为线性。程序用matlab的m函数编写,请用matlab打开。

资源截图

代码片段和文件信息

 function [xofvalueexitflag]=simplex_method(nfAbigbbigAsmallbsmallAeqbeq)
%作者aeh
%最后编辑时间2018/10/22

% 该单纯形法解决以下问题
% min ofvalue=f*x
% s.t. Abig*x>=bbig
%      Asmall*x<=bsmall
%      Aeq*x=beq
%      x>=0
%      n=length(x)
% f x bbig bsmall beq are vector and Abig Asmall Aeq are matrix. 

%--------------------1.1 Standardization------------------
%该部分将加入松弛变量和剩余变量进行标准化
%使之变成如下形式
% min ofvalue=f*x‘ 
% s.t. AEq*x=BEq
%      x‘>=0
%-------------案例-------------
% Asmall=[1-21];bsmall=[11];
% Abig=[-412];bbig=[3];
% Aeq=[-201];beq=[1];n=3;
% f=[-311]; 
%-----------------------------
m1=length(bbig);
m2=length(bsmall);
m3=length(beq);
BEq=[bbig;bsmall;beq];AEq=[];
a1=eye(m1+m2+m3m1+m2);
    for i=1:m1
        AEq(i:)=[Abig(i:)-1*a1(i:)];
    end
    for i=1:m2
        AEq(i+m1:)=[Asmall(i:)a1(i+m1:)];
    end
    for i=1:m3
        AEq(i+m1+m2:)=[Aeq(i:)a1(i+m1+m2:)];
    end
    for i=1:(m1+m2+m3)            %使BEq元素均为正值
        if(BEq(i)<0)
            BEQ(i)=-BEq(i);
            AEq(i:)=-AEq(i:);
        else
            BEq(i)=BEq(i);
            AEq(i:)=AEq(i:);    
        end
    end
    

%-----------1.2 判断AEq矩阵是否具备初始基--------------
a2=eye(m1+m2+m3);
    for i=1:(m1+m2+m3)
        for j=1:(n+m1+m2)
            if isequal(AEq(:j)a2(:i))
               flag2(i)=1;position2(i)=j;
            end
        end
    end
    if (length(position2)        position2(m1+m2+m3)=0;
    end
    

%-------1.3 如果不具备初始基,添加人工变量-----
    if sum(flag2)~=(m1+m2+m3)
        j=1;
        for i=1:m1+m2+m3
            if position2(i)==0
               arbase2(j)=i;j=j+1;                %在arbase2中存放的i表示需要添加的人工变量在单位矩阵的第i列。
            end
        end
        lea=length(arbase2);
        for i=1:lea                               %按顺序在AEq的末端添加人工列
            aux=zeros(m1+m2+m31);
            j=arbase2(i);
            aux(j)=1;
            AEq(:n+m1+m2+i)=aux;
        end
    end
%-----------1.4 记录初始基的列数-----------------------
j=1;
    for i=1:m1+m2+m3                             %Col按顺序存放单位矩阵的列数,i表示单位矩阵的第几列而Col(i)表示在AEq中的列数
        if (position2(i)~=0)
             Col(i)=position2(i);         
        else
             Col(i)=n+m1+m2+j;j=j+1;
        end
    end
%-------------------------1.5基变换-------------------------
C=zeros(1n+m1+m2+lea);
for i=1:lea
    C(n+m1+m2+i)=1;
end
%--------选主元------
B=Col;
for i=1:m1+m2+m3
    cI(i)=C(B(i));
end
[exitnumsigma]=judgeopt(AEqCB);
while(exitnum==2)
    [AEQBEQBnewpcLpc]=exbase(AEqBEqCB);
    B=Bnew;AEq=AEQ;BEq=BEQ;
    [exitnumsigma]=judgeopt(AEqCB);  
end

%----------------------------------------第二阶段---------------------------------------
%去掉人工变量,还原目标函数系数,作初始单纯形表
C=zeros(1n+m1+m2);
for i=1:length(f)
    C(i)=f(i);
end


AEQ=[];
for i=1:n+m1+m2
    AEQ(:i)=AEq(:i);
end
AEq=AEQ;

%二阶段单纯形法的换基运算
[exitnumsigma]=judgeopt(AEqCB);
while(exitnum

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5766  2019-04-23 09:25  simplex_method.m

评论

共有 条评论