Main Content

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

제약 조건이 있는 비선형 문제 풀기, 솔버 기반

일반적인 최적화 문제

이 예제에서는 Optimization Toolbox™ 솔버를 사용하여 제약 조건이 있는 비선형 문제를 푸는 방법을 보여줍니다. 이 예제에서는 목적 함수를 생성하고, 제약 조건을 생성하며, 문제를 풀고, 결과를 검토하는 일반적인 워크플로를 설명합니다.

이 예제에서는 문제 풀이를 위한 두 가지 접근법을 제공합니다. 이 중 한 가지에서는 최적화 라이브 편집기 작업을 사용하는데, 이는 시각적인 접근법입니다. 다른 접근법에서는 MATLAB® 명령줄을 사용하는데, 이는 텍스트 기반 접근법입니다. 문제 기반 접근법을 사용해 이 유형의 문제를 풀 수도 있습니다. 제약 조건이 있는 비선형 문제 풀기, 문제 기반 항목을 참조하십시오.

문제 정식화: 로젠브록 함수(Rosenbrock Function)

아래의 로젠브록 함수

f(x)=100(x2x12)2+(1x1)2,

이 주어져 있을 때 단위 원판, 즉 원점을 중심으로 하고 반지름이 1인 원 안의 영역에서 이 로젠브록 함수를 최소화하는 문제입니다. 즉, 집합 x12+x221의 영역에서 함수 f(x)를 최소화하는 x를 구한다는 의미입니다. 이 문제는 비선형 제약 조건이 있는 비선형 함수를 최소화하는 문제입니다.

참고

로젠브록 함수는 최적화 분야에서 일반적인 테스트 함수입니다. 이 함수는 점 [1,1]에서 고유한 최솟값 0을 가집니다. 이 함수는 깊게 굽은 밸리 내에서 얕은 최솟값을 갖기 때문에 일부 알고리즘에서는 최솟값을 구하는 것이 쉽지 않을 수 있습니다. 이 문제의 해는 점 [1,1]에 있지 않는데 그 이유는 이 점은 제약 조건을 충족하지 않기 때문입니다.

다음 Figure는 단위 원판에서 로젠브록 함수의 두 가지 보기를 보여줍니다. 세로 축은 로그 스케일링되었습니다. 즉, 이 플롯은 log(1+f(x))를 보여줍니다. 등고선은 곡면 플롯 아래에 있습니다.

로젠브록 함수, 로그 스케일링됨: 두 가지 보기

 Figure 생성에 사용된 코드

함수 f(x)목적 함수라고 합니다. 목적 함수는 최소화하고자 하는 함수입니다. 부등식 x12+x221제약 조건이라고 합니다. 제약 조건은 솔버가 최솟값을 탐색하는 대상이 되는 x의 집합을 제한합니다. 제약 조건은 부등식 또는 등식으로 지정되는데 사용자는 제약 조건의 수를 원하는 만큼 지정할 수 있습니다.

모든 Optimization Toolbox 최적화 함수는 목적 함수를 최소화합니다. 함수 f를 최대화하려면 –f를 최소화하는 최적화 루틴을 적용하십시오. 최대화에 대한 자세한 내용은 목적 함수 최대화하기 항목을 참조하십시오.

최적화 라이브 편집기 작업을 사용하여 문제를 정의하고 풀기

