




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE1-运筹学实验报告题目:用单纯形法求解线性规划问题姓名学号年级专业指导教师….……………目录……………….一.实验目的……………………2二.实验内容……………………2三.函数调用形式………………2四.参数介绍……………………2五.函数输出介绍………………2六.实验原理及步骤……………3七.函数代码及注释……………10八.数据测试……………………13九.LINPROG函数说明………….16十.LINPROG函数源代码及翻译……………….19十一.心得体会…………………26用单纯形法求解线性规划问题一.实验目的:掌握两阶段法求线性规划问题的最优解,并完成matlab求解单纯形算法求线性规划问题的最优可行解的程序。加深对单纯形算法的理解,掌握matlab的使用技巧。二.实验内容:用matlab程序两阶段法解下面形式的方程组的最优解:minf=cT*xs.t.A*x=bx>0三.函数调用形式:[x,minf,flag,cpt]=dcxsf(A,b,c)四.参数介绍:A为约束条件的系数矩阵。b为约束条件的常数列向量。c为目标函数的系数行向量。五.函数输出介绍:X:为线性规划的解向量,当函数有可行解并且有最优值时输出最优解;当有可行解但无最优值或没有可行解时输出x[]。minf:为目标函数的最优值,当函数有可行解并且有最优值时输出最优值;当有可行解但没有最优值时minf=-inf,输出-1/0;当没有可行解时输出minf=[]。flag:为记录函数解的情况,当函数有可行解并且有最优值时,flag=1;当函数有可行解但没有最优值时,flag=0;当函数没有可行解时,flag=-1.cpt:为单纯形表,当函数有可行解并且有最优值时输出最优解对应的单纯形表;当有可行解但没有最优值时cpt=[]。六.实验原理及步骤:程序由用户输入约束方程组的系数矩阵、常数列向量和目标函数的系数行向量。通过调用函数的形式,采用两阶段法求解线性规划问题,并输出相关结果。程序的第一阶段判断问题是否有可行解,若没有,程序停止,输出结果;如果有可行解,按第一阶段的方法可以求得一个初始的基本可行解,使运算进入第二阶段。第二阶段是从这个初始的基本可行解开始,使用单纯形法或者判定线性规划问题无界,或者求得一个最优解。具体运算如下:対原问题增加m个人工变量Xα=(Xn+1,…,Xn+m)T后,用单纯形法解如下问题:ming=s.t.Ax+xa=bx≥0,xa≥0如上形式的辅助问题,它所对应的目标函数值为g0=。则该辅助线性规划问题一定有可行解及最优解,由于人工变量对应的m列构成单位矩阵且有b>0,则辅助问题的第一个基本可行解为x=0,xa=b,该解对应的目标函数值,使用单纯型算法进行迭代,直到求得最优值。构造辅助问题的单纯形表时,将检验向量与最优值合并作为单纯形表的第一行g。最后得到的基变量中如果有人工变量,则从该行前n列中寻找非0数,并以它为轴心原进行换基迭代,如果前n列中没有非0数,则直接去掉该行,继续检查基变量,重复上述步骤。最后去掉人工变量对应的列,进入第二阶段对原始问题的求解。若最优值g=0,且人工变量xj为非基变量,把人工变量对应的列从单纯形表中去掉,然后直接转入第二阶段:即对目标函数z=cTx应用单纯形法;若最优值g>0,说明原问题没有可行解,结束程序;若最优值g=0,但某些人工变量虽然取值为0但仍为基变量时,第一阶段单纯形表如下,辅助问题的检验数向量μ=(μ1,μ2,…….μn+m)T≤0。x….x…xx…xRHSμ1…μS…μnμn+1…μn+m0aijb1….br….bmxB1…xB2…xB3基变量为xB1,…,xBr…,xBm,若xBr为一人工变量,则br=0.考察arj,j=1,…..,n,如果他们不全为零,则以一个不为零的数为转轴元进行一次旋转变换,将零值的xs变成了基变量,代替了取零值的人工变量xBr,是基变量中减少了一个人工变量。若arj=0,j=1,…..,n,这时矩阵A=a11…a1n……Am1...amn有一行全为零,即秩(A)<m.而A是由原约束矩阵A经过一系列初等变换得到的。初等变换不改变矩阵的秩,所以秩(A)=秩(A)<m.则单纯形表中的第r个约束方程是多余的,直接删去。如果基变量中还有其他人工变量,重复刚才过程,直至集变量中没有人工变量。至此,则可获得原问题的第一个基本可行解。第一阶段算法的大致流程如图所示:対原问题增加対原问题增加m个人工变量构造辅助问题最优值是否g=0flag=-1,原问题没有可行解,停止程序否人工变量xj是否为非基变量把人工变量对应的列从单纯形表中去掉是否是进行换基迭代得到新矩阵B否得到第一个基本可行解是B中是否有人工变量Arj=0即rank(A)<m直接删去该行否是进入第二阶段程序的第二阶段是对已经得到初始解的单纯形表进行单纯形法求最优可行解。从辅助问题得到的第一个基本可行解开始,当检验向量中存在大于0的数时,从该列中寻找正数且常数向量与其比值最小时,以该数值为轴心原进行换基迭代,并更新基变量,然后继续判断检验数是否还有大于0的,如果有,则重复上述步骤,直到程序终止。程序终止后,可能有3种解的情况,下一步的输出部分会对不同解的情况进行不同的处理。主要思想是判断第一个基本可行解是否是最优解,如不是,就找一个更好的基本可行解,在进行判别,如此迭代进行,直至找到最优解,或者判定该问题无界。具体步骤为:第一阶段得到一个基B;求出对应的典式(xB+B-1NxN=B-1b)和检验数向量ξ;求ξk=max{ξj|j=1,….n};若ξk≤0,则停止,已找到最有解x=xB=b及最优值z=cb;xN0若Ak≤0,停止,原问题无界;接下来求min{(bi/ai)|aik>0,i=1,…,m}=br/ark;再以Ak代替ABr得到新的基,转到求对应B的典式和检验数向量ξ那一步。第二阶段算法的大致流程如图所示:得到初始可行基得到初始可行基B求出对应的典式(xB+B-1NxN=B-1b)和检验数向量ξ求ξk=max{ξj|j=1,….n};判断ξk≤0是flag=1,得到最优解否判断Ak≤0是flag=0,原问题无界min{(bi/ai)|aik>0,i=1,…,m}=br/ar确定基变量Ak以Ak代替ABr得到新的基否换基迭代程序最后采用if条件语句,判断flag的值为-1、0、1三种情况中的哪一种,并输出对应结果。算法的大致流程如下:対原问题增加対原问题增加m个人工变量构造辅助问题判断辅助问题最优值g=0无解,停止人工变量xj是否为非基变量把人工变量对应的列从单纯形表中去掉进行换基迭代得到新矩阵BB中是否有人工变量得到初始可行基B求对应典式和检验数ξ判断ξk≤0得到最优解进行换基迭代得到新基判断Ak≤0问题无界否是否否是是否是七.函数代码及注释:function[x,minf,flag,cpt]=dcxsf(A,b,c)formatrat%使数据可以以分数形式输出c=-c;%将目标函数系数向量加负号得到单纯形表第0行[m,n]=size(A);%求约束矩阵的行数和列数m1=m;%保存下原来的行数s=eye(m);%生成秩为m的单位矩阵A=[As];%将s矩阵添加到A矩阵右侧A=[Ab];%将b向量添加到A矩阵右侧g1=zeros(1,n);%生成一个1行n列的零矩阵g1x=ones(1,m);%生成一个1行m列元素全为1的矩阵g1=[g1-x];%将g1和-x合并,产生一个新的前n列为0后m列为-1的单行矩阵g=[0];%初始化一个单元素零矩阵g1=[g1g];%将单元素零矩阵添加到g1右侧,生成人工向量的检验向量g1s1=n+m+1;%记录目前列数之和s2=zeros(1,m+1);%生成1行m+1列的零矩阵s2c=[cs2];%将s2添加到c右侧A1=zeros(m,1);%生成一个m行1列的零矩阵A1fori1=1:mA1(i1,1)=i1+n;%基变量的数值存储区endfori=1:mg1(1,:)=g1(1,:)+A(i,:);enddecide=find(g1(1,1:m+n)>0);%寻找g1中大于零的数值列数存于decide数组中while~isempty(decide)%当decide不为空i=decide(1);%将列数赋给itext=find(A(1:m,i)>0);%text存放该列中所有数值大于零的行数ifisempty(text)%如果text为空则无解flag=0;break;endmin=inf;%min初始化为无穷大fori1=1:m%当该列存在大于零的数值时ifA(i1,i)>0&A(i1,s1)/A(i1,i)<min%寻找比值最小的min=A(i1,s1)/A(i1,i);x1=i1;%将比值最小的行数赋给x1endendA(x1,:)=A(x1,:)/A(x1,i);%进行单位化c(1,:)=c(1,:)+(-1*c(1,i)*A(x1,:));g1(1,:)=g1(1,:)+(-1*g1(1,i)*A(x1,:));fori1=1:mifi1~=x1A(i1,:)=A(i1,:)+(-1*A(i1,i)*A(x1,:));%进行换机迭代endendA1(x1,1)=i;%将列数既对应的非基变量转换为基变量decide=find(g1(1,[1:m+n])>0);%再进行查找endifg1(1,s1)>0%无解情况flag=-1;endifg1(1,s1)==0%置空矩阵g1(1,:)=[];fori6=1:mA(:,n+1)=[];endfori6=1:mc(n+1)=[];enddecide=find(A1(1:m,1)>n);%查找是否有人工变量if~isempty(decide)while~isempty(decide)x1=decide(1);%存放的是人工变量的行数text=find(A(x1,1:n)~=0);%该行的所有元素都不为零的列坐标ifisempty(text)%如果text为空decide(1)=[];A1(x1,:)=[];A(x1,:)=[];m=m-1;elsei=text(1);%i保存列数A(x1,:)=A(x1,:)/A(x1,i);%进行单位化A1(x1,1)=i;c(1,:)=c(1,:)+(-1*c(1,i)*A(x1,:));fori1=1:mifi1~=x1A(i1,:)=A(i1,:)+(-1*A(i1,i)*A(x1,:));%进行换基迭代endenddecide(1)=[];%赋值为空text(1)=[];endendenddecide=find(c(1,1:n)>0);%decide存放c中该行中所有数值大于零的列数while~isempty(decide)i=decide(1);%将列数赋给itext=find(A(:,i)>0);%保存大于零的项的行数ifisempty(text)%为空的时候,则无解flag=0;%有可行解但无最优值,flag记为0c=[c;A];%将c添加到A矩阵上方的到对应解的单纯形表cpt=c;x=zeros(n,1);foro=1:nforo1=1:mifo==A1(o1,1)x(o,1)=A(o1,n+1);endendenddisp('该问题有可行解但没有最优解!')minf=-inf;%无最优值,将minf赋值为无穷小x=[];%解向量为空return;endmin=inf;%min初始化为无穷大fori1=1:mifA(i1,i)>0&A(i1,n+1)/A(i1,i)<min%寻找比值最小的min=A(i1,n+1)/A(i1,i);%更新最小值minx1=i1;%保存最小项的行数赋给x1endendA(x1,:)=A(x1,:)/A(x1,i);%单位化j=c(1,i);forj1=1:n+1c(1,j1)=c(1,j1)+A(x1,j1)*(-1)*j;%换基迭代endfori1=1:mifi1~=x1A(i1,:)=A(i1,:)+(-1*A(x1,:)*A(i1,i));endendA1(x1,1)=i;%将列数既对应的非基变量转换为基变量decide=find(c(1,1:n)>0);%再进行查找endc=[c;A];%得到对应解的单纯形表cpt=c;x=zeros(n,1);foro=1:nforo1=1:mifo==A1(o1,1)x(o,1)=A(o1,n+1);endendendminf=c(1,n+1);%得到最优值flag=1;%有最优值记录flag为1endifflag==0%有可行解但没有最优值情况disp('该问题有可行解但没有最优解!')x=[];%赋值为空minf=-inf;%最优值输出为无穷小endifflag==1%有可行解有最优值情况disp('该问题存在最优解!')x=x;minf=minf;end;ifflag==-1%没有可行解情况disp('该问题没有可行解!')x=[];%赋值为空cpt=[];minf=[];endend八.数据测试:测试数据1(有最优解情况)>>A=[10-520;01-310;002-11];>>b=[411]';>>c=[00-110];>>[x,minf,flag,cpt]=dcxsf(A,b,c)该问题存在最优解!x=13/25/21/200minf=-1/2flag=1cpt=000-1/2-1/2-1/2100-1/25/213/2010-1/23/25/2001-1/21/21/2运行结果正确。测试数据二(有可行解但没有最优解情况)>>A=[-10100;01010;-12001];>>b=[438]';>>c=[-2-5000];>>[x,minf,flag,cpt]=dcxsf(A,b,c)该问题有可行解但没有最优解!x=[]minf=-1/0flag=0cpt=200-50-15-101004010103-100-212运行结果正确。测试数据三(无可行解情况)>>A=[-11-10;-1-10-1];>>b=[12]';>>c=[2200];>>[x,minf,flag,cpt]=dcxsf(A,b,c)该问题没有可行解!x=[]minf=[]flag=-1cpt=[]运行结果正确。九.LINPROG函数说明:Matlab优化工具箱中有现成函数linprog对如下式描述的LP问题用线性规划优化方法求解:minf'xs.t.Ax<=bAeqx=beqlb<=x<=ub(一)LINPROG函数的调用形式:x=linprog(f,A,b)x=linprog(f,A,b,Aeq,beq)x=linprog(f,A,b,Aeq,beq,lb,ub)x=linprog(f,A,b,Aeq,beq,lb,ub,x0)x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)[x,fval]=linprog(…)[x,fval,exitflag]=linprog(…)[x,fval,exitflag,output]=linprog(…)[x,fval,exitflag,output,lambda]=linprog(…)(二)参数介绍:f,x,b,beq,lb,ub为向量,A,Aeq为矩阵。lb,ub为变量x的下界和上界,x为最优解向量,options为指定优化参数进行最小化。具体参数介绍见“LINPROG函数功能”部分。(1)Options的参数描述:
Display显示水平。选择’off’不显示输出;选择’Iter’显示每一步迭代过程的输出;选择’final’显示最终结果。MaxFunEvals函数评价的最大允许次数Maxiter最大允许迭代次数TolXx处的终止容限[x,fval]=linprog(…)左端fval返回解x处的目标函数值。(2)exitflag参数描述退出条件:exitflag>0表示目标函数收敛于解x处;exitflag=0表示已经达到函数评价或迭代的最大次数;exitflag<0表示目标函数不收敛。(3)output参数该参数包含下列优化信息:output.iterations迭代次数;output.cgiterationsPCG迭代次数(只适用于大型规划问题);output.algorithm所采用的算法。(4)lambda参数该参数是解x处的Lagrange乘子。它有以下一些属性:lambda.lower—lambda的下界;lambda.upper—lambda的上界;lambda.ineqlin—lambda的线性不等式;lambda.eqlin—lambda的线性等式。(三)LINPROG函数功能:x=linprog(f,A,b)求解问题minf’*x,约束条件为A*x<=b。x=linprog(f,A,b,Aeq,beq)求解上面的问题,但增加等式约束,即Aeq*x=beq。若没有不等式存在,则令A=[]、b=[]。x=linprog(f,A,b,Aeq,beq,lb,ub)定义设计变量x的下界lb和上界ub,使得x始终在该范围内。若没有等式约束,令Aeq=[]、beq=[]。x=linprog(f,A,b,Aeq,beq,lb,ub,x0)设置初值为x0。该选项只适用于中型问题,默认时大型算法将忽略初值。x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)用options指定的优化参数进行最小化。[x,fval]=linprog(...)返回解x处的目标函数值fval。[x,fval,exitflag]=linprog(...)返回exitflag值,描述函数计算的退出条件。[x,fval,exitflag,output]=linprog(...)返回包含优化信息的输出变量output。[x,fval,exitflag,output,lambda]=linprog(...)将解x处的Lagrange乘子返回到lambda参数中。十.LINPROG函数源代码及翻译:function[x,fval,exitflag,output,lambda]=linprog(f,A,B,Aeq,Beq,lb,ub,x0,options)%LINPROGLinearprogramming.LINPROG函数的线性规划%X=LINPROG(f,A,b)attemptstosolvethelinearprogrammingproblem:%%minf'*xsubjectto:A*x<=b%x%%X=LINPROG(f,A,b,Aeq,beq)solvestheproblemabovewhileadditionally%satisfyingtheequalityconstraintsAeq*x=beq.解决上述问题,并且满足约束条件aeq*x=beq%X=LINPROG(f,A,b,Aeq,beq,LB,UB)definesasetoflowerandupper%boundsonthedesignvariables,X,sothatthesolutionisin%therangeLB<=X<=UB.UseemptymatricesforLBandUB定义了一组上部和下部的边界上的设计变量,X,因此,该解决方案是在LB<=X<=UB的范围内,使用空矩阵LB和UB%ifnoboundsexist.SetLB(i)=-InfifX(i)isunboundedbelow;%setUB(i)=InfifX(i)isunboundedabove.%如果没有边界的存在:设置LB(i)=-inf,如果X(i)是无界的下面;设置UB(i),如果X(I)是无界的上面%X=LINPROG(f,A,b,Aeq,beq,LB,UB,X0)setsthestartingpointtoX0.This%optionisonlyavailablewiththeactive-setalgorithm.Thedefault%interiorpointalgorithmwillignoreanynon-emptystartingpoint.%设置起点为x0,这选项是唯一可用的有效集算法,默认的内点算法,将忽略任何非空的起点%X=LINPROG(f,A,b,Aeq,beq,LB,UB,X0,OPTIONS)minimizeswiththedefault%optimizationparametersreplacedbyvaluesinthestructureOPTIONS,an%argumentcreatedwiththeOPTIMSETfunction.SeeOPTIMSETfordetails.%OptionsareDisplay,Diagnostics,TolFun,LargeScale,MaxIter.%Currently,only'final'and'off'arevalidvaluesfortheparameter%DisplaywhenLargeScaleis'off'('iter'isvalidwhenLargeScaleis'on').%最大限度地减少使用默认的值在股权结构,优化参数替换的论点创建的OPTIMSET功能,有关详细的信息,请参见OPTIMSET。选项都显示的诊断,TolFun,大型,MAXITER。
目前,只有'最后的'和'关'是有效的参数值时的显示大规模的“关闭”。
%[X,FVAL]=LINPROG(f,A,b)returnsthevalueoftheobjectivefunctionatX:%FVAL=f'*X.%%[X,FVAL,EXITFLAG]=LINPROG(f,A,b)returnsanEXITFLAGthatdescribesthe%exitconditionofLINPROG.PossiblevaluesofEXITFLAGandthecorresponding%exitconditionsare%返回一个EXITFLAG,它描述了退出条件LINPROG。可能值的EXITFLAG和相应的退出条件
%1LINPROGconvergedtoasolutionX.收敛到情况x%0Maximumnumberofiterationsreached.%-2Nofeasiblepointfound.最大迭代次数达到-2可行点。%-3Problemisunbounded.问题是无限的%-4NaNvalueencounteredduringexecutionofalgorithm.NaN值的算法的执行过程中遇到的%-5Bothprimalanddualproblemsareinfeasible.和对偶问题是不可行的。%-7Searchdirectionbecametoosmall;nofurtherprogresscanbemade.%方向变得太小,可以没有进一步的进展。%[X,FVAL,EXITFLAG,OUTPUT]=LINPROG(f,A,b)returnsastructure%OUTPUTwiththenumberofiterationstakeninOUTPUT.iterations,thetype%ofalgorithmusedinOUTPUT.algorithm,thenumberofconjugategradient%iterations(ifused)inOUTPUT.cgiterations,andtheexitmessagein%OUTPUT.message.%返回一个结构,输出采取OUTPUT.iterations的迭代的数量,类型用OUTPUT.algorith法,数的共轭梯度,迭代在OUTPUT.cgiterations,(如果使用的话)和退出消息
%[X,FVAL,EXITFLAG,OUTPUT,LAMBDA]=LINPROG(f,A,b)returnsthesetof%LagrangianmultipliersLAMBDA,atthesolution:LAMBDA.ineqlinforthe%linearinequalitiesA,LAMBDA.eqlinforthelinearequalitiesAeq,%LAMBDA.lowerforLB,andLAMBDA.upperforUB.%%NOTE:theLargeScale(thedefault)versionofLINPROGusesaprimal-dual%method.Boththeprimalproblemandthedualproblemmustbefeasible%forconvergence.Infeasibilitymessagesofeithertheprimalordual,%orboth,aregivenasappropriate.Theprimalprobleminstandard%formis%minf'*xsuchthatA*x=b,x>=0.%Thedualproblemis%maxb'*ysuchthatA'*y+s=f,s>=0.返回组拉格朗日乘子LAMBDA,在解决方案:LAMBDA.ineqlin的线性不等式A,LAMBDA.eqlin的线性等式AEQ的,LAMBDA.lower为LB,为UBLAMBDA.upper。
%注:(默认值)的LINPROG版本的大规模使用一种原始的方法。原问题和对偶问题必须是行的,收敛。不可行的消息,无论是原始的或双或两者,给定为适当的。在标准的原始问题
%的形式是
minf'*x这样使A*×=b的中,x>=0。
%对偶问题是
%maxB*y,使得A'*Y+S=F,S>=0。%Ifjust'defaults'passedin,returnthedefaultoptionsinX%DefaultMaxIterissetto[]becauseitsvaluedependsonthealgorithm.如果在刚刚通过的“默认”,返回的默认选项在X;默认MaxIter被设置为[],因为它的价值取决于算法。defaultopt=struct('Display','final',...'TolFun',[],'Diagnostics','off',...'LargeScale','on','MaxIter',[],...'Simplex','off');ifnargin==1&&nargout<=1&&isequal(f,'defaults')x=defaultopt;returnend%Handlemissingargumentsifnargin<9,options=[];ifnargin<8,x0=[];ifnargin<7,ub=[];ifnargin<6,lb=[];ifnargin<5,Beq=[];ifnargin<4,Aeq=[];end,end,end,end,end,end%Checkfornon-doubleinputs%SUPERIORFLOATerrorswhensuperiorinputisneithersinglenordouble;%Weusetry-catchtooverrideSUPERIORFLOAT'serrormessagewheninput%datatypeisinteger.非双输入检查
%SUPERIORFLOAT错误时,最优的输入既不是单一的,也不是双的;
%我们使用try-catch覆盖SUPERIORFLOAT的错误信息时,输入数据类型是整数。
trydataType=superiorfloat(f,A,B,Aeq,Beq,lb,ub,x0);if~isequal('double',dataType)error('optim:linprog:NonDoubleInput',...'LINPROGonlyacceptsinputsofdatatypedouble.')endcatcherror('optim:linprog:NonDoubleInput',...'LINPROGonlyacceptsinputsofdatatypedouble.')endifnargout>4computeLambda=1;elsecomputeLambda=0;end%Optionssetup选项的设置ifisfield(options,'Simplex')useSimplex=isequal(optimget(options,'Simplex',defaultopt,'fast'),'on');elseuseSimplex=isequal(defaultopt.Simplex,'on');endlargescale=isequal(optimget(options,'LargeScale',defaultopt,'fast'),'on');diagnostics=isequal(optimget(options,'Diagnostics',defaultopt,'fast'),'on');switchoptimget(options,'Display',defaultopt,'fast')case{'off','none'}verbosity=0;case'iter'verbosity=2;case'final'verbosity=1;otherwiseverbosity=1;end%Settheconstraintsup:defaultsandchecksize限制设置:默认设置,并检查大小[nineqcstr,nvarsineq]=size(A);[neqcstr,nvarseq]=size(Aeq);nvars=max([length(f),nvarsineq,nvarseq]);%IncaseAisemptyncstr=nineqcstr+neqcstr;ifisempty(f),f=zeros(nvars,1);endifisempty(A),A=zeros(0,nvars);endifisempty(B),B=zeros(0,1);endifisempty(Aeq),Aeq=zeros(0,nvars);endifisempty(Beq),Beq=zeros(0,1);end%Settocolumnvectors设置为列向量f=f(:);B=B(:);Beq=Beq(:);if~isequal(length(B),nineqcstr)error('optim:linprog:SizeMismatchRowsOfA',...'ThenumberofrowsinAmustbethesameasthelengthofb.');elseif~isequal(length(Beq),neqcstr)error('optim:linprog:SizeMismatchRowsOfAeq',...'ThenumberofrowsinAeqmustbethesameasthelengthofbeq.');elseif~isequal(length(f),nvarsineq)&&~isempty(A)error('optim:linprog:SizeMismatchColsOfA',...'ThenumberofcolumnsinAmustbethesameasthelengthoff.');elseif~isequal(length(f),nvarseq)&&~isempty(Aeq)error('optim:linprog:SizeMismatchColsOfAeq',...'ThenumberofcolumnsinAeqmustbethesameasthelengthoff.');end[x0,lb,ub,msg]=checkbounds(x0,lb,ub,nvars);if~isempty(msg)exitflag=-2;x=x0;fval=[];lambda=[];output.iterations=0;output.algorithm='';%notknownatthisstage不知道这个阶段output.cgiterations=[];output.message=msg;ifverbosity>0disp(msg)endreturnendcaller='linprog';ncstr=nineqcstr+neqcstr;iflargescaleOUTPUT.algorithm='large-scale:interiorpoint';elseifuseSimplexOUTPUT.algorithm='medium-scale:simplex';elseOUTPUT.algorithm='medium-scale:active-set';endifdiagnostics%Dodiagnosticsoninformationsofar做诊断信息gradflag=[];hessflag=[];line_search=[];constflag=0;gradconstflag=0;non_eq=0;non_ineq=0;lin_eq=size(Aeq,1);lin_ineq=size(A,1);XOUT=ones(nvars,1);funfcn{1}=[];ff=[];GRAD=[];HESS=[];confcn{1}=[];c=[];ceq=[];cGRAD=[];ceqGRAD=[];msg=diagnose('linprog',OUTPUT,gradflag,hessflag,constflag,gradconstflag,...line_search,options,defaultopt,XOUT,non_eq,...non_ineq,lin_eq,lin_ineq,lb,ub,funfcn,confcn,ff,GRAD,HESS,c,ceq,cGRAD,ceqGRAD);endif(largescale)if(useSimplex)warning('optim:linprog:IgnoreSimplexOn',...['Simplexmethoddoesnotcurrentlysolvelarge-scaleproblems;\n'...'callinglarge-scaleinteriorpointmethod.(Torunsimplex,set\n'...'OPTIONS.LargeScaleto''off''.)'])endif~isempty(x0)&&verbosity>0warning('optim:linprog:IgnoreStartPoint',...['Largescale(interiorpoint)methodusesabuilt-instartingpoint;\n'...'ignoringuser-suppliedX0.'])end%SetthedefaultvaluesofTolFunandMaxIterforthisalgorithm设置的默认值对于此算法的TolFun和MAXITER
defaultopt.TolFun=1e-8;defaultopt.MaxIter=85;[x,fval,lambda,exitflag,output]=lipsol(f,A,B,Aeq,Beq,lb,ub,options,defaultopt,computeLambda);elseif(useSimplex)if~isempty(x0)&&verbosity>0warning('optim:linprog:IgnoreStartPoint',...['Simplexmethodusesabuilt-instartingpoint;ignoringuser-suppliedX0.'])end%SetthedefaultvaluesofTolFunandMaxIterforthisalgorithm设置的默认值对于此算法的TolFun和MAXITERdefaultopt.TolFun=1e-6;defaultopt.MaxIter='100*NumberOfVariables';[x,fval,lambda,exitflag,output]=simplex(f,A,B,Aeq,Beq,lb,ub,options,defaultopt,computeLambda);%Remapexitflagsifnecessary
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新能源汽车推广合同协议
- 跨国影视项目联合拍摄及发行合同
- 个体股东协议合同范本
- 乡村出租平房合同范本
- 刷油漆维护合同范例
- 农村老宅出售合同范例
- 三合作伙伴合同范例
- 1984劳动合同范例
- 分期销售合同范例
- 中日合资日文合同范例
- 2025年骨科常考复试试题及答案
- 企业人力资源管理师知识考试题及答案
- 2025年山东省高考物理复习方法及备考策略指导(深度课件)
- 2025年美容师(技师)试题题库
- 做一个指南针(课件)-二年级科学下册教科版
- GB/T 25246-2025畜禽粪肥还田技术规范
- 2025至2030年中国十二烷基磺酸钠数据监测研究报告
- 全国计算机等级考试《三级信息安全技术》专用教材【考纲分析+考点精讲+真题演练】
- 2025年上海市各区初三语文一模试题汇编之综合运用
- 2025年上海烟草集团有限责任公司招聘笔试参考题库含答案解析
- 2025年国家电网校园招聘历年高频重点提升(共500题)附带答案详解
评论
0/150
提交评论