exponenta event banner

Создание и печать передней панели Pareto

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

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

В регионе уменьшаются как объективные функции x≤0 так и возрастают в регионе x≥1. В диапазоне от 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, но в целом для поиска минимумов может потребоваться использовать подпрограмму оптимизации.

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

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

См. также

Связанные темы