Main Content

이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

파레토 경계를 생성하고 플로팅하기

이 예제에서는 fgoalattain을 사용하여 2차원 다중 목적 함수에 대한 파레토 경계를 생성하고 플로팅하는 방법을 보여줍니다.

이 예제에 나와 있는 두 개의 목적 함수는 볼록 함수 1+x2을 이동하여 크기를 조정한 것입니다.

function f = simple_mult(x)

f(:,1) = sqrt(1+x.^2);
f(:,2) = 4 + 2*sqrt(1+(x-1).^2);

두 성분 모두 x가 0보다 작게 감소하거나 1보다 크게 증가함에 따라 증가합니다. 0과 1 사이에서는 f1(x)가 증가하고 f2(x)는 감소하므로 이 부분이 상충(tradeoff) 영역에 해당합니다.

t = linspace(-0.5,1.5);
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'})

파레토 경계를 구하려면 먼저 두 함수의 제약 조건 없는 최솟값을 구해야 합니다. 이 경우에는 f1(x)의 최솟값이 1이고 f2(x)의 최솟값이 6이라는 사실을 직접 조사하여 확인할 수 있지만, 일반적으로는 최적화 루틴을 사용해야 할 수 있습니다.

일반적으로, 다중 목적 함수의 특정 성분을 반환하는 함수를 작성합니다.

function z = pickindex(x,k)
z = simple_mult(x); % evaluate both objectives
z = z(k); % return objective 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];

파레토 경계를 계산하기 위해 0에서 1 사이의 a에 대해 가중 벡터 [a,1–a]를 사용합니다. 가중치를 다양한 값으로 설정하여 목표 달성 문제를 풉니다.

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),'k.');
xlabel('f_1')
ylabel('f_2')

두 목적 함수 사이에 상충이 있는지를 확인할 수 있습니다.

참고 항목

관련 항목