9.2.6 目标规划问题
9.2.6.1 基本数学原理
前面介绍的最优化方法只有一个目标函数,是单目标最优化方法。但是,在许多实际工程问题中,往往希望多个指标都达到最优值,所以它有多个目标函数。这种问题称为多目标最优化问题。
多目标最优化问题的数学模型为:
i=1,…,m e
i=m e+1,…,m
其中F(x)为目标函数向量。
由于多目标最优化问题中各目标函数之间往往是不可公度的,因此往往没有唯一解,此时必须引进非劣解的概念(非劣解又称为有效解或帕累托解)。
定义:若x*(x*∈Ω)的邻域内不存在Δx,使得(x*+Δx)∈Ω,且
i=1,…,m
对于某些j
则称为x*非劣解。
diff函数
多目标规划有许多解法,下面列出常用的几种:
1.权和法
该法将多目标向量问题转化为所有目标的加权求和的标量问题,即
加权因子的选取方法很多,有专家打分法、α方法、容限法和加权因子分解法等。
该问题可以用标准的无约束最优化算法进行求解。
2.ε约束法
ε约束法克服了权和法的某些凸性问题。它对目标函数向量中的主要目标Fp进行最小化,将其它目标用不等式约束的形式写出:
sub.        i=1,…,m  i≠p
3.目标达到法
目标函数系列为F(x)={F1(x), F2(x),…, F m(x)},对应地有其目标值系列。允许目标函数有正负偏差,偏差的大小由加权系数向量W={W1,W2,…,W m}控制,于是目标达到问题可以表达为标准的最优化问题:
sub.          i=1,…,m
指定目标{ },定义目标点P。权重向量定义从P到可行域空间Λ(γ)的搜索方向,在优化过程中,γ的变化改变可行域的大小,约束边界变为唯一解点F1s、F2s。
4.目标达到法的改进
目标达到法的一个好处是可以将多目标最优化问题转化为非线性规划问题,但是,在序列二次规划(SQP)过程中,一维搜索的目标函数选择不是一件容易的事情,因为在很多情况下,很难决定是使目标函数变大好还是使它变小好。这导致许多目标函数创建过程的提出。可以通过将目标达到问题变为最大最小化问题来获得更合适的目标函数。
其中
i=1,…,m
9.2.6.2 相关函数介绍
fgoalattain函数
功能:求解多目标达到问题
数学模型:
其中x, weight, goal, b, beq, lb和ub为向量, A和Aeq为矩阵, c(x), ceq(x)和F(x)
为函数,返回向量。F(x), c(x)和ceq(x)可以是非线性函数。
语法:
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 = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,...
lb,ub,nonlcon,options,P1,P2,...)
[x,fval] = fgoalattain(...)
[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函数优化的约束条件为(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(...) 返回包含拉格朗日乘子的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也必须在第三个和第四个输出变量中输出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是一个n*m的矩阵,其中GC(i,j)是c(j)对x(i)的偏导数。同样,若ceq是一个p元素的向量,则ceq(x)的梯度Gceq是一个n*p的矩阵,其中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) (活动对象为阻止解处目标改善的对象集合)。
注意:
1.当目标值中的任意一个为零时,设置weight=abs(goal)将导致目标约束看
起来更象硬约束,而不象目标约束。
2.当加权函数weight为正时,fgoalattain函数试图使对象小于目标值。为了
使目标函数大于目标值,将权重weight设置为负。为了使目标函数尽可能地接近目标值,使用GoalsExactAchieve参数,将fun函数返回的第一个元素作为目标。
attainfactor变量
attainfactor变量是超过或低于目标的个数。若attainfactor为负,则目标已经溢出;
若attainfactor为正,则目标个数还未达到。
其它参数意义同前。
注意:
当特征值为复数时,本问题不连续,这也说明了为什么收敛速度很慢。尽管原始方法假设函数是连续的,该法仍然可以向解的方向前进,因为在解的位置上,没有发生不连续的现象。当对象和目标为复数时,fgoalattain函数将试图得到最小二乘意义上的目标。
算法:
多目标优化同时涉及到一系列对象。fgoalattain函数求解该问题的基本算法是目标达到法。该法为目标函数建立起目标值。多目标优化的具体算法在前面进行了更详细的介绍。
本次实现过程中,使用了松弛变量γ作为模糊变量同时最小化目标向量F(x);goal 参数是一系列目标达到值。在进行优化之前,通常不知道对象是否会达到目标。
使用权向量weight可以控制是没有达到还是溢出。
fgoalattain函数使用序列二次规划法(SQP),前面已经进行了比较多的介绍。算法中对于一维搜索和Hessian矩阵进行了修改。在一维搜索中,将精确目标函数和文献[2]、[3]中的目标函数一起使用。当有一个目标函数不再发生改善时,一维搜索终止。修改的Hessian矩阵借助于本问题的结构,也被采用。详细内容可参见文献[5]、[6]。
attainfactor参数包含解处的γ值。γ取负值时表示目标溢出。
局限性:
目标函数必须是连续的。fgoalattain函数将只给出局部最优解。
参见:
fmincon, fminimax, optimset
9.2.6.3 应用实例
[例二]某化工厂拟生产两种新产品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),则这个问题可表达为多目标优化问题:
首先需要编写目标函数的M文件opt26_2o.m,返回目标计算值
function f=myfun(x)
f(1)=2*x(1)+5*x(2);
f(2)=4*x(1)+x(2);
给定目标,权重按目标比例确定,给出初值
goal=[20 12];
weight=[20 12];
x0=[2 5];
给出约束条件的系数
A=[1 0;0 1;-1 -1];
b=[5 6 -7];
lb=zeros(2,1);
[x,fval,attainfactor,exitflag] = …
fgoalattain(@opt26_2o,x0,goal,weight,A,b,[],[],lb,[])
磁盘中上面程序段的M文件为opt26_2.m。
计算结果为
x =
2.9167  4.0833
fval =
26.250015.7500
attainfactor =
0.3125

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。