チートシート

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);

任意の MATLAB® 関数を使用するには、fcn2optimexpr を使用して最適化式に変換します。

例:

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)

さらにできること​