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 . 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 y aumentan en la región . Entre 0 y 1, aumenta y disminuye, por lo que existe una región tradeoff. Represente las dos funciones objetivo para en un rango de entre y .
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'})
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 es 1 y el mínimo de 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 -é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 para 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')
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