算例 1
计算结果:
算例 2
计算结果:
单纯形算法matlab代码
%单纯形算法
%Cn按行输入,b按列输入,N按系数矩阵正常输入
function [ X,z ] = func( N,b,Cn )%N:约束条件系数矩阵,b:资源向量,Cn:价值向量
[row,col]=size(N);
Ab=eye(row);%松弛变量的系数矩阵(单位阵)
A=[N,Ab];%完整的系数矩阵
[row2,col2]=size(A);
Cb=zeros(1,row2);%目标函数中初始基变量的系数
C=[Cn Cb];%目标函数的系数
indexB=find(C==0);%初始基变量的下标
sigma=zeros(1,col2);%定义检验数
theta=zeros(row2,1);%定义θ
X=zeros(1,col2);%定义最优解
while(1)
for i=1:col2
sigma(i)=C(i)-Cb*A(:,i);%计算检验数
end
if sum(sigma>0)
[maxs,k]=max(sigma);%确定换入变量
for j=1:row
theta(j)=b(j,1)/A(j,k);%计算θ
if theta(j)<=0
theta(j)=inf;
end
end
%判断无界解
if theta==inf
disp('该问题为无界解')
return;
end
if sum(theta>0)
[mint,m]=min(theta);%确定换出变量
end
element=A(m,k); %主元素
x1=[b A]; %增广矩阵
%进行行变换,将主元素化为1,同列元素化为0
x1(m,:)=x1(m,:)/element;
for i=1:row2
if i==m
continue;
else
x1(i,:)=x1(i,:)-x1(m,:)*x1(i,k+1);
end
end
b=x1(:,1); %取出新的b
A=x1(:,2:col2+1);%取出新的A
Cb(m)=C(k); %Cb变化
indexB(m)=k; %基变量下标变化
else
t=(sigma~=0);
t1=(b>0);
%判断无穷多解
if sum(t(:))<length(indexB(:))
disp('该问题有无穷多最优解,以下是其中之一')
X(indexB)=b';
disp('最优解为')
X
disp('目标函数最优取值为')
z=C*X'
%这种情况有可能是退化解
elseif sum(t1(:))<length(b(:))
disp('该问题的最优解不是可行解')
X(indexB)=b';
disp('最优解为')
X
disp('目标函数最优取值为')
z=C*X'
%唯一最优解
else
disp('该问题有唯一最优解')
X(indexB)=b';
disp('最优解为')
X
disp('目标函数最优取值为')
z=C*X'
end
break;
end
end
对偶单纯形算法matlab代码
%对偶单纯形算法
%Cn按行输入,b按列输入,N按系数矩阵正常输入
function [ X,z ] = func3( N,b,Cn )%N:约束条件系数矩阵,b:资源向量,Cn:价值向量
[row,col]=size(N);
Ab=eye(row);%松弛变量的系数矩阵(单位阵)
A=[-N,Ab];%完整的系数矩阵
b=-b;
[row2,col2]=size(A);
Cb=zeros(1,row2);%目标函数中基变量的系数
C=[-Cn Cb];%目标函数的系数
indexB=find(C==0);%初始基变量的下标
sigma=zeros(1,col2);%定义检验数
theta=zeros(1,col2);%定义θ
X=zeros(1,col2);%定义最优解
while(1)
t1=(b>=0);
if sum(t1(:))<length(b(:))
for i=1:col2
sigma(i)=C(i)-Cb*A(:,i);%计算检验数
end
[minb,m]=min(b);%确定换出变量
%判断无可行解
if A(m,:)>0
disp('无可行解')
return;
end
%计算θ
for i=1:col2
if sigma(i)==0
theta(i)=inf;
else
theta(i)=sigma(i)/A(m,i);
if theta(i)<0
theta(i)=inf;
end
end
end
[mint,k]=min(theta);%确定换入变量
element=A(m,k);%主元素
x1=[b A];%增广矩阵
%进行行变换,将主元素化为1,同列元素化为0
x1(m,:)=x1(m,:)/element;
for i=1:row2
if i==m
continue;
else
x1(i,:)=x1(i,:)-x1(m,:)*x1(i,k+1);
end
end
b=x1(:,1); %取出新的b
A=x1(:,2:col2+1);%取出新的A
Cb(m)=C(k); %Cb变化
indexB(m)=k;%基变量下标变化
else
X(indexB)=-b';
disp('最优解为')
X=-X
disp('目标函数最优取值为')
z=-C*X'
return;
end
end