Main Content

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

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

일반적인 최적화 문제

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

참고:

목적 함수 또는 비선형 제약 조건이 기본 함수로 구성되지 않은 경우 fcn2optimexpr을 사용하여 비선형 함수를 최적화 표현식으로 변환해야 합니다. 이 예제의 마지막 부분에 있는 fcn2optimexpr을 사용한 다른 정식화 방법 또는 Convert Nonlinear Function to Optimization Expression 항목을 참조하십시오.

이 문제에 대한 솔버 기반 접근법은 최적화 라이브 편집기 작업 또는 솔버를 사용한, 제약 조건이 있는 비선형 문제 항목을 참조하십시오.

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

다음과 같이 로젠브록 함수에 1을 더한 로그를 최소화하는 문제를 살펴보겠습니다.

f(x)=log(1+100(x2-x12)2+(1-x1)2),

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

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

다음 Figure는 단위 원판에서 로젠브록 함수 f(x) 함수의 두 가지 보기를 보여줍니다. 등고선은 곡면 플롯 아래에 있습니다.

rosenbrock = @(x)log(1 + 100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2); % Vectorized function

figure1 = figure('Position',[1 200 600 300]);
colormap('gray');
axis square;
R = 0:.002:1;
TH = 2*pi*(0:.002:1); 
X = R'*cos(TH);
Y = R'*sin(TH); 
Z = rosenbrock([X(:),Y(:)]); % Z = f(x)
Z = reshape(Z,size(X));

% Create subplot
subplot1 = subplot(1,2,1,'Parent',figure1);
view([124 34]);
grid('on');
hold on;

% Create surface
surf(X,Y,Z,'Parent',subplot1,'LineStyle','none');

% Create contour
contour(X,Y,Z,'Parent',subplot1);

% Create subplot
subplot2 = subplot(1,2,2,'Parent',figure1);
view([234 34]);
grid('on');
hold on

% Create surface
surf(X,Y,Z,'Parent',subplot2,'LineStyle','none');

% Create contour
contour(X,Y,Z,'Parent',subplot2);

% Create textarrow
annotation(figure1,'textarrow',[0.4 0.31],...
    [0.055 0.16],...
    'String',{'Minimum at (0.7864,0.6177)'});

% Create arrow
annotation(figure1,'arrow',[0.59 0.62],...
    [0.065 0.34]);

title("Rosenbrock's Function: Two Views")

hold off

rosenbrock 함수 핸들은 임의 개수의 2차원 점에서 한 번에 함수 f(x)를 계산합니다. 이 벡터화는 함수 플로팅의 속도를 높이며, 다른 맥락에서도 여러 점에서 함수의 계산 속도를 높이는 데 유용할 수 있습니다.

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

최적화 변수를 사용하여 문제 정의하기

문제 기반 접근법을 통한 최적화에서는 최적화 변수를 사용하여 목적 함수와 제약 조건을 정의합니다. 최적화 변수를 사용하여 표현식을 만드는 방법에는 다음 두 가지가 있습니다.

  • 다항식 함수 또는 삼각 함수와 같은 기본 함수의 경우, 변수에 직접 표현식을 작성합니다.

  • 다른 유형의 함수의 경우, fcn2optimexpr을 사용하여 함수를 최적화 표현식으로 변환합니다. 이 예제의 마지막 부분에 있는 fcn2optimexpr을 사용한 다른 정식화 방법을 참조하십시오.

이 문제에서는 목적 함수와 비선형 제약 조건이 모두 기본 함수이므로 최적화 변수를 사용하여 직접 표현식을 작성할 수 있습니다. 2차원 최적화 변수 'x'를 만듭니다.

x = optimvar('x',1,2);

목적 함수를 최적화 변수의 표현식으로 만듭니다.

obj = log(1 + 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2);

obj를 목적 함수로 갖는 최적화 문제 prob를 만듭니다.

prob = optimproblem('Objective',obj);

비선형 제약 조건을 최적화 변수의 다항식으로 만듭니다.

nlcons = x(1)^2 + x(2)^2 <= 1;

문제에 비선형 제약 조건을 포함시킵니다.

prob.Constraints.circlecons = nlcons;

문제를 검토합니다.

show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       log(((1 + (100 .* (x(2) - x(1).^2).^2)) + (1 - x(1)).^2))


	subject to circlecons:
       (x(1).^2 + x(2).^2) <= 1
     

