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