이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
문제 기반 Optimize
라이브 편집기 작업을 사용한 실현가능성
문제 설명
이 예제에서는 다양한 솔버를 이용해 Optimize
라이브 편집기 작업을 사용하여 실현가능점을 구하는 방법을 보여줍니다. 다음 제약 조건을 충족하는 점 를 구하는 문제입니다.
.
제약 조건 함수가 0인 곡선을 그래프로 나타냅니다. 영역의 어느 부분이 실현 가능한지(음의 제약 조건 함수 값) 확인하려면, 제약 조건 함수가 –1/2인 곡선을 플로팅합니다. 이 스크립트의 마지막 부분에 나와 있는 plotobjconstr
함수를 사용합니다.
plotobjconstr
근처에 작은 실현 가능 영역이 있는 것으로 나타납니다. 모든 제약 조건 값이 –1/2 미만인 점이 없으므로 실현 가능한 세트는 작다는 것을 알 수 있습니다.
문제 기반 Optimize
라이브 편집기 작업 사용하기
실현가능점을 구하기 위해 코드 탭 또는 삽입 탭에서 작업 > 최적화를 선택하여 라이브 스크립트에서 Optimize
라이브 편집기 작업을 실행합니다. 문제 기반 작업을 선택합니다.
문제 변수 x
의 하한을 –5, 상한을 5로 설정합니다. 문제 변수 y
의 하한을 -10, 상한을 10으로 설정합니다. 초기점은 x
는 2로, y
는 –2로 설정합니다.
목표를 실현가능성으로 설정합니다.
세 가지 제약 조건을 나타내는 부등식을 만듭니다. 작업은 다음 그림과 일치해야 합니다.
작업 모드를 문제 풀기로 전환합니다. 작업은 fmincon
솔버를 선택하고 다음 해에 도달합니다.
초기점의 영향
다른 초기점에서 시작하면 fmincon
이 해를 구하지 못할 수 있습니다. 다음과 같이 x의 초기점을 –2로 설정합니다.
이번에는 fmincon
이 실현 가능한 해를 구하지 못합니다.
다른 솔버 사용해 보기
해를 구하기 위해 다른 솔버를 사용해 봅니다. 솔버를 ga
로 설정합니다. 이렇게 하려면 문제 종속 솔버 옵션 지정을 확장해서 솔버를 지정합니다. 그리고 솔버 진행 상황을 모니터링하기 위해 플롯 함수를 최대 제약 조건 위반으로 설정합니다.
ga
는 제약 조건 허용오차 내에서 실현가능점을 구합니다.
ga
는 fmincon
과는 다른 해를 구합니다. 해는 약간 실현 불가능합니다. 실현불가능성이 낮은 해를 구하기 위해 제약 조건 허용오차 옵션을 디폴트 값보다 낮은 값으로 설정할 수 있습니다. 또는 다른 솔버를 사용해 보십시오.
surrogateopt
사용해 보기
surrogateopt
솔버를 사용해 봅니다. 플롯 함수를 최대 제약 조건 위반으로 설정합니다. 이 설정은 ga
해에서 자동으로 앞으로 넘어오지 않습니다.
surrogateopt
는 실현 가능한 해에 도달하지만 해에 처음 도달했을 때 중지되지 않습니다. 대신, surrogateopt
는 함수 실행 한도에 도달할 때까지 계속 반복합니다. 반복을 더 일찍 중지하려면, 최대 제약 조건 위반이 1e-6 이하에 도달하자마자 솔버를 중단하는 출력 함수를 지정합니다. 이렇게 하면 솔버가 훨씬 더 일찍 중지됩니다. 이 스크립트의 마지막 부분에 나와 있는 surrout
헬퍼 함수를 사용하십시오. 이 함수를 지정하려면, 이 함수에 대한 함수 핸들을 만듭니다.
outfun = @surrout;
문제 종속 솔버 옵션 지정 > 옵션 > 진단 > 출력 함수 드롭다운 메뉴에서 이 함수 핸들을 지정합니다.
이번에는 200회가 아닌 약 30회의 함수 실행 후에 솔버가 중지됩니다. 해가 이전 해와는 약간 다르지만 모두 실현 가능한 해입니다.
결론
문제 기반 Optimize
라이브 편집기 작업을 통해 fmincon
과 surrogateopt
와 같이 다른 구문을 가진 솔버를 비롯해 다양한 솔버를 문제에 사용해 볼 수 있습니다. 작업은 플롯 함수를 설정하고 다른 옵션을 설정하는 데에도 도움이 됩니다.
작업의 최종 상태는 다음과 같이 나타납니다. 다양한 솔버와 옵션을 사용하여 실험해 보십시오.
헬퍼 함수
다음 코드는 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
참고 항목
최적화 | fmincon
| ga
| surrogateopt