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