В этом примере показано, как построить переднюю сторону Парето для трех целей. Каждая целевая функция является квадратом расстояния от конкретной 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'.
opts = optimoptions('gamultiobj',"PlotFcn","gaplotpareto","PopulationSize",200); [xg,fg] = gamultiobj(fun,3,[],[],[],[],lb,ub,[],opts);
Optimization terminated: average change in the spread of Pareto solutions less than options.FunctionTolerance.
Этот график показывает многим меньше точек, чем paretosearch
график. Решите задачу снова с помощью более многочисленного населения.
opts.PopulationSize = 400; [xg,fg] = gamultiobj(fun,3,[],[],[],[],lb,ub,[],opts);
Optimization terminated: average change in the spread of Pareto solutions less than options.FunctionTolerance.
Измените угол обзора, чтобы лучше совпадать с psplotpareto
график.
view(-40,57)
Выберите точку в графике при помощи инструмента Data Tips.
Изображенная точка имеет индекс 92. Отобразите точку xg(92,:)
это содержит переменные решения, сопоставленные с изображенной точкой.
disp(xg(92,:))
-0.2889 0.0939 0.4980
Выполните целевые функции в этой точке, чтобы видеть, что она совпадает с отображенными значениями.
disp(fun(xg(92,:)))
11.5544 15.1912 1.5321
Постройте точки на передней стороне Парето при помощи 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";