В этом примере показано, как построить переднюю сторону Парето для трех целей. Каждая целевая функция является квадратом расстояния от конкретной 3-D точки. Для скорости вычисления напишите каждую целевую функцию в векторизованном виде как скалярное произведение. Чтобы получить плотный набор решения, используйте 200 точек на передней стороне Парето.
Пример сначала показывает, как получить график с помощью встроенного 'psplotparetof'
функция plot. Затем в случае, если вы используете gamultiobj
или другой способ получить точки Парето, пример показывает, как построить точки непосредственно и показывает, как построить интерполированную поверхность вместо точек Парето.
fun = @(x)[dot(x - [1,2,3],x - [1,2,3],2), ... dot(x - [-1,3,-2],x - [-1,3,-2],2), ... dot(x - [0,-1,1],x - [0,-1,1],2)]; options = optimoptions('paretosearch','UseVectorized',true,'ParetoSetSize',200,... 'PlotFcn','psplotparetof'); lb = -5*ones(1,3); ub = -lb; rng default % For reproducibility [x,f] = paretosearch(fun,3,[],[],[],[],lb,ub,[],options);
Pareto set found that satisfies the constraints. Optimization completed because the relative change in the volume of the Pareto set is less than 'options.ParetoSetChangeTolerance' and constraints are satisfied to within 'options.ConstraintTolerance'.
Постройте точки на передней стороне Парето при помощи scatter3
.
figure subplot(2,2,1) scatter3(f(:,1),f(:,2),f(:,3),'k.'); subplot(2,2,2) scatter3(f(:,1),f(:,2),f(:,3),'k.'); view(-148,8) subplot(2,2,3) scatter3(f(:,1),f(:,2),f(:,3),'k.'); view(-180,8) subplot(2,2,4) scatter3(f(:,1),f(:,2),f(:,3),'k.'); view(-300,8)
Путем вращения графика в интерактивном режиме, вы получаете лучшее представление его структуры.
Чтобы рассмотреть переднюю сторону Парето как поверхность, создайте рассеянный interpolant.
figure F = scatteredInterpolant(f(:,1),f(:,2),f(:,3),'linear','none');
Чтобы построить получившуюся поверхность, создайте mesh на x-y пробеле от самого маленького до самых больших значений. Затем постройте интерполированную поверхность.
sgr = linspace(min(f(:,1)),max(f(:,1))); ygr = linspace(min(f(:,2)),max(f(:,2))); [XX,YY] = meshgrid(sgr,ygr); ZZ = F(XX,YY);
Постройте точки Парето и появитесь вместе.
figure subplot(2,2,1) surf(XX,YY,ZZ,'LineStyle','none') hold on scatter3(f(:,1),f(:,2),f(:,3),'k.'); hold off subplot(2,2,2) surf(XX,YY,ZZ,'LineStyle','none') hold on scatter3(f(:,1),f(:,2),f(:,3),'k.'); hold off view(-148,8) subplot(2,2,3) surf(XX,YY,ZZ,'LineStyle','none') hold on scatter3(f(:,1),f(:,2),f(:,3),'k.'); hold off view(-180,8) subplot(2,2,4) surf(XX,YY,ZZ,'LineStyle','none') hold on scatter3(f(:,1),f(:,2),f(:,3),'k.'); hold off view(-300,8)
Путем вращения графика в интерактивном режиме, вы получаете лучшее представление его структуры.
Можно получить график точек на Множестве Парето при помощи 'psplotparetox'
функция plot.
options.PlotFcn = 'psplotparetox';
[x,f] = paretosearch(fun,3,[],[],[],[],lb,ub,[],options);
Pareto set found that satisfies the constraints. Optimization completed because the relative change in the volume of the Pareto set is less than 'options.ParetoSetChangeTolerance' and constraints are satisfied to within 'options.ConstraintTolerance'.
В качестве альтернативы создайте график рассеивания x-значений во Множестве Парето.
figure subplot(2,2,1) scatter3(x(:,1),x(:,2),x(:,3),'k.'); subplot(2,2,2) scatter3(x(:,1),x(:,2),x(:,3),'k.'); view(-148,8) subplot(2,2,3) scatter3(x(:,1),x(:,2),x(:,3),'k.'); view(-180,8) subplot(2,2,4) scatter3(x(:,1),x(:,2),x(:,3),'k.'); view(-300,8)
Этот набор не имеет ясной поверхности. Путем вращения графика в интерактивном режиме, вы получаете лучшее представление его структуры.
Можно построить Множество Парето с помощью графика координат параллели. Можно использовать график координат параллели для любого количества размерностей. В графике каждая цветная линия представляет одну точку Парето и каждую координатную переменную графики к связанной вертикальной линии. Постройте значения целевой функции с помощью parellelplot
.
figure p = parallelplot(f); p.CoordinateTickLabels =["Obj1";"Obj2";"Obj3"];
Окрасьте точки Парето в самой низкой десятой части значений Obj2
.
minObj2 = min(f(:,2));
maxObj2 = max(f(:,2));
grpRng = minObj2 + 0.1*(maxObj2-minObj2);
grpData = f(:,2) <= grpRng;
p.GroupData = grpData;
p.LegendVisible = "off";