Сгенерируйте и постройте переднюю сторону Парето

В этом примере показано, как сгенерировать и построить переднюю сторону Парето для 2D многоцелевой функции с помощью 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, но в целом вы можете должны быть использовать стандартную программу оптимизации, чтобы найти минимумы.

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

Чтобы вычислить переднюю сторону Парето, возьмите векторы веса [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

Смотрите также

Похожие темы