Contenuto principale

Questa pagina è stata tradotta con la traduzione automatica. Fai clic qui per vedere l'ultima versione in inglese.

Grafico del fronte di Pareto 3D

Questo esempio mostra come tracciare un fronte di Pareto per tre obiettivi. Ogni funzione obiettivo è la distanza al quadrato da un particolare punto tridimensionale. Per velocizzare i calcoli, scrivere ciascuna funzione obiettivo in forma vettorializzata come prodotto scalare. Per ottenere un insieme di soluzioni denso, utilizzare 200 punti sul fronte di Pareto.

L'esempio mostra innanzitutto come ottenere il grafico utilizzando la funzione plot integrata 'psplotparetof'. Quindi risolvi lo stesso problema e ottieni il grafico utilizzando gamultiobj, che richiede impostazioni delle opzioni leggermente diverse. L'esempio mostra come ottenere variabili di soluzione per un punto particolare nel grafico di Pareto. Quindi l'esempio mostra come tracciare i punti direttamente, senza utilizzare una funzione di tracciamento, e mostra come tracciare una superficie interpolata invece di punti di 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'.

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.

Questo grafico mostra molti meno punti rispetto al grafico paretosearch. Risolvi nuovamente il problema utilizzando una popolazione più ampia.

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.

Cambia l'angolo di visualizzazione per adattarlo meglio al grafico psplotpareto.

view(-40,57)

Trova il punto di soluzione utilizzando i suggerimenti degli strumenti

Selezionare un punto nel grafico utilizzando lo strumento Suggerimenti sui dati.

DataTips.png

ParetoPoint.png

Il punto raffigurato ha indice 92. Visualizza il punto xg(92,:) che contiene le variabili di soluzione associate al punto raffigurato.

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

A questo punto valutare le funzioni obiettivo per verificare che corrispondano ai valori visualizzati.

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

Crea un grafico a dispersione 3D

Tracciare i punti sul fronte di Pareto utilizzando 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)

Ruotando il grafico in modo interattivo, è possibile ottenere una visione migliore della sua struttura.

Grafico di superficie interpolata

Per vedere il fronte di Pareto come una superficie, creare un interpolante sparso.

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

Per tracciare la superficie risultante, creare una mesh nello spazio x-y dal valore più piccolo a quello più grande. Quindi tracciare il grafico della superficie interpolata.

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

Rappresenta graficamente i punti di Pareto e la superficie.

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)

Ruotando il grafico in modo interattivo, è possibile ottenere una visione migliore della sua struttura.

Tracciare l'insieme di Pareto nello spazio delle variabili di controllo

È possibile ottenere un grafico dei punti dell'insieme di Pareto utilizzando la funzione di grafico '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'.

In alternativa, creare un grafico a dispersione dei valori x nell'insieme di 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)

Questo set non ha una superficie trasparente. Ruotando il grafico in modo interattivo, è possibile ottenere una visione migliore della sua struttura.

Trama parallela

È possibile tracciare il grafico dell'insieme di Pareto utilizzando un grafico a coordinate parallele. È possibile utilizzare un grafico a coordinate parallele per qualsiasi numero di dimensioni. Nel grafico, ogni linea colorata rappresenta un punto di Pareto e ogni variabile coordinata è rappresentata da una linea verticale associata. Rappresentare graficamente i valori della funzione obiettivo utilizzando parellelplot .

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

Colora i punti di Pareto nel decimo più basso dei valori di 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";

Vedi anche

|

Argomenti