В этом примере показано, как построить фронт Парето для трех целей. Каждая целевая функция представляет собой квадрат расстояния от конкретной точки 3-D. Для скорости вычисления записывайте каждую целевую функцию векторизированным образом как скалярное произведение. Чтобы получить плотный набор решений, используйте 200 точек на передней панели Pareto.
В примере сначала показано, как получить график с помощью встроенного 'psplotparetof' функция графика. Затем, в случае использования 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'.

Печать точек на передней панели Pareto с помощью 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)

Поворот графика в интерактивном режиме позволяет получить лучшее представление о его структуре.
Чтобы увидеть фронт Парето как поверхность, создайте рассеянный интерполятор.
figure F = scatteredInterpolant(f(:,1),f(:,2),f(:,3),'linear','none');
Для построения графика результирующей поверхности создайте сетку в пространстве 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' функция графика.
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";