Main Content

Generar y representar un frente de Pareto

Este ejemplo muestra cómo generar y representar un frente de Pareto para una función multiobjetivo en 2D utilizando fgoalattain.

Las dos funciones objetivo de este ejemplo son versiones desplazadas y escaladas de la función convexa 1+x2. El código para las funciones objetivo aparece en la función auxiliar simple_mult al final de este ejemplo.

Ambas funciones objetivo disminuyen en la región x0 y aumentan en la región x1. Entre 0 y 1, f1(x) aumenta y f2(x) disminuye, por lo que existe una región tradeoff. Represente las dos funciones objetivo para x en un rango de entre -1/2 y 3/2.

t = linspace(-1/2,3/2);
F = simple_mult(t);
plot(t,F,'LineWidth',2)
hold on
plot([0,0],[0,8],'g--');
plot([1,1],[0,8],'g--');
plot([0,1],[1,6],'k.','MarkerSize',15);
text(-0.25,1.5,'Minimum(f_1(x))')
text(.75,5.5,'Minimum(f_2(x))')
hold off
legend('f_1(x)','f_2(x)')
xlabel({'x';'Tradeoff region between the green lines'})

Figure contains an axes object. The axes object contains 7 objects of type line, text. These objects represent f_1(x), f_2(x).

Para encontrar el frente de Pareto, busque primero los mínimos no restringidos de las dos funciones objetivo. En este caso, puede ver en la gráfica que el mínimo de f1(x) es 1 y el mínimo de f2(x) es 6, pero, en general, quizás sea necesario utilizar una rutina de optimización para encontrar los mínimos.

Como norma general, escriba una función que devuelva un componente particular de la función multiobjetivo. (La función auxiliar pickindex al final de este ejemplo devuelve el k-ésimo valor de la función objetivo). Después, encuentre el mínimo de cada componente utilizando un solver de optimización. En este caso puede utilizar fminbnd, o fminunc para problemas de más dimensiones.

k = 1;
[min1,minfn1] = fminbnd(@(x)pickindex(x,k),-1,2);
k = 2;
[min2,minfn2] = fminbnd(@(x)pickindex(x,k),-1,2);

Establezca metas que sean los óptimos no restringidos para cada función objetivo. Solo puede alcanzar estas metas simultáneamente si las funciones objetivo no interfieren entre sí, es decir, si no hay tradeoff.

goal = [minfn1,minfn2];

Para calcular el frente de Pareto, tome los vectores de ponderación [a,1a] para a de 0 a 1. Resuelva el problema de consecución de metas estableciendo las ponderaciones en los diferentes valores.

nf = 2; % Number of objective functions
N = 50; % Number of points for plotting
onen = 1/N;
x = zeros(N+1,1);
f = zeros(N+1,nf);
fun = @simple_mult;
x0 = 0.5;
options = optimoptions('fgoalattain','Display','off');
for r = 0:N
t = onen*r; % 0 through 1
weight = [t,1-t];
[x(r+1,:),f(r+1,:)] = fgoalattain(fun,x0,goal,weight,...
[],[],[],[],[],[],[],options);
end
figure
plot(f(:,1),f(:,2),'ko');
xlabel('f_1')
ylabel('f_2')

Figure contains an axes object. The axes object contains an object of type line.

Puede ver el tradeoff entre las dos funciones objetivo.

Funciones auxiliares

El siguiente código crea la función simple_multi.

function f = simple_mult(x)
f(:,1) = sqrt(1+x.^2);
f(:,2) = 4 + 2*sqrt(1+(x-1).^2);
end

El siguiente código crea la función pickindex.

function z = pickindex(x,k)
z = simple_mult(x); % evaluate both objectives
z = z(k); % return objective k
end

Consulte también

Temas relacionados