이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
제약 조건이 있는 비선형 문제 풀기, 문제 기반
일반적인 최적화 문제
이 예제에서는 문제 기반 접근법을 사용하여 제약 조건이 있는 비선형 최적화 문제를 푸는 방법을 보여줍니다. 이 예제에서는 목적 함수를 생성하고, 제약 조건을 생성하고, 문제를 풀고, 결과를 검토하는 일반적인 워크플로를 설명합니다.
참고:
목적 함수 또는 비선형 제약 조건이 기본 함수로 구성되지 않은 경우 fcn2optimexpr
을 사용하여 비선형 함수를 최적화 표현식으로 변환해야 합니다. 이 예제의 마지막 부분에 있는 fcn2optimexpr을 사용한 다른 정식화 방법 또는 Convert Nonlinear Function to Optimization Expression 항목을 참조하십시오.
이 문제에 대한 솔버 기반 접근법은 최적화 라이브 편집기 작업 또는 솔버를 사용한, 제약 조건이 있는 비선형 문제 항목을 참조하십시오.
문제 정식화: 로젠브록 함수(Rosenbrock Function)
다음과 같이 로젠브록 함수에 1을 더한 로그를 최소화하는 문제를 살펴보겠습니다.
이 문제는 단위 원판, 즉 원점을 중심으로 하고 반지름이 1인 원 안의 영역에서 로젠브록 함수를 최소화합니다. 즉, 집합 의 영역에서 함수 를 최소화하는 를 구한다는 의미입니다. 이 문제는 비선형 제약 조건이 적용되는 비선형 함수를 최소화하는 문제입니다.
로젠브록 함수는 최적화 분야에서 일반적인 테스트 함수입니다. 이 함수는 점 [1,1]
에서 고유한 최솟값 0을 가집니다. 따라서 는 동일한 점에서 동일한 최솟값을 가집니다. 이 함수는 깊게 굽은 밸리 내에서 얕은 최솟값을 갖기 때문에 일부 알고리즘에서는 최솟값을 구하는 것이 쉽지 않을 수 있습니다. 이 문제의 해는 점 [1,1]
에 있지 않는데 그 이유는 이 점은 제약 조건을 충족하지 않기 때문입니다.
다음 Figure는 단위 원판에서 로젠브록 함수 함수의 두 가지 보기를 보여줍니다. 등고선은 곡면 플롯 아래에 있습니다.
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차원 점에서 한 번에 함수 를 계산합니다. 이 벡터화는 함수 플로팅의 속도를 높이며, 다른 맥락에서도 여러 점에서 함수의 계산 속도를 높이는 데 유용할 수 있습니다.
함수 는 목적 함수라고 합니다. 목적 함수는 최소화하고자 하는 함수입니다. 부등식 은 제약 조건이라고 합니다. 제약 조건은 솔버가 최솟값을 탐색하는 대상이 되는 의 집합을 제한합니다. 제약 조건은 부등식 또는 방정식으로 지정되는데 사용자는 제약 조건의 수를 원하는 만큼 지정할 수 있습니다.
최적화 변수를 사용하여 문제 정의하기
문제 기반 접근법을 통한 최적화에서는 최적화 변수를 사용하여 목적 함수와 제약 조건을 정의합니다. 최적화 변수를 사용하여 표현식을 만드는 방법에는 다음 두 가지가 있습니다.
다항식 함수 또는 삼각 함수와 같은 기본 함수의 경우, 변수에 직접 표현식을 작성합니다.
다른 유형의 함수의 경우,
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
를 호출하십시오. 문제에는 초기점이 필요합니다. 초기점이란 최적화 변수의 초기값을 제공하는 구조체입니다. 값 [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 항목을 참조하십시오.