Contenido principal

Generar y representar un frente de Pareto

R2026b

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 x≤0 y aumentan en la región x≥1. Entre 0 y 1, f1(x) aumenta y f2(x) disminuye, por lo tanto, 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"})

Two objective functions f1(x) and f2(x) with their individual minima marked; tradeoff region lies between the green lines

Para encontrar el frente de Pareto, busque primero los mínimos sin restricciones 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 sin restricciones 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,1–a] 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")

Pareto front showing the tradeoff between f1 and f2, with f2 decreasing as f1 increases

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