문제 기반 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
와 같이 다른 구문을 가진 솔버를 비롯해 다양한 솔버를 문제에 사용해 볼 수 있습니다. 작업은 플롯 함수를 설정하고 다른 옵션을 설정하는 데에도 도움이 됩니다.
작업의 최종 상태는 다음과 같이 나타납니다. 다양한 솔버와 옵션을 사용하여 실험해 보십시오.
Solving problem using surrogateopt.
Optimization stopped by a plot function or output function.
solution = struct with fields:
x: 1.5639
y: -2.8127
reasonSolverStopped = OutputFcnStop
objectiveValue = 0
헬퍼 함수
다음 코드는 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
Copyright 2022–2024 The MathWorks, Inc.
참고 항목
최적화 | fmincon
| ga
| surrogateopt