В этом примере показано, как создавать и отображать фронт Парето для 2-D многообъективной функции с помощью fgoalattain.
Две целевые функции в этом примере являются сдвинутыми и масштабированными версиями выпуклой функции x2. Код для целевых функций отображается в simple_mult вспомогательная функция в конце этого примера.
В регионе уменьшаются как объективные функции так и возрастают в регионе . В диапазоне от 0 до 1 ) увеличивается, а x) уменьшается, поэтому существует область компромисса. Постройте график двух целевых функций x в диапазоне 1/2 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'})

Чтобы найти фронт Парето, сначала найдите неограниченные минимумы двух объективных функций. В этом случае на графике можно увидеть, что минимум ) равен 1, а минимум x) равен 6, но в целом для поиска минимумов может потребоваться использовать подпрограмму оптимизации.
В общем, записать функцию, которая возвращает конкретный компонент многообъективной функции. ( pickindex вспомогательная функция в конце этого примера возвращает значение k-ой целевой функции.) Затем найдите минимум каждого компонента с помощью решателя оптимизации. Вы можете использовать fminbnd в этом случае или fminunc для более объемных задач.
k = 1; [min1,minfn1] = fminbnd(@(x)pickindex(x,k),-1,2); k = 2; [min2,minfn2] = fminbnd(@(x)pickindex(x,k),-1,2);
Задайте цели, которые являются неограниченным оптимумом для каждой целевой функции. Одновременно достичь этих целей можно только в том случае, если объективные функции не мешают друг другу, что означает отсутствие компромисса.
goal = [minfn1,minfn2];
Для вычисления фронта Парето возьмем весовые векторы ] для от 0 до 1. Решите задачу достижения цели, установив веса на различные значения.
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')

Можно увидеть компромисс между двумя целевыми функциями.
Следующий код создает simple_multi функция.
function f = simple_mult(x) f(:,1) = sqrt(1+x.^2); f(:,2) = 4 + 2*sqrt(1+(x-1).^2); end
Следующий код создает pickindex функция.
function z = pickindex(x,k) z = simple_mult(x); % evaluate both objectives z = z(k); % return objective k end