최적화 라이브 편집기 작업에서는 시각적 접근법을 사용해 문제를 설정하고 풀 수 있습니다.

  1. 탭의 파일 섹션에서 새 라이브 스크립트 버튼을 클릭하여 새 라이브 스크립트를 만듭니다.

    New Live Script button

  2. 최적화 라이브 편집기 작업을 삽입합니다. 삽입 탭을 클릭한 다음 코드 섹션에서 작업 > 최적화를 선택합니다.

    Optimize Live Editor task

  3. 작업의 문제 유형 지정 섹션에서 목적 함수 > 비선형제약 조건 > 비선형을 선택합니다. 이 작업에서는 솔버 fmincon - 제약 조건이 있는 비선형 최소화를 선택합니다.

  4. 로젠브록 함수를 목적 함수로 포함합니다. 작업의 문제 데이터 선택 섹션에서 목적 함수 > 로컬 함수를 선택한 다음, 새로 만들기... 버튼을 클릭합니다. 작업 아래의 섹션에 새 로컬 함수가 나타납니다.

    function f = objectiveFcn(optimInput)
    % Example:
    % Minimize Rosenbrock's function
    % f = 100*(y - x^2)^2 + (1 - x)^2
    
    % Edit the lines below with your calculation
    x = optimInput(1);
    y = optimInput(2);
    f = 100*(y - x^2)^2 + (1 - x)^2;
    end

    이 함수는 로젠브록 함수를 구현합니다.

  5. 작업의 문제 데이터 선택 섹션에서 목적 함수 > objectiveFcn을 선택합니다.

  6. 초기점 x0 = [0;0]을 MATLAB 작업 공간에 배치합니다. 작업을 클릭한 다음에 삽입 탭에서 섹션 나누기 버튼을 클릭하여 최적화 작업 위에 새 섹션을 삽입합니다. 작업 위의 새 섹션에서 초기점에 대한 다음 코드를 입력합니다.

    x0 = [0;0];
  7. Ctrl+Enter를 눌러 섹션을 실행합니다. 그러면 x0이 작업 공간에 배치됩니다.

  8. 작업의 문제 데이터 선택 섹션에서 초기점(x0) > x0을 선택합니다.

    Objective function and x0

  9. 문제 데이터 선택 섹션에서 제약 조건 > 비선형 > 로컬 함수를 선택한 후 새로 만들기... 버튼을 클릭합니다. 이전 로컬 함수 아래에 새 로컬 함수가 나타납니다.

  10. 다음과 같이 새 로컬 함수를 편집합니다.

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
    end
  11. 문제 데이터 선택 섹션에서 unitdisk를 제약 조건 함수로 선택합니다.

    Problem data: objective, initial point, nonlinear constraint

  12. 솔버 진행 상황을 모니터링하려면 작업의 진행률 표시 섹션에서 텍스트 표시 > 각 반복 시를 선택합니다. 또한 플롯에 대해 목적 함수 값 및 실현가능성을 선택합니다.

    Iterative display and Objective value and feasibility plot function

  13. 솔버를 실행하려면 작업 창 오른쪽 상단에 있는 옵션 버튼을 클릭하고 섹션 실행을 선택합니다. 플롯은 별개의 Figure 창과 출력 영역에 표시됩니다.

    Function values generally decrease as iterations proceed

    출력 영역에는 결과 해석하기에 설명된, 반복 과정을 나타낸 표가 표시됩니다.

  14. 해를 찾으려면 작업의 맨 위를 보십시오.

    solution, objectiveValue are returned from fmincon

    솔버가 변수 solutionobjectiveValue를 작업 공간에 배치합니다. 작업 아래에 새 섹션 나누기를 삽입하고 다음 라인을 입력하여 이들 변수의 값을 봅니다.

    disp(solution); disp(objectiveValue)

  15. Ctrl+Enter를 눌러 섹션을 실행합니다.

    solution = [0.7864,0.6177]. objectiveValue = 0.0457.

    결과를 얻기 위한 fmincon 절차를 이해하려면 결과 해석하기 항목을 참조하십시오.

  16. 문제 풀이를 위해 최적화에서 생성되는 코드를 표시하려면, 작업 창 오른쪽 상단에 있는 옵션 버튼 을 클릭하고 컨트롤과 코드를 선택합니다.

    Controls and Code

    작업 맨 아래에 다음 코드가 표시됩니다.

    % Set nondefault solver options
    options = optimoptions('fmincon','Display','iter','PlotFcn',...
        'optimplotfvalconstr');
    
    % Solve
    [solution,objectiveValue] = fmincon(@objectiveFcn,x0,[],[],[],[],[],[],...
        @unitdisk,options);

    다음에 설명된 것처럼, 이 코드는 명령줄에서 문제를 푸는 데 사용할 수 있는 코드입니다.

