利用fgoalattain函数可以求解多目标最优化问题。假设多目标最优化问题的数学模型为
式中x,weight,goal,b,beq,lb和ub 为向量,A和Aeq为矩阵, c(x), ceq(x)和F(x)为函数,返回向量。F(x), c(x)和ceq(x)可以是非线性函数。[大谦MATLAB,dqmatlab点com]
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函数优化的约束条件为(x) <= 0和ceq(x) = 0。若不存在边界,则设置lb=[ ]和(或)ub=[ ]。
x = fgoalattain(fun, x0, goal, weight, A, b, Aeq, beq, lb, ub, nonlcon, options):用options中设置的优化参数进行最小化。
[x, fval] = fgoalattain(...):返回解x处的目标函数值。
[x, fval, attainfactor, exitflag, output] = fgoalattain(...):返回解x处的目标达到因子attainfactor,返回exitflag参数描述计算的退出条件,返回包含优化信息的输出参数output。
[x, fval, attainfactor, exitflag, output, lambda] = fgoalattain(...):返回包含Lagrange乘子的lambda参数。
在上述语法格式中,goal变量为目标希望达到的向量值。向量的长度与fun函数返回的目标数F相等。fgoalattain函数试图通过使向量F的值最小化来达到goal参数给定的目标。
nonlcon参数计算非线性不等式约束c(x) <=0和非线性等式约束ceq(x)=0。nonlcon函数是一个包含函数名的字符串,该函数可以是M文件、内部函数或MEX文件。nonlcon函数需要输入向量x,返回两个变量—— x处的非线性不等式向量c和x处的非线性等式向量ceq。例如,若nonlcon='mycon',则M文件的形式如下:
function [c,ceq] = mycon(x)
c = ... % 计算x处的非线性不等式
ceq = ... % 计算x处的非线性等式
若约束函数的梯度可以计算,且options.GradConstr设为'on',即
options = optimset('GradConstr','on')
则函数nonlcon也必须在第3个和第4个输出变量中输出c(x)的梯度GC和ceq(x)的梯度GCeq。注意,可以通过核对nargout参数来避免计算GC和GCeq。
function [c,ceq,GC,GCeq] = mycon(x)
c = ... % x处的非线性不等式
ceq = ... %计算 x处的非线性等式
if nargout > 2 % 被调用的nonlcon函数,有4个输出
GC = ... % 不等式的梯度
GCeq = ... % 等式的梯度
end
若nonlcon函数返回m元素的向量c和长度为n的x,则c(x)的梯度GC是一个nm矩阵,其中GC(i,j)是c(j)对x(i)的偏导数。同样,若ceq是一个p元素的向量,则ceq(x)的梯度Gceq是一个np矩阵,其中Gceq(i,j)是ceq(j)对x(i)的偏导数。
options变量为优化参数选项。可以用optimset函数设置或改变这些选项:
DerivativeCheck——比较用户提供的导数(目标函数或约束函数的梯度)和有限差分导数。
Diagnostics——打印将要最小化或求解的函数的诊断信息。
DiffMaxChange——变量中有限差分梯度的最大变化。
DiffMinChange——变量中有限差分梯度的最小变化。
Display——显示水平。当将其设置为'off ' 时,不显示输出;当将其设置为 'iter' 时,显示每一次迭代的输出;当将其设置为'final'时,只显示最终结果。
GoalExactAchieve——使得目标个数刚好达到,不多也不少。
GradConstr——用户定义的约束函数的梯度。
GradObj——用户定义的目标函数的梯度。在使用大型方法时,必须使用梯度,对于中型方法则是可选项。
MaxFunEvals——函数评价的允许最大次数。
MaxIter——函数迭代的允许最大次数。
MeritFunction——如果将其设为'multiobj',则使用目标达到或最大/最小化目标函数的方法。如果将其设置为'singleobj',则使用fmincon 函数计算目标函数。
TolCon—— 约束矛盾的终止容限。
TolFun—— 函数值处的终止容限。
TolX—— x处的终止容限。
weight变量为权重向量,可以控制低于或超过fgoalattain函数指定目标的相对程度。当goal的值都是非零值时,为了保证激活对象超过或低于的比例相当,将权重函数设置为abs(goal)(激活对象为阻止解处目标改善的对象集合)。当目标值中的任意一个值为零时,设置weight=abs(goal)将导致目标约束看起来更像硬约束,而不像目标约束。当加权函数weight为正时,fgoalattain函数试图使对象小于目标值。为了使目标函数大于目标值,将权重weight设置为负。为了使目标函数尽可能地接近目标值,使用GoalsExactAchieve参数,将fun函数返回的第1个元素作为目标。
attainfactor变量是超过或低于目标的个数。若attainfactor为负,则目标已经溢出;若attainfactor为正,则目标个数还未达到。
多目标优化同时涉及一系列对象。用fgoalattain函数求解该问题的基本算法是目标达到法。该方法为目标函数建立起目标值。多目标优化的具体算法在前面进行了详细的介绍。在具体实现过程中,使用了松弛变量 作为模糊变量,同时最小化目标向量F(x),goal参数是一系列目标达到值。在进行优化之前,通常不知道对象是否会达到目标。使用权向量weight可以控制对象是达到还是溢出。
fgoalattain函数使用序列二次规划法(SQP),前面已经进行了比较多的介绍。算法中对于一维搜索和Hess矩阵进行了修改。当两次迭代的目标函数值之差小于指定容限时,一维搜索终止。这里使用了改进的Hess矩阵。
attainfactor参数包含解处的 值。当 取负值时,表示目标溢出。
目标函数必须是连续的。fgoalattain函数将只给出局部最优解。