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