第三讲Matlab优化工具一、简介在建模过程中,许多问题都可归结为“最优化(optimization)”问题,如最大利润、最小成本、最短路径等,最优化问题也称数学规划。要描述一个最优化问题,应明确三个基本要素:决策变量(decisionvariables):它们是决策者所控制的变量,它们取什么值需要决策者来决策,最优化问题的求解就是找出决策变量的最优取值。约束条件(constraints):它们是决策变量在现实世界中所受到的限制,或者说决策变量在这些限制范围之内取值才有实际意义。目标函数(objectivefunction):它代表决策者希望对其进行优化的那个指标,目标函数是决策变量的函数。最优化问题的分类,按决策变量是否是时间的函数分为动态优化和静态优化。按目标函数与约束条件是否是决策变量的线性函数分为线性规划和非线性规划,按决策变量是否为整数分为整数规划和非整数规划,此外还有0-1规划、二次规划、多目标优化、最小最大优化问题等。可行解(feasiblesolution):满足全部约束条件的决策向量。可行域:全部可行解构成的集合。最优解:使目标函数达到最优值(最大或最小值,并且有界)的可行解。无界解:若求极大化则目标函数在可行域中无上界,若求极小化则目标函数在可行域中无下界。二、线性规划(Linearprogramming)Matlab中,线性规划问题的标准形式为min..TeqeqcxAxbstAxblbxub其中1212(,,),(,,)TTnnccccxxxx思考:最大值问题maxTcx和不等式约束Axb怎样转化为上述标准形式?(加负号;两边同乘-1)Matlab中解上述线性规划问题的指令:x=linprog(c,A,b,Aeq,beq,lb,ub)或[x,fval]=linprog(c,A,b,Aeq,beq,lb,ub)说明:当上述指令中某个输入参数缺省时应在相应位置填上空矩阵[],若从某项输入参数开始往后各项参数都缺省,则可以将其全部省略而不用补上[]。例如线性规划问题min,..TcxstAxb,可以表示为x=linprog(c,A,b);而问题min,..TAxbcxstlbxub则必须表示为x=linprog(c,A,b,[],[],lb,ub)例:解下列线性规划问题1、12312312312min5462032442..32300,1,2,3izxxxxxxxxxstxxxi2、123423412123124max4001000300200202316..3424050,0,0zxxxxxxxxxstxxxxxx解:1、c=[-5-4-6];A=[1-11;324;320];b=[204230];lb=zeros(3,1);[x,fval]=linprog(c,A,b,[],[],lb)2、c=[4001000300-200];c=-c;A=[2300;3400];b=[1624];Aeq=[0-211];beq=[0];lb=zeros(4,1);ub=[infinf5inf]';[x,fval]=linprog(c,A,b,Aeq,beq,lb,ub)三、非线性规划(Nonlinearprogramming)当目标函数、约束条件中至少有一个表达式是非线性函数时称为非线性规划,一般形式:min(),..()0,()0eqeqfxAxbAxbstcxceqxlbxub线性约束非线性约束其中(),()cxceqx都是函数向量。Matlab中求解非线性规划的指令:x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)调用格式与linprog函数的调用格式相同。其中x0是最优值x的初始值(估计值),fun和nonlcon是目标函数和非线性约束函数文件的函数句柄。例:求解非线性规划问题1、123123min()..02272fxxxxstxxx取初值0[10,10,10]xobj=inline('-x(1)*x(2)*x(3)','x')x0=[101010];A=[-1-2-2;122];b=[072];[x,fval]=fmincon(obj,x0,A,b)2、2212122212min4..(4)2zxxxxstxx先建立目标函数文件[obj1.m]和非线性约束条件函数文件[nonlcon1.m]然后在命令窗口输入:Aeq=[11];beq=4;x0=[11];[xfval]=fmincon(@obj1,x0,[],[],Aeq,beq,[],[],@nonlcon1);四、整数线性规划(IntegerLinearprogramming)目标函数和约束条件都是线性函数,且决策变量都取整数值的数学规划,称为整数线性规划,简记为ILP,解整数线性规划问题的主要方法是分支定界法。Matlab中没有现成的解整数规划的库函数,可以参考外编程序[intprog.m]。基本语法为x=intprog(c,A,b,Aeq,beq,lb,ub,x0,id,options)其用法与相关参数说明同linprog.m,该程序不仅可以解纯整数规划,还可以解混合规划问题(即只有部分变量取整数的情况),输入参数id是标记整数变量索引号的列向量,1表示整数,0表示实数,默认情况是全1向量即纯整数规划。例:求解下列整数规划问题123123123123123max4292..40,1,2,3,,jfxxxxxxxxxstxxxxjxxx取整数c=-1*[11-4];A=[112;11-1;-111];b=[924];lb=[000];[x,fval]=intprog(c,A,b,[],[],lb)五、0-1型整数线性规划(Binaryintegerprogramming)作为整数线性规划的一种特殊情况,0-1型整数线性规划要求决策变量的值只取0或者1。Matlab中解0-1规划问题的函数是bintprog,其用法与linprog相似。x=bintprog(c,A,b,Aeq,beq)例:求解下列0-1型整数线性规划1231231231223123max3252244..346,,01fxxxxxxxxxstxxxxxxx为或c=-1*[-32-5];A=[12-1;141;110;041];b=[2436];[x,fval]=bintprog(c,A,b)六、二次规划问题(Quadraticprogramming)非线性规划问题的一种特殊情况,二次规划要求目标函数是决策变量的二次函数,而约束条件是线性的。其一般形式为:1min2..TTxHxfxAxbstAeqxbeqlbxubMatlab中解二次规划问题的语法为x=quadprog(H,f,A,b,Aeq,beq,lb,ub)其用法同linprog函数。例:求解下列二次规划问题22112212121212min22262..220,0zxxxxxxxxstxxxxH=[2-2;-24];f=[-2-6];A=[11;-12];b=[22];lb=[00];[x,fval]=quadprog(H,f,A,b,[],[],lb)七、无约束优化问题(Unconstrainednonlinearprogramming)类似于高等数学中的极值问题,即求函数的极小值或极大值。Matlab中与此有关的主要是两个函数:fminbnd和fminsearch。[x,fmin]=fminbnd(fun,a,b)求一元函数fun在[a,b]区间上的局部极小值点及极小值。[x,fmin]=fminsearch(fun,x0)求多元函数fun在初值x0附近的局部极小值点及极小值。这里x,x0均为向量。例1、求函数2sinxyex在[0,5]上的最大值和最小值。[xmin,fmin]=fminbnd('2*exp(-x)*sin(x)',0,5)[xmax,fmax]=fminbnd('-2*exp(-x)*sin(x)',0,5)%fmax=-fmax例2、求函数22(,)(42421)xfxyxyxyye在点(-1,1)附近的极小值。f=inline('(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)*exp(x(1))')x0=[-1,1];[xmin,fmin]=fminsearch(f,x0)注意:1、多元函数要写成向量函数的形式。2、上面的函数找到的都是局部最优解,不一定是全局最优,如果要求全局最优解,在精度要求不是很高的情况下可以尝试使用min和max函数。其它还有多目标优化问题、最小最大值问题等,可参考相关资料。上机练习1、求解下列数学规划问题:⑴1234min3425fxxxx⑵123min548fxxx1234123412341234422314..2322,,0,xxxxxxxxstxxxxxxxx无约束12312122624..53150,1,2,3jxxxxxstxxxj⑶123min()fxxxx⑷12max3fxx1231232122202272..102010xxxxxxstxxx12121212123235410..25,0,,xxxxstxxxxxx为整数⑸123min432fxxx⑹221212121min()262fxxxxxxx12312323123012534433..1,,xxxxxxstxxxxx为或12121212222..23,0xxxxstxxxx2、作出下列函数的图形,观察所有局部极大、局部极小和全局最大、全局最小值点的粗略位置,并用MATLAB函数fminbnd和fminsearch求各极值点的确切位置。⑴22()sin(2),[2,2]fxxxxx;⑵53()32010,[3,3]fxxxx⑶32()2,[0,3]fxxxxx。