명령줄에서 문제를 정의하고 풀기

명령줄에서 최적화 문제를 푸는 첫 단계는 솔버를 선택하는 일입니다. 최적화 의사 결정표 항목을 참조하십시오. 비선형 목적 함수와 비선형 제약 조건을 포함한 문제를 풀 때는 일반적으로 fmincon 솔버를 사용합니다.

fmincon 함수 도움말 페이지를 참조하십시오. 이 솔버의 구문은 다음과 같습니다.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

funnonlcon 입력값은 각각 목적 함수와 비선형 제약 조건 함수를 나타냅니다.

다음과 같이 문제를 표현하십시오.

  1. MATLAB 언어에서 목적 함수를 함수 파일 또는 익명 함수로 정의합니다. 이 예제에서는 함수 파일을 사용합니다.

  2. 개별 파일 또는 익명 함수로 제약 조건을 정의합니다.

함수 파일은 MATLAB 명령을 포함하는 텍스트 파일이며 .m 확장자를 가집니다. 아무 텍스트 편집기에서 함수 파일을 생성하거나 이 예제와 같이 내장된 MATLAB 편집기를 사용할 수 있습니다.

  1. 명령줄에서 다음을 입력합니다.

    edit rosenbrock
  2. MATLAB 편집기에서 다음을 입력합니다.

    %% ROSENBROCK(x) expects a two-column matrix and returns a column vector
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock(x)
    
    f = 100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2;

    참고

    rosenbrock은 여러 점의 값을 한 번에 계산할 수 있는 벡터화된 함수입니다. 벡터화 항목을 참조하십시오. 벡터화된 함수는 플로팅하는 데 가장 적합합니다. 벡터화되지 않은 함수를 원하면 다음을 입력하십시오.

    %% ROSENBROCK1(x) expects a two-element vector and returns a scalar
    % The output is the Rosenbrock function, which has a minimum at
    % (1,1) of value 0, and is strictly positive everywhere else.
    
    function f = rosenbrock1(x)
    
    f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
  3. 파일 이름을 rosenbrock.m으로 지정하여 저장합니다.

제약 조건 함수는 c(x) ≤ 0 또는 ceq(x) = 0. 형식을 갖습니다. 제약 조건 x12+x221은 솔버가 취급하는 형식이 아닙니다. 올바른 구문을 지정하려면 제약 조건을 x12+x2210으로 다시 작성하십시오.

비선형 제약 조건 구문은 등식 제약 조건과 부등식 제약 조건을 모두 반환합니다. 이 예제는 부등식 제약 조건만 포함하므로 빈 배열 []을 등식 제약 조건 함수 ceq로 전달해야 합니다.

이러한 고려 사항을 염두에 두고 비선형 제약 조건을 정의하는 함수 파일을 작성하십시오.

  1. 다음 코드를 포함하는 unitdisk.m이라는 이름의 파일을 만듭니다.

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
  2. 파일 unitdisk.m을 저장합니다.

목적 함수와 제약 조건 함수를 정의했으므로, fmincon의 다른 입력값도 생성하십시오.

  1. 'optimplotfvalconstr' 플롯 함수를 사용하고 반복 과정 표시를 반환하기 위한 fmincon의 옵션을 만듭니다.

    options = optimoptions('fmincon',...
        'PlotFcn','optimplotfvalconstr',...
        'Display','iter');
  2. 초기점을 만듭니다.

    x0 = [0 0];
  3. 이 예제에 사용되지 않는 제약 조건에 대해서는 빈 요소를 만듭니다.

    A = [];
    b = [];
    Aeq = [];
    beq = [];
    lb = [];
    ub = [];

