Contenu principal

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

Tracer un front de Pareto 3D

Cet exemple montre comment tracer un front de Pareto pour trois objectifs. Chaque fonction objectif est la distance au carré à partir d'un point 3D particulier. Pour accélérer le calcul, écrivez chaque fonction objectif de manière vectorisée sous forme de produit scalaire. Pour obtenir un ensemble de solutions dense, utilisez 200 points sur le front de Pareto.

L'exemple montre d'abord comment obtenir le tracé à l'aide de la fonction de tracé intégrée 'psplotparetof'. Résolvez ensuite le même problème et obtenez le tracé en utilisant gamultiobj, ce qui nécessite des paramètres d’options légèrement différents. L'exemple montre comment obtenir des variables de solution pour un point particulier dans le diagramme de Pareto. L'exemple montre ensuite comment tracer les points directement, sans utiliser de fonction de tracé, et montre comment tracer une surface interpolée au lieu de points de Pareto.

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'.

Figure paretosearch contains an axes object. The axes object with title Pareto Front, xlabel Objective 1, ylabel Objective 2 contains an object of type scatter.

opts = optimoptions('gamultiobj',"PlotFcn","gaplotpareto","PopulationSize",200);
[xg,fg] = gamultiobj(fun,3,[],[],[],[],lb,ub,[],opts);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.

Figure Genetic Algorithm contains an axes object. The axes object with title Pareto Front, xlabel Objective 1, ylabel Objective 2 contains an object of type scatter.

Ce graphique montre beaucoup moins de points que le graphique paretosearch. Résolvez à nouveau le problème en utilisant une population plus large.

opts.PopulationSize = 400;
[xg,fg] = gamultiobj(fun,3,[],[],[],[],lb,ub,[],opts);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.

Modifiez l'angle de vue pour mieux correspondre au tracé psplotpareto.

view(-40,57)

Figure Genetic Algorithm contains an axes object. The axes object with title Pareto Front, xlabel Objective 1, ylabel Objective 2 contains an object of type scatter.

Trouver un point de solution à l'aide des info-bulles

Sélectionnez un point dans le tracé à l’aide de l’outil Astuces de données.

DataTips.png

ParetoPoint.png

Le point représenté a l'index 92. Affichez le point xg(92,:) qui contient les variables de solution associées au point illustré.

disp(xg(92,:))
   -0.2889    0.0939    0.4980

Évaluez les fonctions objectif à ce stade pour voir qu’elles correspondent aux valeurs affichées.

disp(fun(xg(92,:)))
   11.5544   15.1912    1.5321

Créer un nuage de points en 3D

Tracez des points sur le front de Pareto en utilisant 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 contains 4 axes objects. Axes object 1 contains an object of type scatter. Axes object 2 contains an object of type scatter. Axes object 3 contains an object of type scatter. Axes object 4 contains an object of type scatter.

En faisant tourner le tracé de manière interactive, vous obtenez une meilleure vue de sa structure.

Graphique de surface interpolé

Pour voir le front de Pareto comme une surface, créez un interpolant dispersé.

figure
F = scatteredInterpolant(f(:,1),f(:,2),f(:,3),'linear','none');

Pour tracer la surface résultante, créez un maillage dans l'espace x-y des valeurs les plus petites aux plus grandes. Tracez ensuite la surface interpolée.

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);

Tracez les points de Pareto et la surface ensemble.

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)

Figure contains 4 axes objects. Axes object 1 contains 2 objects of type surface, scatter. Axes object 2 contains 2 objects of type surface, scatter. Axes object 3 contains 2 objects of type surface, scatter. Axes object 4 contains 2 objects of type surface, scatter.

En faisant tourner le tracé de manière interactive, vous obtenez une meilleure vue de sa structure.

Tracer un ensemble de Pareto dans un espace de variables de contrôle

Vous pouvez obtenir un tracé des points sur l'ensemble de Pareto en utilisant la fonction de tracé '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'.

Figure paretosearch contains an axes object. The axes object with title Parameter Space, xlabel Parameter 1, ylabel Parameter 2 contains an object of type scatter.

Vous pouvez également créer un nuage de points des valeurs x dans l’ensemble de Pareto.

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)

Figure contains 4 axes objects. Axes object 1 contains an object of type scatter. Axes object 2 contains an object of type scatter. Axes object 3 contains an object of type scatter. Axes object 4 contains an object of type scatter.

Cet ensemble n'a pas de surface transparente. En faisant tourner le tracé de manière interactive, vous obtenez une meilleure vue de sa structure.

Terrain parallèle

Vous pouvez tracer l'ensemble de Pareto à l'aide d'un tracé de coordonnées parallèles. Vous pouvez utiliser un tracé de coordonnées parallèles pour n’importe quel nombre de dimensions. Dans le graphique, chaque ligne colorée représente un point de Pareto et chaque variable de coordonnées est tracée sur une ligne verticale associée. Tracez les valeurs de la fonction objectif à l’aide de parellelplot.

figure
p = parallelplot(f);
p.CoordinateTickLabels =["Obj1";"Obj2";"Obj3"];

Coloriez les points de Pareto dans le dixième le plus bas des valeurs de 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";

Figure contains an object of type parallelplot.

Voir aussi

|

Rubriques