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