Matlab二阶段单纯形法
- dcxsf.m
- secP.m
- .m(test)
dcxsf.m
% 第一阶段函数
function [X,zR] = dcxsf(A,b,cOut,outMin,cSec,secMin)
format rat %数据以分数形式输出
%如果是求min,需要化为max = -min,此处是把系数求负,
%后续还有一步是,求出zR后,再给他求负
if outMin == 1
cOut = -cOut;
end
% my ny 分别为目标函数系数矩阵的行和列,此题my = 1, mn = 6;
[my ny]=size(cOut);
Ay = []; % 存储人工变量所在列的索引,即人工变量在第几列
AyR = []; % 存储非人工变量所在列的索引
yIndex = 0;
yRIndex = 0;
%分别找出人工变量和非人工变量,然后分别存入Ay 和 AyR里
for j = 1:ny
if cOut(j)~=0
yIndex = yIndex + 1;
Ay(yIndex) = j;
else
yRIndex = yRIndex + 1;
AyR(yRIndex) = j;
end
end
% my ny 分别为约束系数矩阵的行和列,此题mOutSize = 3, nOutSize = 6;
[mOutSize,nOutSize]=size(A);
% AmOut 存储基变量的索引,比如基变量之一为x3,则把3存入AmOut,用于记录那些变量是基变量
% Am1Out 存储非基变量的索引,比如非基变量之一为x4,则把4存入Am1Out,用于记录那些变量是非基变量
AmOut = zeros(mOutSize,1);
Am1Out = zeros(1,nOutSize - mOutSize);
% x1 x2 x3 x4 x5 x6
% 1 2 1 1 0 0
% 1 2 3 0 1 0
% 2 1 5 0 0 1
% 其中x4 x5 x6 为基变量,把基变量对应索引(第几列)存入AmOut,非基变量索引存入Am1Out
% 接下来这个for就是做这个工作的
iAm1Out = 0;
% 依次遍历每列
for jj = 1:nOutSize %jj 列数
flag1 = 0;
% 对这一列遍历行,检测是否有1,
for ii = 1:mOutSize % ii 行数
if A(ii,jj)==1
flag1 = ii;