1 / 12
文档名称:

运筹实验报告----单纯型算法.doc

格式:doc   大小:26KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

运筹实验报告----单纯型算法.doc

上传人:文库旗舰店 2019/9/23 文件大小:26 KB

下载得到文件列表

运筹实验报告----单纯型算法.doc

相关文档

文档介绍

文档介绍:运筹学实验报告一、实验目的运用MATLAB程序设计语言完成单纯性算法求解线性规划问题。二、实验内容编写一个MATLAB的函数文件::minf=c*xsubjectto:A*x=bx>=0;1、函数基本调用形式:[x,minf,optmatrx,flag]=linp(A,c,b)2、参数介绍:A:线性规划问题的约束A*x=b且x>=0中变量的系数组成的矩阵,是一个m*n的矩阵。c:线性规划问题的目标函数f=c*x中各变量的系数向量,是一个n维的行向量。b:线性规划问题的约束A*x=b且x>=0中的常数向量,是一个m维的列向量。x:输出线性规划问题的最优解,当线性规划问题没有可行解或有可行解无最优解时x=[].minf:输出线性规划问题的最优值,当线性规划问题没有可行解时minf=[],当线性规划问题有可行解无最优解时minf=-inf。optmatrx:输出最优解对应的单纯性表,当线性规划问题没有可行解或有可行解无最优解时optmatrx=[].flag:线性规划问题的求解结果标志值,当线性规划问题有最优解时flag=1,当线性规划问题有可行解无最优解时flag=0,当线性规划问题没有可行解时flag=-[x,minf,optmatrx,flag]=linp3();%分别为最优解对应的x,最优解,最后一张单纯形表,标志;参数A,c,bA=input('A=');b=input('b=');c=input('c=');[m,n]=size(A);[p,q]=size(b);fori=1:p%检验b>=0?,否则换成b>=0ifb(i)<0A(i,:)=-1*A(i,:);b(i)=-1*b(i);endend%形成辅助问题中的第一张单纯性表chart1=zeros(m+2,m+n+1);chart1(1,:)=[-c,zeros(1,m+1)];%给表的第一行赋值chart1(2,:)=[zeros(1,n),-1*ones(1,m),0];%给表的第二行赋值chart1([3:m+2],:)=[A,eye(m,m),b];%添A和b到表中,给表的其他行赋值jiliang=[n+1:n+m];fori=3:m+2chart1(2,:)=chart1(2,:)+chart1(i,:);endchart1%辅助问题的换基迭代panbieshu=find(chart1(2,[1:m+n])>0);while~isempty(panbieshu)volume=panbieshu(1);temp1=chart1([3:m+2],volume);temp2=chart1([3:m+2],m+n+1);look=find(temp1>0);ifisempty(look)chart1(2,volume)=0;elsemin=inf;fori=3:m+2iftemp1(i-2)>0&temp2(i-2)/temp1(i-2)<minmin=temp2(i-2)/temp1(i-2);row=i;%找到一行中最后一列的数/volume列的数中最小的那个元素为转轴元endendchart1(row,:)=chart1(row,:)/chart1(row,volume);fori=1:m+2ifi~=row%如果不是转轴元所在的行,则通过运算将转轴元所在的列的其他元素化为0chart1(i,:)=chart1(i,:)+(-1*chart1(i,volume)*chart1(row,:));endendjiliang(row-2)=volume;%出基和进基endpanbieshu=find(chart1(2,[1:m+n])>0);chart1end%如果辅助问题的最优解大于零,则原问题无可行解ifchart1(2,m+n+1)>0fprintf('g>0,没有可行解');x=[];minf=inf;optmatrx=[];flag=-1;returnendlook1=find(jiliang>n);ifchart1(2,m+n+1)==0%等于0时,判断基变量中是否存在人工变量if~isempty(look1)%存在时进行处理while~isempty(look1)line2=look1(1)+2;temp=find(chart1(line2,[1:n])~=0);%在一行中找到不为0的数并记录ifisempty(temp)%存在人工变量对应的那一行都为0,去掉该行chart1(line2,:)=[];look1(1)=[];jiliang(line2-2)=[];else%否则进行换基迭代secondnum=temp(1);chart1(line2,:)=chart1(lin