在约束最优化中,用单纯形法解线性规划的matlab程序
展开全部
function [zyj,zyz,k]=ssssimplex(A,N) %A为初始单纯型表 和书上的形式一样
[m,n]=size(A); % 分别代表A的行数和列数 %N为基本可行解的下标
k=0; %迭代次数 %zyj为最优解
%zyz为最优值
flag=1; %定义一个逻辑变量
while flag
k=k+1;
if A(1,:)>=0 %已找到最优解
flag=0;
zyj=zeros(1,n-1);%给每个变量赋初值0
for i=2:m
zyj(N(i-1))=A(i,n);%给基变量赋新值
end
zyz=-A(1,n);%给出最优解
else %判断问题是否不可解
for i=1:n-1
if A(1,i)<0&A(2:m,i)<=0 %问题不可解
disp('there is no answer');
flag=0;
break;
end
end
if flag %还不是最优表,进行转轴运算
temp=0;
for i=1:n-1
if A(1,i)<temp
temp=A(1,i); %为了求出第一行最小值的位子
inb=i; % 进基变量的下标 %inb为进基量下标
end
end
sita=zeros(1,m-1);
for i=2:m
if A(i,inb)>0 %为了求出相除以后最小的值
sita(i-1)=A(i,n)/A(i,inb);
end
end
temp=inf; %定义一个无穷量inf
for i=1:m-1
if sita(i)>0&sita(i)<temp
temp=sita(i);
outb=i+1; %出基变量下标
end
end %选择最小的sita横向对应的变量为出基变量
%以下更新N
for i=2:m
if i==outb
N(i-1)=inb;%以进基变量的下标替代出基变量的下标
end
end
%以下进行转化运算
A(outb,:)=A(outb,:)/A(outb,inb);%将主元化为1
for i=1:m
if i~=outb
A(i,:)=A(i,:)-A(outb,:)*A(i,inb);%将进基变量所在列除主元外的其余元素化为0
end
end
end
end
end
[m,n]=size(A); % 分别代表A的行数和列数 %N为基本可行解的下标
k=0; %迭代次数 %zyj为最优解
%zyz为最优值
flag=1; %定义一个逻辑变量
while flag
k=k+1;
if A(1,:)>=0 %已找到最优解
flag=0;
zyj=zeros(1,n-1);%给每个变量赋初值0
for i=2:m
zyj(N(i-1))=A(i,n);%给基变量赋新值
end
zyz=-A(1,n);%给出最优解
else %判断问题是否不可解
for i=1:n-1
if A(1,i)<0&A(2:m,i)<=0 %问题不可解
disp('there is no answer');
flag=0;
break;
end
end
if flag %还不是最优表,进行转轴运算
temp=0;
for i=1:n-1
if A(1,i)<temp
temp=A(1,i); %为了求出第一行最小值的位子
inb=i; % 进基变量的下标 %inb为进基量下标
end
end
sita=zeros(1,m-1);
for i=2:m
if A(i,inb)>0 %为了求出相除以后最小的值
sita(i-1)=A(i,n)/A(i,inb);
end
end
temp=inf; %定义一个无穷量inf
for i=1:m-1
if sita(i)>0&sita(i)<temp
temp=sita(i);
outb=i+1; %出基变量下标
end
end %选择最小的sita横向对应的变量为出基变量
%以下更新N
for i=2:m
if i==outb
N(i-1)=inb;%以进基变量的下标替代出基变量的下标
end
end
%以下进行转化运算
A(outb,:)=A(outb,:)/A(outb,inb);%将主元化为1
for i=1:m
if i~=outb
A(i,:)=A(i,:)-A(outb,:)*A(i,inb);%将进基变量所在列除主元外的其余元素化为0
end
end
end
end
end
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询