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