11.1.3 多目标优化
前面介绍的最优化方法只有一个目标函数,是单目标最优化方法。但是,在许多实际工程问题中,往往希望多个指标都达到最优值,所以就有多个目标函数,这种问题称为多目标最优化问题。
多目标规划有许多解法,下面列出常用的几种。
(1)化多为少法:将多目标问题化成只有1个或2个目标的问题,然后用简单的决策方法求解。最常用的是线性加权和法。
(2)分层序列法:将所有的目标按其重要程度依次排序,先求出第1个(最重要的)目标的最优解,然后在保证前一个目标最优解的前提下依次求下一个目标的最优解,一直求到最后一个目标为止。
(3)直接求非劣解法:先求出一组非劣解,然后按事先确定好的评价标准从中找出一个满意的解。
(4)目标规划法:当所有的目标函数和约束条件都是线性时,可以采用目标规划法,它是20世纪60年代初由查纳斯和库珀提出来的。此方法对每一个目标函数都事前给定一个期望值,然后在满足约束条件集合的情况下,找出使目标函数离期望值最近的解。
(5)多属性效用法(MAUM):各个目标分别用各自的效用函数表示,然后构成多目标综合效用函数,以此来评价各个可行方案的优劣。
(6)层次分析法:由T.沙基于1980年提出来。这种方法是通过对目标、约束条件、方案等的主观判断,对各种方案加以综合权衡比较,然后评定优劣。
(7)重排次序法:把原来不好比较的非劣解,通过其他办法排出优劣次序。此外,还有多目标群决策和多目标模糊决策等方法。
针对多目标优化问题,MATLAB提供了fgoalattain和fminimax 函数用来进行求解。篇幅有限,这里仅举例说明fgoalattain函数的用法,fminimax函数的用法读者可自行查阅帮助文档。
【例11-7】 某工厂因生产需要欲采购一种原材料,市场上这种原材料有两个等级,甲级单价2元/千克,乙级单价1元/千克。要求所花总费用不超过200元,购得原材料总量不少于100千克,其中甲级原材料不少于50千克,问如何确定最好的采购方案。
设x1、x2分别为采购甲级和乙级原材料的数量(千克),要求总采购费用尽量少,总采购重量尽量多,采购甲级原材料尽量多。
首先需要编写目标函数的M文件myfun4.m,返回目标计算值。具体代码如下:
function f=myfun4(x)
f(1)=2*x(1)+ x(2);
f(2)=-x(1)- x(2);
f(3)=-x(1);
给定目标,权重按目标比例确定,给出初始值。具体代码如下:
>> goal=[200 -100 -50]; % 要达到的目标
>> weight=[2040 -100 -50]; % 各个目标的权重
>> x0=[55 55]; % 搜索的初始值
% 约束条件
>> A=[2 1;-1 -1;-1 0];
>> b=[200 -100 -50];
>> lb=zeros(2,1);
% 调用fgoalattain函数进行多目标优化
>> [x,fval,attainfactor,exitflag] =...
fgoalattain(@myfun4,x0,goal,weight,A,b,[],[],lb,[])
经过计算,MATLAB输出计算结果为:
x =
50 50
fval =
150 -100 -50
attainfactor =
3.4101e-010
exitflag =
4
所以,对于给定的权重比例,最好的采购方案是采购甲级原材料和乙级原材料各50千克。此时采购总费用为150元,总重量为100千克,甲级原材料总重量为50千克。