[x,fval,attainfactor] = fgoalattain(...)
[x,fval,attainfactor,exitflag] = fgoalattain(...)
[x,fval,attainfactor,exitflag,output] = fgoalattain(...)
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(...) 说明:
fgoalattain 求解多目标达到问题。
x = fgoalattain(fun,x0,goal,weight) 试图通过变化x来使目标函数fun达到goal指定的目标。初值为x0,weight参数指定权重。
x = fgoalattain(fun,x0,goal,weight,A,b) 求解目标达到问题,约束条件为线性不等式A*x <= b。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq) 求解目标达到问题,除提供上面的线性不等式外,还提供线性等式Aeq*x = beq。当没有不等式存在时,设置A=[ ]和b=[ ]。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub) 为设计变量x定义下界lb和上界ub集合,这样始终有lb <= x <= ub。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon) 将目标达到问题归结为nonlcon参数定义的非线性不等式c (x)或非线性等式ceq (x)。fgoalattain优化的约束条件为c(x) <= 0 和ceq(x) = 0。若不存在边界,设置lb=[ ] 和(或)ub=[ ]。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options) 用options中设置的优化参数进行最小化。
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2,...) 将问题参数P1,P2等直接传递给函数fun和nonlcon。若不需要参数A,b,Aeq,beq,lb,ub,nonlcon和options,将它们设置为空矩阵。
[x,fval] = fgoalattain(...) 返回解x处的目标函数值。
[x,fval,attainfactor] = fgoalattain(...) 返回解x处的目标达到因子。
[x,fval,attainfactor,exitflag] = fgoalattain(...) 返回exitflag参数,描述计算的退出条件。
[x,fval,attainfactor,exitflag,output] = fgoalattain(...) 返回包含优化信息的结构输出output。
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(...) 返回解x处包含Lagrange乘子的lambda参数。
·goal变量
目标希望达到的向量值。向量的长度与fun函数返回的目标数F相等。fgoalattain函数试图通过最小化向量F中的值来达到goal参数给定的目标。
·nonlcon函数 该函数意义同前。 ·options变量
优化参数选项。可以用optimset函数设置或改变这些参数的值。
DerivativeCheck 比较用户提供的导数(目标函数或约束函数的梯度)和有限差分导数。
Diagnostics 打印将要最小化或求解的函数的诊断信息。 DiffMaxChange 变量中有限差分梯度的最大变化。 DiffMinChange 变量中有限差分梯度的最小变化。
Display 显示水平。设置为’off’时不显示输出;设置为’iter’时显示每一次迭代的输出;设置为’final’时显示最终结果。
GoalsExactAchieve 使得目标个数刚好达到,不多也不少。 GradConstr 用户定义的约束函数的梯度。
GradObj 用户定义的目标函数的梯度。使用大型算法时必须使用梯度,对于中型方法则是可选项。
MaxFunEvals
MaxIter 函数迭代的允许最大次数。
MeritFunction 如果设为’multiobj’,则使用目标达到或最大最小化目标函数的方法;若设置为’singleobj’,则使用fmincon函数计算目标函数。
TolCon 约束矛盾的终止容限。 TolFun 函数值处的终止容限。 TolX x处的终止容限。 ·weight变量
为权重向量,可以控制低于或超过fgoalattain函数指定目标的相对程度。当goal的值都是非零值时,为了保证活动对象超过或低于的比例相当,将权重函数设置为abs (goal)(活动对象为阻止解处目标改善的对象集合)。
注意:
(1)当目标值中的任意一个为零时,设置weight = abs (goal)将导致目标约束看起来更像硬约束,而不像目标约束;
(2)当加权函数weight为正时,fgoalattain函数试图使对象小于目标值。为了使目标函数大于目标值,将权重weight设置为负。为了使目标函数尽可能地接近目标值,使用Goal-
ExactAchieve参数,将fun函数返回的第一个元素作为目标。
·attainfactor变量
attainfactor变量是超过或低于目标的个数。若attainfactor为负,则目标已经溢出;若attainfactor为正,则目标个数还未达到。
其它参数意义同前。 注意:
(1)当特征值为复数时,本问题不连续,这也说明了为什么收敛速度很慢。尽管原始方法假设函数是连续的,该法仍然可以向解的方向前进,因为在解的位置上,没有发生不连续的现象。当对象和目标为复数时,fgoalattain函数将试图得到最小二乘意义上的目标;
(2)目标函数必须是连续的;
(3)fgoalattain函数将只给出局部最优解。
例10-15 某化工厂拟生产两种新产品A和B,其生产设备费用分别为:A,2万元/吨;B,5万元/吨。这两种产品均将造成环境污染,设由公害所造成的损失可折算为:A,4万元/吨;B,1万元/吨。由于条件限制,工厂生产产品A和B的最大生产能力各为每月5吨和6吨,而市场需要这两种产品的总量每月不少于7吨。试问工厂如何安排生产计划,在满足市场需要的前提下,使设备投资和公害损失均达到最小。该工厂决策认为,这两个目标中环境污染应优先考虑,设备投资的目标值为20万元,公害损失的目标为12万元。
解:设工厂每月生产产品A为x1吨,B为x2吨,设备投资费为f1(x),公害损失费为f2(x),则这个问题可表达为多目标优化问题:
min f1 (x) = 2x1+5x2 min f2 (x) = 4x1+x2 x1≤5 x2≤6 x1+x2≥7 x1,x2≥0
需要编写目标函数的M文件Ex1015.m,返回目标计算值: function f=Ex1015(x) f(1)=2*x(1)+5*x(2); f(2)=4*x(1)+x(2);
给定目标,权重按目标比例确定,给出初值,在Matlab中实现为: >> goal=[20 12]; >> weight=[20 12]; >> x0=[2 5];
>> A=[1 0;0 1; -1 -1]; >> b=[5 6 7]; >> b=[5 6 -7];
>> lb=zeros(2,1); >>
[x,fval,attainfactor,exitflag]=fgoalattain(@Ex1015,x0,goal,weight,A,b,[],[],lb,[])
Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon Active Constraints: 5 6 7 x =
2.9167 4.0833 fval =
26.2500 15.7500 attainfactor = 0.3125 exitflag = 1
故工厂每月生产产品A为2.9167吨,B为4.0833吨。设备投资费和公害损失费的目标值分别为26.250万元和15.750万元。达到因子为0.3125,计算收敛。
例10-16 某工厂因生产需要欲采购一种原材料,市场上的这种原料有两个等级,甲级单价2元/kg,乙级单价1元/kg。要求所花总费用不超过200元,购得原料总量不少于100kg,其中甲级原料不少于50kg,问如何确定最好的采购方案。
解:设x1和x2分别为采购甲级和乙级原料的数量(kg),要求采购总费用尽量少,采购总量尽量多,采购甲级原料尽量多。由题意建立下面的数学模型:
min z1 = 2x1+x2 max z2 = x1+x2 max z3 = x1 2x1+x2≤200 x1+x2≥100 x1≥50 x1,x2≥0
需要编写目标函数的M文件Ex1016.m,返回目标计算值: function f=Ex1016(x) f(1)=2*x(1)+x(2); f(2)=-x(1)-x(2); f(3)=-x(1);
给定目标,权重按目标比例确定,给出初值,在Matlab中实现: >> goal=[200 -100 -50]; >> weight=[200 -100 -50]; >> x0=[50 50];
>> A=[2 1;-1 -1;-1 0]; >> b=[200 -100 -50]; >> lb=zeros(2,1); >>
[x,fval,attainfactor,exitflag]=fgoalattain(@Ex1016,x0,goal,weight,A,b,[],[],lb,[])
Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon Active Constraints: 4 7 x =
50 50 fval =
150 -100 -50 attainfactor = 0 exitflag = 1
所以,最好的采购方案是采购甲级原料和乙级原料各50kg。此时采购总费用为150元,总重量为100kg,甲级原料总重量为50kg。
例10-17 考虑有不同方程的线性系统:
现在设计了一个输出反馈控制器K,用于生成闭路系统。
? x?(A?BKC)x?Bu
该闭路系统的特征值由矩阵A,B,C和K用命令eig (A+B*K*C)算得。闭路特征值必须位于复平面的实数轴上,位于点[-5,-3,-1]的左侧。为了使输入不至于过饱和,K中的任何一个元素不得大于4或小于-4。
该系统是一个二输入、二输出的开路不稳定系统,有状态空间矩阵:
0???0.50?10?? B???22? C??100? A??0?210?001???????????01?201????设计K,使闭路系统的特征值尽可能与目标值匹配。
解:闭路特征值的目标值由下式初始化:
goal=[-5 -3 -1]
为了保证活动对象超过或低于的比例相当,将权重函数设置为abs (goal)。初始化控制器,令K = [-1,-1;-1,-1],首先编写M文件Ex1017.m: function F=Ex1017(K,A,B,C)
F=sort(eig(A+B*K*C)); %评价对象 在Matlab中实现:
>> goal=[-5 -3 -1]; %为特征值设置目标值 >> A=[-0.5 0 0;0 -2 10;0 1 -2]; >> B=[1 0;-2 2;0 1]; >> C=[1 0 0;0 0 1];
>> K0=[-1 -1;-1 -1]; %初始化控制器矩阵 >> weight=abs(goal); %设置相同比例的权重 >> lb=-4*ones(size(K0)); %设置控制器的下界 >> ub=4*ones(size(K0)); %设置控制器的上界 >> options=optimset('Display','iter'); %设置显示参数 >> [K,fval,attainfactor]=
fgoalattain(@Ex1017,K0,goal,weight,[],[],[],[],lb,ub,[],options
,A,B,C)
Attainment Directional
Iter F-count factor Step-size derivative Procedure 1 6 1.885 1 1.03 2 13 1.061 1 -0.679
3 20 0.4211 1 -0.523 Hessian modified 4 27 -0.06352 1 -0.053 Hessian modified twice 5 34 -0.1571 1 -0.133
6 41 -0.3489 1 -0.00768 Hessian modified 7 48 -0.3643 1 -4.25e-005 Hessian modified 8 55 -0.3645 1 -0.00303 Hessian modified twice 9 62 -0.3674 1 -0.0213 Hessian modified 10 69 -0.3806 1 0.00266
11 76 -0.3862 1 -2.73e-005 Hessian modified
twice
12 83 -0.3863 1 -1.25e-013 Hessian modified
twice
Optimization terminated successfully:
Search direction less than 2*options.TolX and
maximum constraint violation is less than options.TolCon Active Constraints: 1 2 4 9 10 K =
-4.0000 -0.2564 -4.0000 -4.0000 fval = -6.9313 -4.1588 -1.4099 attainfactor = -0.3863 讨论:
(1)达到因子显示每一个目标都已经溢出,比设计目标溢出至少38.63%。活动约束为约束1和约束2,它们的溢出百分比是精确的。另外三个下界约束也是活动的。
(2)在上面的设计中,优化器试图使对象小于目标值。对于最坏的情况,对象必须尽量与目标接近,可将options.GoalsExactAchieve设置为对象数。
(3)考虑到当希望所有的特征值都等于目标值时,有上面的种种问题。现提出一种解决方案,调用fgoalattain函数,并将options.GoalsExactAchieve设置为3,即
>> options=optimset('GoalsExactAchieve',3); >> [K,fval,attainfactor]=
fgoalattain(@LX1017,K0,goal,weight,[],[],[],[],lb,ub,[],opt
ions,A,B,C)
Optimization terminated successfully:
Magnitude of directional derivative in search direction
less than 2*options.TolFun and maximum constraint violation is less than options.TolCon Active Constraints: 9 10 11 14
Matlab在最优化问题中的应用



