第九章最优化方法.docx
《第九章最优化方法.docx》由会员分享,可在线阅读,更多相关《第九章最优化方法.docx(19页珍藏版)》请在冰豆网上搜索。
第九章最优化方法
第九章最优化方法
本章主要介绍线性规划、0-1规划、非线性规划等问题的MATLAB求解。
9.1线性规划(LinearProgramming,简写为LP)问题
线性规划问题就是求多变量线性函数在线性约束条件下的最优值。
满足约束条件的解称为可行解,所有可行解构成的集合称为可行域,满足目标式的可行解称为最优解。
MATLAB解决的线性规划问题的标准形式为:
min
其中
为列向量,
为矩阵。
其它形式的线性规划问题都可经过适当变换化为此标准形式。
在MATLAB中求解线性规划问题函数为linprog,其使用格式为:
[x,fval,exitflag,output,lambda]=linprog(f,A,b,Aeq,beq,lb,ub)
输入部分:
其中各符号对应线性规划问题标准形式中的向量和矩阵,如果约束条件中有缺少,则其相应位置用空矩阵[]代替。
输出部分:
其中x为最优解,用列向量表示;fval为最优值;exitflag为退出标志,若exitflag=1表示函数有最优解,若exitflag=0表示超过设定的迭代最大次数,若exitflag=-2,表示约束区域不可行,若exitflag=-3,表示问题无解,若exitflag=-4,表示执行迭代算法时遇到NaN,若exitflag=-5,表示原问题和对偶问题均不可行,若exitflag=-7,表示搜索方向太小,不能继续前进;output表明算法和迭代情况;lambda表示存储情况。
例1用linprog函数求下面的线性规划问题
输入如下:
>>f=[-5,-4,-6];
A=[1-11;324;320];
b=[20;42;30];
lb=zeros(3,1);
[x,fval,exitflag,output,lambda]=linprog(f,A,b,[],[],lb)
注意:
由于该问题没有等式约束,所以输入格式中相应的位置用[]代替,变量没有上限约束,所以ub也用[]代替,但由于其在最后,可以不写。
输出结果如下:
Optimizationterminated.
x=%最优解
0.0000
15.0000
3.0000
fval=%最优值
-78.0000
exitflag=%函数收敛于解
1
output=
iterations:
6
algorithm:
'large-scale:
interiorpoint'
cgiterations:
0
message:
'Optimizationterminated.'
lambda=
ineqlin:
[3x1double]
eqlin:
[0x1double]
upper:
[3x1double]
lower:
[3x1double]
例2一家家具公司生产桌子和椅子,用于生产的全部劳动力共计450个工时,原料是400个单位的木材。
每张桌子使用15个工时的劳动力,20个单位的木材,售价为80元。
每张椅子使用10个工时,用料5个单位,售价45元。
问为达到最大效益,应如何安排生产?
解设生产桌子
个,椅子
个,建立如下模型:
输入如下:
>>f=[-80,-45];
A=[20,5;15,10];
b=[400,450];
lb=zeros(2,1);
[x,fval,exitflag]=linprog(f,A,b,[],[],lb)
结果如下:
Optimizationterminated.
x=
14.0000
24.0000
fval=
-2.2000e+003
exitflag=
1
注意:
由于linprog是求目标函数的最小值,如求目标函数
的最大值,可先求出
的最小值fval,则-fval就是
的最大值。
本例只输出最优解、最优值和退出标志,可见生产14个桌子,24个椅子,可获得最大利润2200元。
9.20-1规划
0-1规划是一种特殊形式的整数规划,它的决策变量仅取值0或1.一般用0表示放弃,1表示选取,故0-1规划可以用来处理选址问题、指派问题、装箱问题、项目评价、资金分配、生产计划安排等问题。
在MATALB中求解0-1规划问题函数为bintprog,其针对下述0-1规划:
min
其中
为列向量,
为矩阵。
使用格式为:
[x,fval,exitflag,output]=bintprog(f,A,b,Aeq,beq)
输入部分:
其中各符号对应0-1规划问题标准形式中的向量和矩阵,如果约束条件中有缺少,则其相应位置用空矩阵[]代替。
输出部分:
其中x为最优解,用列向量表示;fval为最优值;exitflag为退出标志,若exitflag=1表示函数有最优解,若exitflag=-1表示超过设定的迭代最大次数,若exitflag=-2,表示问题不可行,若exitflag=-4,表示搜索节点数超过了设定的搜索节点最大个数,若exitflag=-5,表示搜索时间超过了设定的指令运行的最大秒数,若exitflag=-6,表示LP求解器在某节点处求解LP松弛问题时的迭代次数超过了设定的迭代次数;output包含使用算法、迭代次数、搜索过的节点数、算法执行时间、算法终止原因。
例3求解下述0-1规划问题。
利用bintprog函数求解如下:
>>f=-[1;2;2;-6;-4];
A=[3,2,-1,4,2;2,4,-2,-1,-2];
b=[5;5];
[x,fval,exit,output]=bintprog(f,A,b)
输出结果:
Optimizationterminated.
x=
1
1
1
0
0
fval=
-5
exit=
1
output=
iterations:
4
nodes:
1
time:
0.0781
algorithm:
'LP-basedbranch-and-bound'
branchStrategy:
'maximumintegerinfeasibility'
nodeSrchStrategy:
'bestnodesearch'
message:
'Optimizationterminated.
这表明,当
时,目标函数取最大值5。
例4资金分配问题,某企业在今后3年内有5个工程考虑开工,每项工程的期望收入和年度费用如表所示。
假定每一项已经批准的工程要在整3年内完成。
企业应如何选择工程,使企业总收入最大?
工程
费用(千元)
收入(千元)
第一年
第二年
第三年
1
5
1
8
20
2
4
7
10
40
3
3
9
2
20
4
7
4
1
15
5
8
6
10
30
最大可用资金数
25
25
25
解设决策变量为
:
其中
,
表示放弃第
项工程,
表示选择第
项工程。
该问题的数学模型为:
利用bintprog函数求解如下:
f=-[20;40;20;15;30];
A=[5,4,3,7,8;1,7,9,4,6;8,10,2,1,10];
b=[25;25;25];
[x,fv,exit]=bintprog(f,A,b)
输出结果如下:
Optimizationterminated.
x=
1
1
1
1
0
fv=
-95
exit=
1
上述结果表明,该企业选择第1,第2,第3,第4项工程,可以获得最大利润95千元。
指派问题:
设有
项工作分配给
个人去做,每人做一项,由于个人的工作效率不同,因而完成同一工作所需时间也不同,设人员
完成工作
所需时间为
(称为效率矩阵),问如何分配工作,使得完成所有工作所用的总时间最少?
这类问题称为指派问题(AssignmentProblem),也称最优匹配问题,它是一类典型的0-1规划问题。
例5有4个工人被分派做4项工作,每项工作只能一人做,每人只能做一项工作。
现设每个工人做每项工作的耗时如表所示,求总耗时最少的分配方案。
表1时间表时间单位:
小时
工作
耗时
工人
1
2
3
4
1
15
18
21
24
2
19
23
22
18
3
26
17
16
19
4
19
21
23
17
解设决策变量为
,只取0或1。
表示工人
完成工作
;
表示工人
不做工作
。
于是,上述问题的数学模型如下:
下面给出Matlab计算程序。
>>f=[15;18;21;24;19;23;22;18;26;17;16;19;19;21;23;17];
o4=ones(1,4);z4=zeros(1,4);
z8=zeros(1,8);z12=zeros(1,12);
Aeq1=[o4,z12;z4,o4,z8;z8,o4,z4;z12,o4];
e4=eye(4);
Aeq2=[e4,e4,e4,e4];
Aeq=[Aeq1;Aeq2];
beq=ones(8,1);
[x,fv,exit]=bintprog(f,[],[],Aeq,beq);
x=transpose(reshape(x,4,4))
计算接可以得出:
fv=
70
exit=
1
指派方阵
x=
1000
0001
0010
0100
它表示的最优指派方案为:
工人1做工作1;工人2做工作4;工人3做工作3;工人4做工作2。
该指派方案耗时最少,为70小时。
9.3非线性规划
9.3.1有约束的一元函数的极(最)小值
在MATLAB中使用fminbnd函数求一元函数
在区间
上的极(最)小值。
其调用格式有:
[x,fval,exitflag,output]=fminbnd(fun,x1,x2,options)
其中输入参数fun为目标函数的表达式字符串或MATLAB定义的M函数,x1和x2为自变量x的取值范围,options为指定优化参数选项;输出参数x为函数fun在区间
上取最小值时的x值,fval为目标函数的最小值,exitflag为终止迭代的条件,output为优化信息,参见optimset函数。
若参数exitflag>0,表示函数收敛于x,若exitflag=0,表示超过函数估计值或迭代的最大数字,exitflag<0表示函数不收敛于x;若参数output=iterations表示迭代次数,output=funccount表示函数赋值次数,output=algorithm表示所使用的算法。
例6计算函数
在区间(0,1)内的最小值。
在命令窗口输入:
>>[x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)
输出结果为:
x=
0.5223
fval=
0.3974
exitflag=
1
output=
iterations:
8
funcCount:
9
algorithm:
'goldensectionsearch,parabolicinterpolation'
message:
[1x112char]
表明该函数在x=0.5223时取最小值0.3974。
ezplot('(x^3+cos(x)+x*log(x))/exp(x)',0,1)
为简化输出结果,可输入:
>>[x,fval]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)
9.3.2无约束多元函数极(最)小值
在MATLAB中使用fminsearch函数和fminunc函数求无约束多元函数的极(最)小值。
(1)fminsearch函数
该函数的调用格式为:
[x,fval,exitflag,output]=fminsearch(fun,x0,options)
其中输入参数fun为目标函数的表达式字符串或MATLAB自定义的M函数,x0为初始点,options为指定优化参数选项;输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致。
例7求
的最小值点。
在命令窗口输入:
>>[x,fval]=fminsearch('2*x
(1)^3+4*x
(1)*x
(2)^3-10*x
(1)*x
(2)+x
(2)^2',[0,0])
输出结果为:
x=
1.00160.8335
fval=
-3.3241
表明当x1=1.0016,x2=0.8335时函数的最小值为-3.3241。
(2)fminunc函数
该函数的调用格式为:
[x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0,options)
其中输入参数fun为目标函数的表达式字符串或MATLAB自定义的M函数,x0为初始点,options为指定优化参数选项;输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致,grad为函数在解x处的梯度值,hessian为目标函数在解x处的海赛(Hessian)值。
fminsearch利用了单纯形法的原理,fminunc利用了拟牛顿法的原理。
当函数的阶数大于2时,使用fminunc比fminsearch更有效,但当所选函数高度不连续时,使用fminsearch效果较好,这两个函数都容易陷入局部优化,并且结果的正确与否还要取决于初值点x0的选取。
利用fiminunc求例7的最小值。
在名利窗口输入:
>>[x,fval]=fminunc('2*x
(1)^3+4*x
(1)*x
(2)^3-10*x
(1)*x
(2)+x
(2)^2',[0.5,0.5])
输出结果为:
x=
1.00160.8335
fval=
-3.3241
此结果和fminsearch函数的求解结果一样。
9.3.3有约束的多元函数最小值
非线性有约束的多元函数的标准形式为:
其中:
x,b,beq,lb,ub是向量,A,Aeq为矩阵,C(x)、Ceq(x)是返回向量的函数,f(x)为目标函数,f(x)、C(x)、Ceq(x)可以是非线性函数。
在MATLAB用fmincon函数,求有约束的多元函数的最小值,其调用格式有:
x=fmincon(fun,x0,A,b)
x=fmincon(fun,x0,A,b,Aeq,beq)
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
[x,fval]=fmincon(…)
[x,fval,exitflag]=fmincon(…)
[x,fval,exitflag,output]=fmincon(…)
[x,fval,exitflag,output,lambda]=fmincon(…)
[x,fval,exitflag,output,lambda,grad]=fmincon(…)
[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(…)
其中fun为目标函数,它可用前面的方法定义;x0为初始值;A、b满足线性不等式约束
,若没有不等式约束,则取A=[],b=[];Aeq、beq满足等式约束
,若没有,则取Aeq=[],beq=[];lb、ub满足
,若没有界,可设lb=[],ub=[];nonlcon的作用是通过接受的向量x来计算非线性不等约束
和等式约束
分别在x处的估计C和Ceq,通过M文件建立,如:
>>x=fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非线性约束函数,并保存为mycon.m:
function[C,Ceq]=mycon(x)
C=…%计算x处的非线性不等约束
的函数值。
Ceq=…%计算x处的非线性等式约束
的函数值。
输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致,lambda是Lagrange乘子,它体现哪一个约束有效,grad为函数在解x处的梯度值,hessian为目标函数在解x处的海赛(Hessian)值。
例8求下面问题在初始点x=(10,10,10)处的最优解。
min
sub.to
解:
约束条件的标准形式为
sub.to
在命令窗口输入:
>>fun='-x
(1)*x
(2)*x(3)';
x0=[10,10,10];
A=[-1-2-2;122];
b=[0;72];
[x,fval]=fmincon(fun,x0,A,b)
输出结果为:
Optimizationterminated:
magnitudeofdirectionalderivativeinsearch
directionlessthan2*options.TolFunandmaximumconstraintviolation
islessthanoptions.TolCon.
Activeinequalities(towithinoptions.TolCon=1e-006):
lowerupperineqlinineqnonlin
2
x=24.000012.000012.0000
fval=
-3.4560e+003
例9求表面积为36而体积最大的长方体的体积。
解设长方体的三个棱长分别为x1,x2,x3,则体积v=x1*x2*x3,且满足约束条件2(x1*x2+x2*x3+x3*x1)=36。
首先建立目标函数的M文件myopt1.m,内容如下:
functionf=myopt1(x)
f=-x
(1)*x
(2)*x(3);%负号表示最小值,即x
(1)*x
(2)*x(3)的最大值
再建立非线性约束函数的M文件mycon.m,内容如下:
function[C,Ceq]=mycon(x)
C=[];
Ceq=x
(1)*x
(2)+x
(2)*x(3)+x(3)*x
(1)-18;
由于没有非线性不等式,故C为[]。
在命令窗口输入:
>>[x,fval]=fmincon('myopt1',[111],[],[],[],[],[000],[],'mycon')
输出结果为:
x=
2.44952.44952.4495
fval=
-14.6969
结果表明当x1=x2=x3=2.4495时,体积最大值为14.6969。
该问题的精确解为x1=x2=x3=
时最大体积为
。
9.4二次规划
二次规划问题(quadraticprogramming)的标准形式为:
sub.to
其中,H、A、Aeq为矩阵,f、b、beq、lb、ub、x为向量。
其它形式的二次规划问题都可转化为标准形式。
MATLAB中使用quadprog函数求解二次规划,其调用格式有:
x=quadprog(H,f,A,b)
x=quadprog(H,f,A,b,Aeq,beq)
x=quadprog(H,f,A,b,Aeq,beq,lb,ub)
x=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)
x=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]=quadprog(…)
[x,fval,exitflag]=quadprog(…)
[x,fval,exitflag,output]=quadprog(…)
[x,fval,exitflag,output,lambda]=quadprog(…)
例10求解下面二次规划问题
解:
则
,
,
在命令窗口中输入:
>>H=[1-1;-12];
f=[-2;-6];
A=[11;-12;21];
b=[2;2;3];
lb=zeros(2,1);
[x,fval,exitflag,output,lambda]=quadprog(H,f,A,b,[],[],lb)
输出结果为:
x=%最优解
0.6667
1.3333
fval=%最优值
-8.2222
exitflag=%收敛
1
output=
iterations:
3
algorithm:
'medium-scale:
active-set'
firstorderopt:
[]
cgiterations:
[]
lambda=
lower:
[2x1double]
upper:
[2x1double]
eqlin:
[0x1double]
ineqlin:
[3x1double]
>>lambda.ineqlin
ans=
3.1111
0.4444
0
>>lambda.lower
ans=
0
0
此结果说明第1、2个约束条件有效,其余无效。
9.5多目标规划
多目标规划是指在一组约束下,对多个不同目标函数进行优化。
它的一般形式为
其中:
x、b、beq、lb、ub是向量;A、Aeq为矩阵;C(x)、Ceq(x)和F(x)是返回向量的函数;F(x)、C(x)、Ceq(x)可以是非线性函数;weight为权值系数向量,用于控制对应的目标函数与用户定义的目标函数值的接近程度;goal为用户设计的与目标函数相应的目标函数值向量;
为一个松弛因子标量;F(x)为多目标规划中的目标函数向量。
MATLAB中求解多目标规划的函数为fgoalattain,其调用格式有:
x=fgoalattain(fun,x0,goal,weight)
x=fgoalattain(fun,x0,goal,weight,A,b)
x=fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x=fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x=fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x=fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
[x,fval]=fgoalattain(…)
[x,fval,att