Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

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

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

이 예제에 나와 있는 두 개의 목적 함수는 볼록 함수 1+x2을 이동하여 크기를 조정한 것입니다. 목적 함수 코드는 이 예제의 마지막 부분에 있는 simple_mult 헬퍼 함수에 나와 있습니다.

두 목적 함수 모두 영역 x0에서 감소하고 영역 x1에서 증가합니다. 0과 1 사이에서 f1(x)는 증가하고 f2(x)는 감소하므로 상충 영역이 생깁니다. -1/2~3/2 범위의 x에 대해 두 목적 함수를 플로팅합니다.

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 object. The axes object with xlabel x Tradeoff region between the green lines contains 7 objects of type line, text. One or more of the lines displays its values using only markers 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];

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

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 object. The axes object with xlabel f indexOf 1 baseline f_1, ylabel f indexOf 2 baseline f_2 contains a line object which displays its values using only markers.

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

헬퍼 함수

다음 코드는 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

참고 항목

관련 항목