fmincon을 호출하여 문제를 풉니다.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       3    1.000000e+00    0.000e+00    2.000e+00
    1      13    7.753537e-01    0.000e+00    6.250e+00    1.768e-01
    2      18    6.519648e-01    0.000e+00    9.048e+00    1.679e-01
    3      21    5.543209e-01    0.000e+00    8.033e+00    1.203e-01
    4      24    2.985207e-01    0.000e+00    1.790e+00    9.328e-02
    5      27    2.653799e-01    0.000e+00    2.788e+00    5.723e-02
    6      30    1.897216e-01    0.000e+00    2.311e+00    1.147e-01
    7      33    1.513701e-01    0.000e+00    9.706e-01    5.764e-02
    8      36    1.153330e-01    0.000e+00    1.127e+00    8.169e-02
    9      39    1.198058e-01    0.000e+00    1.000e-01    1.522e-02
   10      42    8.910052e-02    0.000e+00    8.378e-01    8.301e-02
   11      45    6.771960e-02    0.000e+00    1.365e+00    7.149e-02
   12      48    6.437664e-02    0.000e+00    1.146e-01    5.701e-03
   13      51    6.329037e-02    0.000e+00    1.883e-02    3.774e-03
   14      54    5.161934e-02    0.000e+00    3.016e-01    4.464e-02
   15      57    4.964194e-02    0.000e+00    7.913e-02    7.894e-03
   16      60    4.955404e-02    0.000e+00    5.462e-03    4.185e-04
   17      63    4.954839e-02    0.000e+00    3.993e-03    2.208e-05
   18      66    4.658289e-02    0.000e+00    1.318e-02    1.255e-02
   19      69    4.647011e-02    0.000e+00    8.006e-04    4.940e-04
   20      72    4.569141e-02    0.000e+00    3.136e-03    3.379e-03
   21      75    4.568281e-02    0.000e+00    6.440e-05    3.974e-05
   22      78    4.568281e-02    0.000e+00    8.000e-06    1.084e-07
   23      81    4.567641e-02    0.000e+00    1.601e-06    2.793e-05
   24      84    4.567482e-02    0.000e+00    2.023e-08    6.916e-06

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

x =

    0.7864    0.6177


fval =

    0.0457

Function values generally decrease as iterations proceed

이 종료 메시지는 목적 함수의 도함수가 제약 조건으로 허용되는 방향에서 거의 0에 가까우므로 제약 조건이 있는 최적값 탐색이 종료되었으며 제약 조건이 필요한 정확도를 충족함을 알려줍니다. 이 메시지는 메시지에서 사용된 용어에 대한 자세한 정보를 제공하는 여러 링크를 담고 있습니다. 이러한 링크에 대한 자세한 내용은 향상된 종료 메시지 항목을 참조하십시오.

결과 해석하기

라이브 편집기 작업 출력 영역과 MATLAB 명령 창에 모두 표시되는 반복 과정을 나타낸 표는 MATLAB이 단위 원판에서 로젠브록 함수의 최솟값을 탐색한 방식을 보여줍니다. 표시되는 표는 툴박스 버전과 연산 플랫폼에 따라 다를 수 있습니다. 다음 설명은 이 예제에 표시된 표에 적용됩니다.

  • Iter라는 레이블이 지정된 첫 번째 열은 0에서 24까지의 반복 횟수입니다. fmincon은 수렴하기까지 24회의 반복을 거쳤습니다.

  • F-count라는 레이블이 지정된 두 번째 열은 로젠브록 함수가 실행된 누적 횟수를 보고합니다. 마지막 행은 F-count가 84임을 보여주며, 이는 fmincon이 최솟값을 구하는 과정에서 로젠브록 함수를 84회 실행했음을 나타냅니다.

  • f(x)라는 레이블이 지정된 세 번째 열은 목적 함수의 값을 표시합니다. 최종 값 4.567482e-2최적화 실행 시 보고된 최솟값이며 명령 창의 종료 메시지 끝에 있습니다.

  • 네 번째 열 Feasibility는 모든 반복에 대해 0입니다. 이 열은 제약 조건이 양수인 각 반복에서 제약 조건 함수 unitdisk의 값을 보여줍니다. unitdisk의 값이 모든 반복에서 음수였기 때문에 매 반복마다 제약 조건을 충족했습니다.

반복 테이블의 다른 열에 대해서는 반복 과정 표시에 설명되어 있습니다.

참고 항목

|

관련 항목