문제 풀기

최적화 문제를 풀려면 solve를 호출하십시오. 문제에는 초기점이 필요합니다. 초기점이란 최적화 변수의 초기값을 제공하는 구조체입니다. x[0 0]을 갖는 초기점 구조체 x0을 만듭니다.

x0.x = [0 0];
[sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fmincon.

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.
sol = struct with fields:
    x: [0.7864 0.6177]

fval = 0.0447
exitflag = 
    OptimalSolution

output = struct with fields:
              iterations: 23
               funcCount: 44
         constrviolation: 0
                stepsize: 7.7862e-09
               algorithm: 'interior-point'
           firstorderopt: 8.0000e-08
            cgiterations: 8
                 message: 'Local minimum found that satisfies the constraints....'
            bestfeasible: [1x1 struct]
     objectivederivative: "reverse-AD"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

해 검토하기

해의 세부 정보에 exitflag = OptimalSolution이라고 표시되어 있습니다. 이 종료 플래그는 해가 국소 최적해임을 나타냅니다. 더 나은 해를 구하기 위한 자세한 내용은 솔버가 성공한 경우 항목을 참조하십시오.

종료 메시지는 해가 제약 조건을 충족함을 나타냅니다. 해가 실현 가능하다는 것을 몇 가지 방법으로 확인할 수 있습니다.

  • output 구조체의 constrviolation 필드에 보고된 실현불가능성을 확인합니다.

infeas = output.constrviolation
infeas = 0

실현불가능성이 0이면 해가 실현 가능한 것입니다.

  • 이 해에서의 실현불가능성을 계산합니다.

infeas = infeasibility(nlcons,sol)
infeas = 0

마찬가지로 실현불가능성이 0이면 해가 실현 가능한 것입니다.

  • x의 노름을 계산하여 1보다 작거나 같은지 확인합니다.

nx = norm(sol.x)
nx = 1.0000

output 구조체는 반복 횟수(23), 솔버(fmincon), 함수 계산 횟수(44) 등의 풀이 과정에 대한 자세한 내용을 제공합니다. 이러한 통계량에 대한 자세한 내용은 허용오차와 중지 기준 항목을 참조하십시오.

fcn2optimexpr을 사용한 다른 정식화 방법

보다 복잡한 표현식의 경우, 목적 함수 또는 제약 조건 함수에 대해 함수 파일을 작성한 후 fcn2optimexpr을 사용하여 이를 최적화 표현식으로 변환하십시오. 예를 들어, 비선형 제약 조건 함수의 기저는 disk.m 파일에 있습니다.

type disk
function radsqr = disk(x) 

radsqr = x(1)^2 + x(2)^2;

이 함수 파일을 최적화 표현식으로 변환합니다.

radsqexpr = fcn2optimexpr(@disk,x);

이에 더해, 플로팅 루틴의 시작 부분에 정의된 rosenbrock 함수 핸들을 최적화 표현식으로 변환할 수도 있습니다.

rosenexpr = fcn2optimexpr(rosenbrock,x);

이와 같이 변환된 최적화 표현식을 사용하여 최적화 문제를 만듭니다.

convprob = optimproblem('Objective',rosenexpr,'Constraints',radsqexpr <= 1);

새 문제를 표시합니다.

show(convprob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       log(((1 + (100 .* (x(2) - x(1).^2).^2)) + (1 - x(1)).^2))


	subject to :
       (x(1).^2 + x(2).^2) <= 1
     

새 문제를 풉니다. 해는 기존과 본질적으로 동일합니다.

[sol,fval,exitflag,output] = solve(convprob,x0)
Solving problem using fmincon.

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.
sol = struct with fields:
    x: [0.7864 0.6177]

fval = 0.0447
exitflag = 
    OptimalSolution

output = struct with fields:
              iterations: 23
               funcCount: 44
         constrviolation: 0
                stepsize: 7.7862e-09
               algorithm: 'interior-point'
           firstorderopt: 8.0000e-08
            cgiterations: 8
                 message: 'Local minimum found that satisfies the constraints....'
            bestfeasible: [1x1 struct]
     objectivederivative: "reverse-AD"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

지원되는 함수 목록은 Supported Operations for Optimization Variables and Expressions 항목을 참조하십시오.

관련 항목