生成和绘制帕累托前面
这个例子展示了如何生成和绘制一个2-D多目标函数的帕累托前沿fgoalattain
.
本例中的两个目标函数是凸函数的移位和缩放版本
.目标函数的代码出现在simple_mult
的辅助函数。本例结束.
两个目标函数都在该区域内减小 并在区域内增加 .在0和1之间, 增加和 减少,所以存在一个权衡区域。的两个目标函数 从 来 .
T = linspace(-1/2,3/2);F = simple_mult(t)情节(t、F“线宽”, 2)在情节([0,0],[0,8],“g——”);情节([1],[0,8],“g——”);情节([0,1],(1,6),“k”。,“MarkerSize”15);文本(-0.25,1.5,“最小f (f (x))”5.5)文本(综合成绩,“最低(₂(x))”)举行从传奇(' f (x)的,“₂(x)”)包含({“x”;“绿线之间的权衡区”})
为了找到帕累托前面,首先找到两个目标函数的无约束最小值。在这种情况下,你可以在图中看到最小值 的最小值是1 是6,但通常你可能需要使用优化例程来找到最小值。
一般来说,编写一个返回多目标函数的特定组件的函数。(pickindex
的辅助函数。本例结束返回
目标函数值。)然后使用优化求解器找到每个组件的最小值。你可以使用fminbnd
在这种情况下,或者fminunc
对于高维问题。
K = 1;[min1, minfn1] = fminbnd (@ (x) pickindex (x, k), 1, 2);K = 2;[min2,minfn2] = fminbnd(@(x)pickindex(x,k),-1,2);
为每个目标函数设定无约束最优值的目标。只有当目标函数不相互干扰时,您才能同时实现这些目标,这意味着不存在权衡。
目标= [minfn1,minfn2];
为了计算帕累托前沿,取权向量 为 从0到1。解决目标实现问题,为各个值设置权重。
Nf = 2;目标函数的个数N = 50;%用于绘图的点数onen = 1/N;x = 0 (N+1,1);f = 0 (N+1,nf);Fun = @simple_mult;X0 = 0.5;选项= optimoptions(“fgoalattain”,“显示”,“关闭”);为r = 0:N t = onen*r;% 0到1权重= [t,1-t];[x (r + 1:), f (r + 1:)] = fgoalattain(有趣,x0,目标,重量,…[],[],[],[],[],[],[], 选项);结束图绘制(f (: 1), f (:, 2),“柯”);包含(“f”) ylabel (“₂”)
你可以看到两个目标函数之间的权衡。
辅助函数
下面的代码创建simple_multi
函数。
函数F = simple_mult(x) F(:,1) =根号(1+x.^2);F(:,2) = 4 + 2*根号(1+(x-1).^2);结束
下面的代码创建pickindex
函数。
函数Z = pickindex(x,k) Z = simple_mult(x);%同时评估两个目标Z = Z (k);%回报目标k结束