当前位置:文档之家› matlab单纯形法

matlab单纯形法

%求解标准型线性规划:max c*x;s.t. A*x=b;x>=0
%本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b %N是初始的基变量的下标
%输出变量sol是最优解
%输出变量val是最优值,kk是迭代次数
function [sol,val,kk]=ssimplex(A,N)
[mA,nA]=size(A);
kk=0; %迭代次数
flag=1;
while flag
kk=kk+1;
if A(mA,:)<=0 %已找到最优解
flag=0;
sol=zeros(1,nA-1);%给每个变量赋初值0
for i=1:mA-1
sol(N(i))=A(i,nA);%给基变量赋新值(替换0)
end %给出最优解
val=-A(mA,nA);
else
for i=1:nA-1
if A(mA,i)>0&A(1:mA-1,i)<=0 %问题有无界解
disp('have infinite solution!');
flag=0;
break;
end
end
if flag %还不是最优表,进行转轴运算
temp=0;
for i=1:nA-1
if A(mA,i)>temp
temp=A(mA,i);
inb=i; % 进基变量的下标
end
end %选择最大检验数纵向对应的变量为进基变量
sita=zeros(1,mA-1);
for i=1:mA-1
if A(i,inb)>0
sita(i)=A(i,nA)/A(i,inb);
end
end
temp=inf;
for i=1:mA-1
if sita(i)>0&sita(i)<temp
temp=sita(i);
outb=i; %出基变量下标
end
end %选择最小的sita横向对应的变量为出基变量
%以下更新N
for i=1:mA-1
if i==outb
N(i)=inb;%以进基变量的下标替代出基变量的下标
end
end
%以下进行转轴运算
A(outb,:)=A(outb,:)/A(outb,inb);%将主元化为1
for i=1:mA
if i~=outb
A(i,:)=A(i,:)-A(outb,:)*A(i,inb);%将进基变量所在列除主元外的其余元素化为0
end
end
end
end
end。

相关主题