Сгенерируйте и постройте график передней панели Парето

В этом примере показано, как сгенерировать и построить график фронта Парето для 2-D мультиобъективной функции с помощью fgoalattain.

Двумя целевыми функциями в этом примере являются сдвинутые и масштабированные версии выпуклой функции 1+x2. Код для целевых функций появляется в simple_mult вспомогательная функция в конце этого примера.

Обе целевые функции уменьшаются в области x0 и увеличение в области x1. В диапазоне от 0 до 1, f1(x) увеличивает и f2(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'})

Figure contains an axes. The axes contains 7 objects of type line, text. These objects represent f_1(x), f_2(x).

Чтобы найти фронт Парето, сначала найдите минимумы без ограничений из двух целевых функций. В этом случае на графике можно увидеть, что минимум f1(x) равен 1, и минимум f2(x) является 6, но в целом вам может потребоваться использовать стандартную программу оптимизации, чтобы найти минимумы.

В целом, запишите функцию, которая возвращает конкретный компонент мультиобъективной функции. (The pickindex helper функция в конце этого примера возвращает 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];

Чтобы вычислить фронт Парето, возьмите векторы веса [a,1a] для a от 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')

Figure contains an axes. The axes contains an object of type line.

Вы можете увидеть компромисс между двумя целевыми функциями.

Вспомогательные функции

Следующий код создает 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

См. также

Похожие темы