Main Content

최적화 솔버 출력 함수

출력 함수란?

출력 함수(Output Function)는 최적화 함수가 알고리즘을 반복할 때마다 호출하는 함수입니다. 일반적으로, 출력 함수를 사용하여 그래픽 출력값을 생성하거나, 알고리즘이 생성하는 데이터의 내역을 기록하거나, 현재 반복에서 데이터를 기반으로 알고리즘을 중지합니다. 출력 함수를 함수 파일, 로컬 함수, 중첩 함수 중 하나로 만들 수 있습니다.

OutputFcn 옵션은 다음과 같은 MATLAB® 최적화 함수에 사용할 수 있습니다.

출력 함수를 만들고 사용하기

다음은 최적화 함수에 의해 생성된 점을 플로팅하는 출력 함수의 간단한 예제입니다.

function stop = outfun(x, optimValues, state)
stop = false;
hold on;
plot(x(1),x(2),'.');
drawnow

다음의 최적화 문제를 풀 때 fminsearch에 의해 생성된 점을 출력 함수를 이용하여 플로팅할 수 있습니다.

minxf(x)=minxex1(4x12+2x22+x1x2+2x2).

이렇게 하려면 다음을 수행하십시오.

  1. 위의 코드를 포함하는 파일을 만든 다음 MATLAB 경로에 있는 폴더에 outfun.m으로 저장합니다.

  2. options 구조체의 Outputfcn 필드 값을 outfun에 대한 함수 핸들로 설정합니다.

    options = optimset('OutputFcn', @outfun);
  3. 다음 명령을 입력합니다.

    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에 의해 생성된 점의 플롯이 다음과 같이 표시됩니다.

    Plot of x(1) vs. x(2).

출력 함수의 구조

출력 함수의 함수 정의 라인은 다음과 같은 형식을 갖습니다.

stop = outfun(x, optimValues, state)

여기서

  • stop은 최적화 루틴이 중지되는지 또는 계속되는지에 따라 truefalse가 되는 플래그입니다. stop 플래그를 참조하십시오.

  • x는 현재 반복에서 알고리즘에 의해 계산된 지점입니다.

  • optimValues는 현재 반복의 데이터를 포함하는 구조체입니다. 이 구조체에 대해서는 optimValues의 필드에 자세히 설명되어 있습니다.

  • state는 알고리즘의 현재 상태입니다. 알고리즘의 상태에 가능한 값이 나열되어 있습니다.

최적화 함수는 매 반복 시 입력 인수의 값을 outfun에 전달합니다.

중첩 출력 함수의 예

출력 함수를 만들고 사용하기의 예제에서는 출력 함수가 반복 간에 데이터를 유지할 필요가 없습니다. 반복 간에 데이터를 저장할 필요가 없는 경우에는, 출력 함수를 함수 파일로 작성하고 명령줄에서 직접 최적화 함수를 호출할 수 있습니다. 그러나, 출력 함수가 반복 간에 데이터를 기록하도록 하려면 다음과 같은 요건을 갖춘 단일 파일을 작성하십시오.

  • 출력 함수를 중첩 함수로 포함. 자세한 내용은 MATLAB 프로그래밍 기초의 중첩 함수 항목을 참조하십시오.

  • 최적화 함수를 호출.

다음 예제에서는 함수 파일에 목적 함수도 로컬 함수로 포함되어 있습니다. 또는 목적 함수를 개별 파일이나 익명 함수로 작성할 수도 있습니다.

중첩 함수는 주변 파일의 변수에 액세스할 수 있습니다. 따라서 이 방법을 사용하면 출력 함수가 반복 간에 변수를 유지할 수 있습니다.

다음 예제에서는 아래의 방정식을 풀 때 출력 함수를 사용하여 fminsearch 반복을 기록합니다.

minxf(x)=minxex1(4x12+2x22+x1x2+2x2).

출력 함수는 일련의 점을 history라고 하는 행렬로 반환합니다.

이 예제를 실행하려면 다음 단계를 수행하십시오.

  1. MATLAB 편집기에서 새 파일을 엽니다.

  2. 다음 코드를 복사하여 파일에 붙여넣습니다.

    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
  3. 파일을 MATLAB 경로에 있는 폴더에 myproblem.m으로 저장합니다.

  4. 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 구조체의 필드가 나와 있습니다.

이 표의 “명령줄에 표시되는 열 제목” 열에는 optionsDisplay 파라미터를 'iter'로 설정하면 표시되는 열 제목이 나열되어 있습니다.

optimValues 필드(optimValues.field)

설명

명령줄에 표시되는 열 제목

funccount

함수 실행 누적 횟수

Func-count

fval

현재 점에서의 함수 값

min f(x)

iteration

반복 횟수 — 0부터 시작

Iteration

procedure

프로시저 메시지

Procedure

알고리즘의 상태

다음 표에는 state가 취할 수 있는 값이 나와 있습니다.

상태

설명

'init'

알고리즘이 첫 번째 반복 이전의 초기 상태에 있습니다.

'interrupt'

알고리즘이 반복을 수행하고 있습니다. 이 상태에서, 출력 함수는 최적화의 현재 반복을 중단할 수 있습니다. 계산의 효율성을 향상시키기 위해 출력 함수가 반복을 중단하도록 할 수 있습니다. state가 'interrupt'로 설정된 경우의 xoptimValues의 값은 state'iter'로 설정된 경우에서의 출력 함수의 마지막 호출 값과 동일합니다.

'iter'

알고리즘의 반복 작업이 끝에 도달했습니다.

'done'

알고리즘이 마지막 반복 이후의 최종 상태에 있습니다.

다음 코드는 출력 함수가 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 플래그

출력 인수 stoptrue 또는 false를 나타내는 플래그입니다. 이 플래그는 최적화를 중단할지(true) 또는 계속할지(false) 여부를 최적화 함수에 알립니다. 다음 예제에서는 stop 플래그를 사용하는 일반적인 방법을 보여줍니다.

optimValues의 데이터를 기반으로 최적화 중지하기

출력 함수는 optimValues의 현재 데이터에 따라 임의 반복에서 최적화를 중지할 수 있습니다. 예를 들어, 다음 코드는 목적 함수 값이 5보다 작은 경우 stoptrue로 설정합니다.

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 구조체 hObjectoptimstop 필드에 값 true를 저장한다고 가정합니다.

function stop = myoutput(x, optimValues, state)
stop = false;
% Check if user has requested to stop the optimization.
stop = getappdata(hObject,'optimstop');

관련 항목