function [x,Z] = lp2(N,b,Cn)
%采用对偶单纯形法计算目标函数最小化的线性规划问题
% N初始系数矩阵 b资源向量 C价值系数
[row,col] = size(N);
A=[-N,eye(row)]
[n1,n2]=size(A);
C=[-Cn zeros(1,n1)]
b=-b;
Xb=find(C==0)
x=zeros(1,n2); %定义最优解
checknum=zeros(1,n2); %定义检验数
judgenum=zeros(1,n2); %定义判断换入变量的值
CB=C(Xb); %确定初始基变量
Z=0
while 1
%计算检验数
for i=1:n2
checknum(i)=C(i)-sum(CB*A(:,i));
end
[MinJnum,l]=min(b); %找到b最小位置,换出变量
%计算theta
for i=1:n2
if A(l,i)>=0
judgenum(i)=inf;
else
judgenum(i)=checknum(i)/A(l,i);
end
end
%找到judgenum最小位置
[MinTnum,j]=min(judgenum);%换入变量
%判断最优解
if b>=0
if checknum<=0
disp('得到最优解:')
b'
x(Xb)=b'
disp('得到最优值为:')
Z=C*x';
break;
else
disp('对偶问题有无界解,原问题无可行解')
break;
end
else
%主元素所在行,变换状态信息
element=A(l,j);
X=[b,A];
X(l,:)=X(l,:)/element;%变换成单位
for i=1:n1
if i==l
continue;
end
X(i,:)=X(i,:)-X(l,:)*X(i,j+1);%换入元素同列其他元素变为0
end
b=X(:,1); %提取b
A=X(:,2:n2+1);
%更新CB XB的值
CB(l)=C(j);
Xb(l)=j;
end
end