Main Content

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

문제 기반 Optimize 라이브 편집기 작업을 사용한 실현가능성

문제 설명

이 예제에서는 다양한 솔버를 이용해 Optimize 라이브 편집기 작업을 사용하여 실현가능점을 구하는 방법을 보여줍니다. 다음 제약 조건을 충족하는 점 [x,y]를 구하는 문제입니다.

(y+x2)2+0.1y21

yexp(-x)-3

yx-4.

제약 조건 함수가 0인 곡선을 그래프로 나타냅니다. 영역의 어느 부분이 실현 가능한지(음의 제약 조건 함수 값) 확인하려면, 제약 조건 함수가 –1/2인 곡선을 플로팅합니다. 이 스크립트의 마지막 부분에 나와 있는 plotobjconstr 함수를 사용합니다.

plotobjconstr

Figure contains an axes object. The axes object contains 3 objects of type contour.

x=1.75,y=-3 근처에 작은 실현 가능 영역이 있는 것으로 나타납니다. 모든 제약 조건 값이 –1/2 미만인 점이 없으므로 실현 가능한 세트는 작다는 것을 알 수 있습니다.

문제 기반 Optimize 라이브 편집기 작업 사용하기

실현가능점을 구하기 위해 코드 탭 또는 삽입 탭에서 작업 > 최적화를 선택하여 라이브 스크립트에서 Optimize 라이브 편집기 작업을 실행합니다. 문제 기반 작업을 선택합니다.

문제 변수 x의 하한을 –5, 상한을 5로 설정합니다. 문제 변수 y의 하한을 -10, 상한을 10으로 설정합니다. 초기점은 x는 2로, y는 –2로 설정합니다.

목표실현가능성으로 설정합니다.

세 가지 제약 조건을 나타내는 부등식을 만듭니다. 작업은 다음 그림과 일치해야 합니다.

optimizelet_feasible.png

작업 모드를 문제 풀기로 전환합니다. 작업은 fmincon 솔버를 선택하고 다음 해에 도달합니다.

feasibility_sol1.png

초기점의 영향

다른 초기점에서 시작하면 fmincon이 해를 구하지 못할 수 있습니다. 다음과 같이 x의 초기점을 –2로 설정합니다.

feasibility_setup2.png

이번에는 fmincon이 실현 가능한 해를 구하지 못합니다.

feasibility_sol2.png

다른 솔버 사용해 보기

해를 구하기 위해 다른 솔버를 사용해 봅니다. 솔버를 ga로 설정합니다. 이렇게 하려면 문제 종속 솔버 옵션 지정을 확장해서 솔버를 지정합니다. 그리고 솔버 진행 상황을 모니터링하기 위해 플롯 함수를 최대 제약 조건 위반으로 설정합니다.

feasibility_setup3.png

ga는 제약 조건 허용오차 내에서 실현가능점을 구합니다.

feasibility_sol3.png

gafmincon과는 다른 해를 구합니다. 해는 약간 실현 불가능합니다. 실현불가능성이 낮은 해를 구하기 위해 제약 조건 허용오차 옵션을 디폴트 값보다 낮은 값으로 설정할 수 있습니다. 또는 다른 솔버를 사용해 보십시오.

surrogateopt 사용해 보기

surrogateopt 솔버를 사용해 봅니다. 플롯 함수를 최대 제약 조건 위반으로 설정합니다. 이 설정은 ga 해에서 자동으로 앞으로 넘어오지 않습니다.

feasibility_sol4.png

surrogateopt는 실현 가능한 해에 도달하지만 해에 처음 도달했을 때 중지되지 않습니다. 대신, surrogateopt는 함수 실행 한도에 도달할 때까지 계속 반복합니다. 반복을 더 일찍 중지하려면, 최대 제약 조건 위반이 1e-6 이하에 도달하자마자 솔버를 중단하는 출력 함수를 지정합니다. 이렇게 하면 솔버가 훨씬 더 일찍 중지됩니다. 이 스크립트의 마지막 부분에 나와 있는 surrout 헬퍼 함수를 사용하십시오. 이 함수를 지정하려면, 이 함수에 대한 함수 핸들을 만듭니다.

outfun = @surrout;

문제 종속 솔버 옵션 지정 > 옵션 > 진단 > 출력 함수 드롭다운 메뉴에서 이 함수 핸들을 지정합니다.

feasibility_setup5.png

feasibility_sol5.png

이번에는 200회가 아닌 약 30회의 함수 실행 후에 솔버가 중지됩니다. 해가 이전 해와는 약간 다르지만 모두 실현 가능한 해입니다.

결론

문제 기반 Optimize 라이브 편집기 작업을 통해 fminconsurrogateopt와 같이 다른 구문을 가진 솔버를 비롯해 다양한 솔버를 문제에 사용해 볼 수 있습니다. 작업은 플롯 함수를 설정하고 다른 옵션을 설정하는 데에도 도움이 됩니다.

작업의 최종 상태는 다음과 같이 나타납니다. 다양한 솔버와 옵션을 사용하여 실험해 보십시오.

Live Task

헬퍼 함수

다음 코드는 plotobjconstr 헬퍼 함수를 생성합니다.

function plotobjconstr
[XX,YY] = meshgrid(-2:0.1:2,-4:0.1:2);
ZZ = objconstr([XX(:),YY(:)]).Ineq;
ZZ = reshape(ZZ,[size(XX),3]);
h = figure;
ax = gca;
contour(ax,XX,YY,ZZ(:,:,1),[-1/2 0],'r','ShowText','on');
hold on
contour(ax,XX,YY,ZZ(:,:,2),[-1/2 0],'k','ShowText','on');
contour(ax,XX,YY,ZZ(:,:,3),[-1/2 0],'b','ShowText','on');
hold off
end

다음 코드는 objconstr 헬퍼 함수를 생성합니다.

function f = objconstr(x)
c(:,1) = (x(:,2) + x(:,1).^2).^2 + 0.1*x(:,2).^2 - 1;
c(:,2) = x(:,2) - exp(-x(:,1)) + 3;
c(:,3) = x(:,2) - x(:,1) + 4;
f.Ineq = c;
end

다음 코드는 surrout 헬퍼 함수를 생성합니다.

function stop = surrout(~,optimValues,~)
stop = false;
if optimValues.constrviolation <= 1e-6 % Tolerance for constraint
    stop = true;
end
end

참고 항목

| | |

관련 항목