今天介绍一下对偶单纯形算法求解线性规划问题的matlab代码:
function [ X, Z] = dual( A, B, C ,D)
% 单纯形法的实现
% X: 目标函数的最优解
% Z: 目标函数的极小值
% A: 约束函数的系数矩阵
% B: 约束函数的常数列向量
% C: 目标函数的系数向量
% D: 求最大值为1,求最小值为0
% E: 将B,A拼接成新的矩阵
flag = 1;
S=0;
Z=0;
[m, n] = size(A);
W=ones(m,1);
Q=[A B];
BIndex = n - m + 1 : n; % 基向量下标集合,确定初始可行基
if D==0 %如果求最小值将C取反
C=-C;
end
if (n < m)
disp('系数矩阵不符合要求!')
else if rank(A)<rank(B)
disp('原问题无可行解!')
else
while flag
Cb = C(BIndex); % 基矩阵对应的目标值b
Zj = (Cb)*A;
Rj =C-Zj; %Rj即为单纯形表中的σj,计算判别数
X = zeros(1, n);
%B
if B>=0 %此种情况为最优解情况
for i=1:m
X(BIndex(i))=B(i);
end
for i=1:n
Z=Z+(C(i)*X(i));
end
flag = 0;
fprintf('迭代次数为:%d\n',S);
disp('已找到最优解:')
S=0;
break;
else
S=S+1;
[~, k2]=min(B); %获得换出基变量的位置
%Rj //此处为代码调试点
for i=1:n
if A(k2,i)>=0
F(1,i)=inf;
else
F(1,i)=Rj(1,i)/A(k2,i);
end
end
%F
[~, k1] = min(F); %获得换入基变量的位置
%k1 //此处为代码调试
%A //此处为代码调试点
%B //此处为代码调试点
BIndex(k2)=k1; %新的基变量
E=[B,A]; %B,A合成一个新的矩阵
% E //此处为代码调试点
%A //此处为代码调试点
E(k2,:)=E(k2,:)/E(k2,k1+1); %将A中k2行,除于A中k2行,k1列;
for i=1:m %更新E
if(i==k2)
continue;
end
while(1)
E(i,:)= E(i,:)-E(i,k1+1)*E(k2,:);%将E进行初等行换,将主元素所在列其余元素变为0
if(E(i,k1+1)==0)
break;
end
end
B=E(1:m,1); %E拆开
A=E(1:m,2:n+1);
%继续进行下一步循环,直到flag被修改为1
end
end
end
end
end
这是我的作业,调试效果较好