최적화 솔버 출력 함수
출력 함수란?
출력 함수(Output Function)는 최적화 함수가 알고리즘을 반복할 때마다 호출하는 함수입니다. 일반적으로, 출력 함수를 사용하여 그래픽 출력값을 생성하거나, 알고리즘이 생성하는 데이터의 내역을 기록하거나, 현재 반복에서 데이터를 기반으로 알고리즘을 중지합니다. 출력 함수를 함수 파일, 로컬 함수, 중첩 함수 중 하나로 만들 수 있습니다.
OutputFcn
옵션은 다음과 같은 MATLAB® 최적화 함수에 사용할 수 있습니다.
출력 함수를 만들고 사용하기
다음은 최적화 함수에 의해 생성된 점을 플로팅하는 출력 함수의 간단한 예제입니다.
function stop = outfun(x, optimValues, state) stop = false; hold on; plot(x(1),x(2),'.'); drawnow
다음의 최적화 문제를 풀 때 fminsearch
에 의해 생성된 점을 출력 함수를 이용하여 플로팅할 수 있습니다.
이렇게 하려면 다음을 수행하십시오.
위의 코드를 포함하는 파일을 만든 다음 MATLAB 경로에 있는 폴더에
outfun.m
으로 저장합니다.options
구조체의Outputfcn
필드 값을outfun
에 대한 함수 핸들로 설정합니다.options = optimset('OutputFcn', @outfun);
다음 명령을 입력합니다.
hold on objfun=@(x) exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2)); [x fval] = fminsearch(objfun, [-1 1], options) hold off
그러면 다음 해가 반환되고
x = 0.1290 -0.5323 fval = -0.5689
fminsearch
에 의해 생성된 점의 플롯이 다음과 같이 표시됩니다.
출력 함수의 구조
출력 함수의 함수 정의 라인은 다음과 같은 형식을 갖습니다.
stop = outfun(x, optimValues, state)
여기서
stop
은 최적화 루틴이 중지되는지 또는 계속되는지에 따라true
나false
가 되는 플래그입니다. stop 플래그를 참조하십시오.x
는 현재 반복에서 알고리즘에 의해 계산된 지점입니다.optimValues
는 현재 반복의 데이터를 포함하는 구조체입니다. 이 구조체에 대해서는 optimValues의 필드에 자세히 설명되어 있습니다.state
는 알고리즘의 현재 상태입니다. 알고리즘의 상태에 가능한 값이 나열되어 있습니다.
최적화 함수는 매 반복 시 입력 인수의 값을 outfun
에 전달합니다.
중첩 출력 함수의 예
출력 함수를 만들고 사용하기의 예제에서는 출력 함수가 반복 간에 데이터를 유지할 필요가 없습니다. 반복 간에 데이터를 저장할 필요가 없는 경우에는, 출력 함수를 함수 파일로 작성하고 명령줄에서 직접 최적화 함수를 호출할 수 있습니다. 그러나, 출력 함수가 반복 간에 데이터를 기록하도록 하려면 다음과 같은 요건을 갖춘 단일 파일을 작성하십시오.
출력 함수를 중첩 함수로 포함. 자세한 내용은 MATLAB 프로그래밍 기초의 중첩 함수 항목을 참조하십시오.
최적화 함수를 호출.
다음 예제에서는 함수 파일에 목적 함수도 로컬 함수로 포함되어 있습니다. 또는 목적 함수를 개별 파일이나 익명 함수로 작성할 수도 있습니다.
중첩 함수는 주변 파일의 변수에 액세스할 수 있습니다. 따라서 이 방법을 사용하면 출력 함수가 반복 간에 변수를 유지할 수 있습니다.
다음 예제에서는 아래의 방정식을 풀 때 출력 함수를 사용하여 fminsearch
반복을 기록합니다.
출력 함수는 일련의 점을 history
라고 하는 행렬로 반환합니다.
이 예제를 실행하려면 다음 단계를 수행하십시오.
MATLAB 편집기에서 새 파일을 엽니다.
다음 코드를 복사하여 파일에 붙여넣습니다.
function [x fval history] = myproblem(x0) history = []; options = optimset('OutputFcn', @myoutput); [x fval] = fminsearch(@objfun, x0,options); function stop = myoutput(x,optimvalues,state); stop = false; if isequal(state,'iter') history = [history; x]; end end function z = objfun(x) z = exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2)); end end
파일을 MATLAB 경로에 있는 폴더에
myproblem.m
으로 저장합니다.MATLAB 프롬프트에 다음을 입력합니다.
[x fval history] = myproblem([-1 1]);
함수 fminsearch
는 최적의 점 x
와, x에서의 목적 함수 값 fval
을 반환합니다.
x,fval
x = 0.1290 -0.5323 fval = -0.5689
또한, 출력 함수 myoutput
은 각 반복에서 알고리즘에 의해 생성된 점을 행렬 history
에 저장하여 MATLAB 작업 공간에 반환합니다. history
의 처음 4개 행은 다음과 같습니다.
history(1:4,:)
ans = -1.0000 1.0000 -1.0000 1.0000 -1.0750 0.9000 -1.0125 0.8500
history
의 마지막 행에 있는 점은 최적의 점 x
와 동일합니다.
history(end,:)
ans = 0.1290 -0.5323
objfun(history(end,:))
ans = -0.5689
optimValues의 필드
다음 표에는 최적화 함수 fminbnd
, fminsearch
, fzero
에서 모두 제공하는 optimValues
구조체의 필드가 나와 있습니다.
이 표의 “명령줄에 표시되는 열 제목” 열에는 options
의 Display
파라미터를 'iter'
로 설정하면 표시되는 열 제목이 나열되어 있습니다.
optimValues 필드(optimValues.field) | 설명 | 명령줄에 표시되는 열 제목 |
---|---|---|
| 함수 실행 누적 횟수 |
|
| 현재 점에서의 함수 값 |
|
| 반복 횟수 — |
|
| 프로시저 메시지 |
|
알고리즘의 상태
다음 표에는 state
가 취할 수 있는 값이 나와 있습니다.
상태 | 설명 |
---|---|
| 알고리즘이 첫 번째 반복 이전의 초기 상태에 있습니다. |
| 알고리즘이 반복을 수행하고 있습니다. 이 상태에서, 출력 함수는 최적화의 현재 반복을 중단할 수 있습니다. 계산의 효율성을 향상시키기 위해 출력 함수가 반복을 중단하도록 할 수 있습니다. state가 |
| 알고리즘의 반복 작업이 끝에 도달했습니다. |
| 알고리즘이 마지막 반복 이후의 최종 상태에 있습니다. |
다음 코드는 출력 함수가 state
의 값을 사용하여 현재 반복에서 수행할 작업을 결정하는 방법을 보여줍니다.
switch state case 'init' % Setup for plots or dialog boxes case 'iter' % Make updates to plots or dialog boxes as needed case 'interrupt' % Check conditions to see whether optimization % should quit case 'done' % Cleanup of plots, dialog boxes, or final plot end
stop 플래그
출력 인수 stop
은 true
또는 false
를 나타내는 플래그입니다. 이 플래그는 최적화를 중단할지(true
) 또는 계속할지(false
) 여부를 최적화 함수에 알립니다. 다음 예제에서는 stop
플래그를 사용하는 일반적인 방법을 보여줍니다.
optimValues의 데이터를 기반으로 최적화 중지하기
출력 함수는 optimValues
의 현재 데이터에 따라 임의 반복에서 최적화를 중지할 수 있습니다. 예를 들어, 다음 코드는 목적 함수 값이 5
보다 작은 경우 stop
을 true
로 설정합니다.
function stop = myoutput(x, optimValues, state) stop = false; % Check if objective function is less than 5. if optimValues.fval < 5 stop = true; end
대화 상자 입력값을 기반으로 최적화 중지하기
최적화를 수행하도록 UI를 설계하는 경우(예를 들어 중지 버튼을 사용하여) 출력 함수가 최적화를 중지하도록 할 수 있습니다. 다음 코드는 이 콜백을 수행하는 방법을 보여줍니다. 이 코드는 중지 버튼 콜백이 appdata
에 저장된 handles
구조체 hObject
의 optimstop
필드에 값 true
를 저장한다고 가정합니다.
function stop = myoutput(x, optimValues, state) stop = false; % Check if user has requested to stop the optimization. stop = getappdata(hObject,'optimstop');