치트시트

Optimization Toolbox를 활용한 문제 기반 최적화

직관적인 구문을 사용해 최적화 문제, 최소제곱 문제 및 비선형 연립방정식을 정의하고 풀 수 있습니다.

1. 문제 정의

문제 기반 워크플로에 따라, 먼저 optimproblem을 사용해 목적 함수, 제약 조건 및 관련 변수를 포함하는 최적화 문제를 만듭니다. 비선형 연립방정식을 풀 때는 eqnproblem을 만들 수 있습니다.

예:

assignmentProb = optimproblem
responseProb = optimproblem
initialStateProb = eqnproblem
2. 변수 정의

optimvar을 사용해 최적화 변수를 만듭니다. 변수의 표시 이름을 지정하고, 선택적으로 차원, 경계값, 유형을 설정할 수 있습니다. 정수 또는 문자열로 인덱싱할 수 있습니다.

예:

x = optimvar("x");
y = optimvar("y");

employees = ["a","b","c"];
tasks = ["t1","t2","t3"];
assign = optimvar("assign",employees,tasks,"LowerBound",0,"UpperBound",1,"Type","integer")
3. 목적 함수, 제약 조건 및 방정식에 사용할 표현식 정의

지원되는 연산을 사용해 OptimizationExpression을 직접 지정합니다.

예:

response = -3*(y - x.^3 - x).^2 - (x - 4/3).^2;
totalCost = sum(sum(cost.*assign));
sumByEmployee = sum(assign,2);
sumByTask = sum(assign,1);

또한 fcn2optimexpr을 사용해 MATLAB® 함수를 최적화 표현식으로 변환할 수 있습니다.

예:

a = 4;
xyfcn = @(x,y,a)gamma(y)*a*x.^2;
xyexpr = fcn2optimexpr(xyfcn,x,y,a);
4. 목적 함수 정의

최적화의 방향을 설정합니다. 스칼라 OptimizationExpression을 사용해 목적 함수를 설정합니다.

예:

responseProb.ObjectiveSense = "maximize";
responseProb.Objective = response;

assignmentProb.ObjectiveSense = "minimize";
assignmentProb.Objective = totalCost;
5. 제약 조건 및 방정식 정의

관계 연산자를 사용해 OptimizationExpression을 결합하여 OptimizationConstraint 또는 OptimizationEquality를 지정합니다. 그런 다음 이를 문제를 할당합니다.

예:

responseProb.Constraints.ellipse = x.^2/2 + y.^2/4 <= 1;
responseProb.Constraints.xyconstr = xyexpr >= 1;

assignmentProb.Constraints.oneTaskPerEmployee = sumByTask <= 1;
assignmentProb.Constraints.oneEmployeePerTask = sumByEmployee == 1;

initialStateProb.Equations.eq1 = x*cos(y) + y*sin(x) == 1/2;
initialStateProb.Equations.eq2 = exp(-exp(-(x + y))) == y*(1 + x^2);
6. 검토

show 및 showbounds를 사용해 문제와 변수 경계값을 표시할 수 있습니다. write 및 writebounds를 사용해 이를 파일로 저장할 수 있습니다.

작업 공간 브라우저를 통해 확인할 수 있습니다.

7. 풀이 및 분석

문제를 풀어 비선형 문제의 초기점을 제공합니다. solve 함수는 해 값, 목적 함수 값, 문제 종료 사유 등의 정보를 반환합니다.

예:

x0.x = 0;
x0.y = 0;
[sol,fval,exitflag] = solve(responseProb,x0)

최적화 옵션을 사용해 풉니다.​

예:

o = optimoptions(assignmentProb,"MaxTime",10);
sol = solve(assignmentProb,"Options",o)

추가 작업​